Mob短信验证码登录(Android)

提示:站在巨人肩膀上的小白,大家可以提出自己的看法。如有侵删;

原文参考链接:

https://blog.csdn.net/qq_52139206/article/details/124552348


前言

  作为小白,我也踩了不少坑。但是我们要学会爬起来,希望本篇文章会对你有所帮助!

目录

前言

一、创建项目

1、通过官网进行注册

2.如何寻找包名和MD5签名

二、使用步骤

1.配置你的MobSDK的设置

2.加入对应的依赖包

3.配置settings.gradle中的设置

4.添加权限

5.MianActivity.java中功能代码的实现:

一、创建项目

1、通过官网进行注册

 官网 https://www.mob.com/

(开发者服务==>短信验证==>创建应用(填写相关信息进行创建应用);

2、 进入界面之后,会出现提示,依次进行点击配置即可;

3、出现下方相关信息(AppKey和AppSecret),在此你要进行寻找包名和MD5签名 

2.如何寻找包名和MD5签名

(1)点击Android左侧的小象,通过点击Tasks==>signingReport; 

若是左侧的小象图标不显示,则点击文件菜单中的大象; 

 (2)包名的查看

法一:

法二: 

 4、然后我们返回首页,点击开发者服务中的SDK下载;之后勾选进行短信验证==>下载;

二、使用步骤

1.配置你的MobSDK的设置

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
        mavenCentral()
        jcenter()
    }
    dependencies {
// 注册MobSDK
        classpath "com.android.tools.build:gradle:7.3.0"//写入自己的版本号即可;
        classpath "com.mob.sdk:MobSDK:+"
    }
}
//plugins {
//    id 'com.android.application' version '7.3.0' apply false
//    id 'com.android.library' version '7.3.0' apply false
//}
task clean(type: Delete) {
    delete rootProject.buildDir
}

 2.加入对应的依赖包

plugins {
    id 'com.android.application'
    // MOB 添加插件
    id 'com.mob.sdk'
}
// 在MobSDK的扩展中注册SMSSDK的相关信息
MobSDK {
    appKey "你申请的密钥"
    appSecret "替换为mob官方申请的appkey对应的appSecret"
    // MOB短信验证
    SMSSDK {}
}
==============
implementation 'io.github.bmob:android-sdk:3.8.13'
implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'com.squareup.okhttp3:okhttp:4.8.1'
implementation 'com.squareup.okio:okio:2.2.2'
implementation 'com.google.code.gson:gson:2.8.5'
// implementation 'com.wenwenwen888:searchbox:1.0.1'
implementation 'com.wenwenwen888:searchbox:1.0.1'
implementation 'com.jakewharton:butterknife:8.8.1'

3.配置settings.gradle中的设置

因为新版中settings.gradle配置中默认设置依赖模式为FAIL_ON_PROJECT_REPOS,导致直接或通过插件直接声明的任何存储库都将触发构建错误,故我们将其替换成;repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)

并在加这个是因为mob会被判定为不安全的协议而无法引入;

maven { allowInsecureProtocol = true //加这个是因为mob会被判定为不安全的协议而无法引入 url "http://mvn.mob.com/android"}

dependencyResolutionManagement {
    //repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)替换成
    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
    repositories {
        google()
        mavenCentral()
        jcenter() // Warning: this repository is going to shut down soon
        maven { url "https://jitpack.io" }
        // 1.添加MobSDK Maven地址
        maven { allowInsecureProtocol = true  //加这个是因为mob会被判定为不安全的协议而无法引入
            url "http://mvn.mob.com/android"}
    }
}

4.添加权限

<!-- 连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取当前wifi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- 读取手机信息权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 读取联系人权限,上传联系人需要用到此权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" /> <!-- 外存储写权限,构建语法需要用到此权限 -->
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    tools:ignore="CoarseFineLocation" /> <!-- 外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 手机定位信息,用来为语义等功能提供定位,提供更精准的服务 -->
<!-- 定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission
    android:name="android.permission.ACCESS_FINE_LOCATION"
    tools:ignore="CoarseFineLocation" /> <!-- 如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />

5.MianActivity.java中功能代码的实现:

package com.example.phone_end;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
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 com.mob.MobSDK;

import java.util.Timer;
import java.util.TimerTask;

import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;

public class MainActivity extends AppCompatActivity {
    //所需申请的权限
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.INTERNET,
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.ACCESS_NETWORK_STATE,
            Manifest.permission.ACCESS_WIFI_STATE,
            Manifest.permission.CHANGE_NETWORK_STATE,
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.CAMERA
    };

    EventHandler eventHandler;
    EditText editTextPhone,editTextNumber;
    Button get_code_id,login_id;
    Timer timer;
    int count = 60;
    @SuppressLint("HandlerLeak")
    Handler handler = new Handler(Looper.getMainLooper()){
        public void handleMessage(Message msg) {
            int tag = msg.what;
            switch (tag){
                case 1:
                    int arg = msg.arg1;
                    if(arg==1){
                        get_code_id.setText("重新获取");//计时结束停止计时把值恢复
                        count = 60;
                        timer.cancel();
                        get_code_id.setEnabled(true);
                    }else{
                        get_code_id.setText(count+"");
                    }
                    break;
                case 2:
                    Toast.makeText(MainActivity.this,"获取短信验证码成功",Toast.LENGTH_LONG).show();
                    break;
                case 3:
                    Log.i("Codr","获取短信验证码失败");
                    Toast.makeText(MainActivity.this,msg.getData().getString("code"),Toast.LENGTH_LONG).show();
                    //Toast.makeText(MainActivity.this,"获取短信验证码失败",Toast.LENGTH_LONG).show();
                    break;
                case 4:
                    Toast.makeText(MainActivity.this,msg.getData().getString("code"),Toast.LENGTH_LONG).show();
                    break;
                default:
                    break;
            }

        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        applypermission();

        MobSDK.submitPolicyGrantResult(true,null);
        init();

    }
    //定义判断权限申请的函数,在onCreat中调用就行
    public void applypermission(){
        if(Build.VERSION.SDK_INT>=23){
            boolean needapply=false;
            for(int i=0;i<PERMISSIONS_STORAGE.length;i++){
                int chechpermission= ContextCompat.checkSelfPermission(getApplicationContext(),
                        PERMISSIONS_STORAGE[i]);
                if(chechpermission!= PackageManager.PERMISSION_GRANTED){
                    needapply=true;
                }
            }
            if(needapply){
                ActivityCompat.requestPermissions(MainActivity.this,PERMISSIONS_STORAGE,1);
            }
        }
    }
    //重载用户是否同意权限的回调函数,进行相应处理
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        for(int i=0;i<grantResults.length;i++){      //检查权限是否获取
            if(grantResults[i]==PackageManager.PERMISSION_GRANTED){
                //同意后的操作
                //Toast.makeText(MainActivity.this, permissions[i]+"已授权",Toast.LENGTH_SHORT).show();//提示
            }
            else {
                //不同意后的操作
                //Toast.makeText(MainActivity.this,permissions[i]+"拒绝授权",Toast.LENGTH_SHORT).show();//提示

            }
        }
    }

    private void init(){
        editTextPhone = findViewById(R.id.editTextPhone);
        editTextNumber = findViewById(R.id.editTextNumber);
        get_code_id = findViewById(R.id.get_code_id);
        get_code_id.setOnClickListener(this::onClick);
        login_id = findViewById(R.id.login_id);
        login_id.setOnClickListener(this::onClick);

        eventHandler = new EventHandler() {
            @Override
            public void afterEvent(int event, int result, Object data) {// TODO 此处为子线程!不可直接处理UI线程!处理后续操作需传到主线程中操作!
                Log.i("返回:",event+" | "+result+" | "+data.toString());
                if (result == SMSSDK.RESULT_COMPLETE) {//成功回调
                    if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {//提交短信、语音验证码成功
                        Bundle bundle = new Bundle();
                        bundle.putString("code","登录成功!");
                        Message message = new Message();
                        message.what = 4;
                        message.setData(bundle);
                        handler.sendMessage(message);
                    } else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
                        Message message = new Message();
                        message.what = 2;
                        handler.sendMessage(message);
                    } else if (event == SMSSDK.EVENT_GET_VOICE_VERIFICATION_CODE) {//获取语音验证码成功
                        Message message = new Message();
                        message.what = 2;
                        handler.sendMessage(message);
                    }
                } else if (result == SMSSDK.RESULT_ERROR) {//失败回调
                    if(event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE){//提交返回
                        Bundle bundle = new Bundle();
                        bundle.putString("code","输入的验证码不正确!");
                        Message message = new Message();
                        message.what = 4;
                        message.setData(bundle);
                        handler.sendMessage(message);
                    }else{
                        Bundle bundle = new Bundle();
                        bundle.putString("code",data.toString());
                        Message message = new Message();
                        message.what = 3;
                        message.setData(bundle);
                        handler.sendMessage(message);
                    }

                } else {//其他失败回调
                    ((Throwable) data).printStackTrace();
                }
            }
        };
        SMSSDK.registerEventHandler(eventHandler); //注册短信回调
    }

    private void onClick(View view) {
        String phone = "";
        String code = "";
        int id = view.getId();
        switch (id){
            case R.id.get_code_id:
                phone = editTextPhone.getText().toString().trim();
                if (!TextUtils.isEmpty(phone)){//倒计时
                    CountdownStart();
                    getVerificationCode("86",phone);
                }else{
                    Toast.makeText(this,"请输入手机号码",Toast.LENGTH_LONG).show();
                }
                break;
            case R.id.login_id:
                phone = editTextPhone.getText().toString().trim();
                code = editTextNumber.getText().toString().trim();
                if (TextUtils.isEmpty(phone)){
                    Toast.makeText(this,"请输入手机号码",Toast.LENGTH_LONG).show();
                }else if (TextUtils.isEmpty(code)){
                    Toast.makeText(this,"请输入验证码",Toast.LENGTH_LONG).show();
                }else{//登录逻辑
                    /**
                     * cn.smssdk.SMSSDK.class
                     * 提交验证码
                     * @param country   国家区号
                     * @param phone     手机号
                     * @param code      验证码
                     */
                    SMSSDK.submitVerificationCode("86",phone,code);//提交验证码

                }
                break;
        }
    }

    /**

     * cn.smssdk.SMSSDK.class
     * 请求文本验证码
     * @param country   国家区号
     * @param phone     手机号
     */
    public static void getVerificationCode(String country, String phone){
        //获取短信验证码
        SMSSDK.getVerificationCode(country,phone);
    }

    /**cn.smssdk.SMSSDK.class

     * 请求文本验证码(带模板编号)
     * @param tempCode  模板编号
     * @param country   国家区号
     * @param phone     手机号
     */
    public static void getVerificationCode(String tempCode,String country, String phone){
        //获取短信验证码
        SMSSDK.getVerificationCode(tempCode,country,phone);
    }

    //倒计时函数
    private void CountdownStart(){
        get_code_id.setEnabled(false);
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                Message message = new Message();
                message.what = 1;
                message.arg1 = count;
                if(count!=0){
                    count--;
                }else {
                    return;
                }
                handler.sendMessage(message);
            }
        }, 1000,1000);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();// 使用完EventHandler需注销,否则可能出现内存泄漏
        SMSSDK.unregisterEventHandler(eventHandler);
    }

}

5.布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingTop="50dp"
    android:paddingRight="10dp"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/login_phone_textView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="3"
            android:gravity="right"
            android:padding="10dp"
            android:text="手机号码:" />

        <EditText
            android:id="@+id/editTextPhone"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="9"
            android:ems="10"
            android:inputType="phone"
            android:text="" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/login_code_textView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="3"
            android:gravity="center"
            android:padding="10dp"
            android:text="短信验证码:    " />

        <EditText
            android:id="@+id/editTextNumber"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:ems="10"
            android:inputType="number"
            android:text="" />

        <Button
            android:id="@+id/get_code_id"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="3"
            android:gravity="center"
            android:text="获取验证码 ">

        </Button>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingTop="50dp">

        <Button
            android:id="@+id/login_id"
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:text="登录" />

    </LinearLayout>


</LinearLayout>


可能会出现:Execution failed for task ':app:checkDebugDuplicateClasses'.的报错

需要在gradle.properties中添加一下代码即可;

android.nonTransitiveRClass=true
android.enableJetifier=true
MobSDK.spEdition=FP

若有问题,欢迎留言指正;

猜你喜欢

转载自blog.csdn.net/weixin_47024334/article/details/127210881