android------实现手机验证码登录

引言:今天研究了一下我们做的项目的功能。做了关于手机验证码的功能。做的还是比较丑,目前只是实现功能,美化会再后期进行。

正文:我用的时MobTech。前两步操作我就不说了,自己看文档解决,很简单。我主要说说文里没有的(我没找到的)。

配置弄好了就开始写代码了,因为现在是完成功能,所以画面做的比较难看。目前SMSSDK提供两套接口方案,一种是默认的UI集成即可。另一种是不使用他们的UI,直接调用发送和验证接口。所以我用的是第二种。

思路就是:首先写手机号,获取验证码,输入验证码,然后提示登录成功。下图是我的界面设计,每个组件的id通过名字就知道是什么意思。

  • 页面布局.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/editTextPhoneNum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="手机号"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.161"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.11" />

    <Button
        android:id="@+id/buttonCode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="获取验证码"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.914"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.105"
        tools:text="获取验证码" />

    <EditText
        android:id="@+id/editTextCode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="验证码"
        android:importantForAutofill="no"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.161"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.215" />

    <Button
        android:id="@+id/buttonLogin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="登录"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.897"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.21" />

</androidx.constraintlayout.widget.ConstraintLayout>
  • MainActivity.java
    • 首先是获取验证码,如果你没有输入手机号或者手机号不符合规则,会有提示信息。验证码获取不了。
    • 其次是如果手机号符合了第一条内容,则调用java SMSSDK.getVerificationCode(country, phone);来获得手机验证码(请求验证码,其中country表示国家代码,如“86”;phone表示手机号码,如“13800138000”)。
    • 当收到验证码时候输入验证码进行校验,调用java SMSSDK.submitVerificationCode(country, phone, code);来进行校验,对则登录成功,错则登录失败。
package com.example.phonecode;

import android.os.Bundle;
import android.os.CountDownTimer;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import org.json.JSONException;
import org.json.JSONObject;
import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;

public class MainActivity extends AppCompatActivity {
    private Button buttonCode,buttonLogin;
    private EditText editTextPhoneNum,editTextCode;
    private String phoneNum,code;
    private EventHandler eh;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buttonCode = findViewById(R.id.buttonCode);
        buttonLogin = findViewById(R.id.buttonLogin);
        editTextCode = findViewById(R.id.editTextCode);
        editTextPhoneNum = findViewById(R.id.editTextPhoneNum);

         eh = new EventHandler() {
            @Override
            public void afterEvent(int event, int result, Object data) {
                    if (result == SMSSDK.RESULT_COMPLETE){
                        //回调完成
                        if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
                            //提交验证码成功
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
                                }
                            });
                        }else if (event == SMSSDK.EVENT_GET_VOICE_VERIFICATION_CODE){
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this,"语音验证发送",Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                        else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){
                            //获取验证码成功
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this,"验证码已发送",Toast.LENGTH_SHORT).show();
                                }
                            });
                        }else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES){
                            Log.i("test","test");
                        }
                    }else{
                        ((Throwable)data).printStackTrace();
                        Throwable throwable = (Throwable) data;
                        throwable.printStackTrace();
                        Log.i("1234",throwable.toString());
                        try {
                            JSONObject obj = new JSONObject(throwable.getMessage());
                            final String des = obj.optString("detail");
                            if (!TextUtils.isEmpty(des)){
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(MainActivity.this,des,Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }
        };

    //注册一个事件回调监听,用于处理SMSSDK接口请求的结果
        SMSSDK.registerEventHandler(eh);
        buttonCode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                phoneNum = editTextPhoneNum.getText().toString();
                if(!phoneNum.isEmpty()){
                    if(Utils.checkTel(phoneNum)){ //利用正则表达式获取检验手机号
                        // 获取验证码
                        SMSSDK.getVerificationCode("86", phoneNum);
                    }else{
                        Toast.makeText(getApplicationContext(),"请输入有效的手机号",Toast.LENGTH_LONG).show();
                    }
                }else {
                    Toast.makeText(getApplicationContext(),"请输入手机号",Toast.LENGTH_LONG).show();
                    return;
                }
                phoneNum = editTextPhoneNum.getText().toString();
            }
        });
        buttonLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                code = editTextCode.getText().toString();
                if(!code.isEmpty()){
                    //提交验证码
                    SMSSDK.submitVerificationCode("86", phoneNum, code);
                }else{
                    Toast.makeText(getApplicationContext(),"请输入验证码",Toast.LENGTH_LONG).show();
                    return;
                }
            }
        });
    }
    // 使用完EventHandler需注销,否则可能出现内存泄漏
    @Override
    protected void onDestroy() {
        super.onDestroy();
        SMSSDK.unregisterEventHandler(eh);
    }
}

  • 手机号校验
package com.example.phonecode;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Utils {
    /**
     * 正则匹配手机号码:
     */
    public static boolean checkTel(String tel){
        Pattern p = Pattern.compile("^[1][3,4,5,7,8,9][0-9]{9}$");
        Matcher matcher = p.matcher(tel);
        return matcher.matches();
    }
}
  • 选权限说明:将下面的代码添加到AndroidManifest.xml里,如下图
<!-- 可选权限说明-->
<uses-permission
     android:name="android.permission.INTERNET" />
允许应用程序联网(必须)
 <uses-permission
     android:name="android.permission.ACCESS_WIFI_STATE" />
允许访问WiFi网络状态信息(必须)
 <uses-permission
     android:name="android.permission.READ_PHONE_STATE" />
允许读取手机状态(必须)
 <uses-permission
     android:name="android.permission.ACCESS_NETWORK_STATE" />
允许访问网络状态(必须)
 <uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
允许写手机存储(必须)
 <uses-permission
     android:name="android.permission.RECEIVE_SMS" />
GUI自动填充验证码功能(非必须)
 <uses-permission
     android:name="android.permission.READ_SMS" />
从短信中读取验证码接口(非必须)
 <uses-permission
     android:name="android.permission.READ_CONTACTS" />
应用内好友功能(非必须)

运行结果:

  • 手机号为空,提示输入手机号
  • 手机号格式不正确提示
  • 手机号正确输入
  • 验证码输入错误
  • 验证码输入正确

后面两个功能就不实现了,截图时候忘了给手机打马赛克了,读者自己实现吧。有什么不懂得,可以留言,指出。如果有大佬发现问题或者提供更好得方法,请留言,小弟感激不尽。

posted @ 2020-04-08 20:58  littlemelon  阅读(5258)  评论(6编辑  收藏  举报