Android 调用免费短信验证码sdk开发

我们经常在一个app注册的时候需要使用到短信验证码,输入一个手机号码,点击获取验证码,手机就能收到一条短信,输入短信中的验证码就能验证成功进而进行一些操作。这里写图片描述
当然现在提供短信服务的也有很多,我们选择一个免费的sdk平台Mob,如果有问题还可以咨询技术支持,服务还挺好的。但是因为是免费的,所以还是有一些限制吧,如果是作为测试的话,一个手机号码最多只能收到不到10次验证码,超过10次就不发送了,这时你就要换一个手机号码去接收验证码。

官网地址: http://www.mob.com/#/ 该平台还提供其他的一些服务,有需要的可以挖掘。这里写图片描述
当然你还是要注册一个账户,然后申请一个app,获取到app key 和app secret, 这个在你的项目里面需要用到,如图中的SecurityCodeSDK
这里写图片描述
然后下载sdk。下图就是Android sdk下载的页面, 可以看到我们可以根据IDE选择不同的sdk,我下载的就是Android studio的sdk,这里写图片描述
下载完成之后解压出来,可以获取到如下的四个jar包, 还有一个txt文件, txt文件是添加sdk到工程的方法。这里写图片描述
先把这四个jar包拷贝到项目的libs文件夹下,然后在gradle文件中添加如下红色部分(被* * * *包起来的)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"
    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            ***minifyEnabled false***
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

**repositories {
    flatDir{
        dirs 'libs'
    }
}**

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.0'
    **compile name:'SMSSDK-2.1.2',ext:'aar'
    compile name:'SMSSDKGUI-2.1.2',ext:'aar'**
    testCompile 'junit:junit:4.12'
}

然后还要在AndroidManifest.xml文件中添加如下的activity:

    <activity  
                android:name="com.mob.tools.MobUIShell"  
                android:configChanges="keyboardHidden|orientation|screenSize"  
                android:theme="@android:style/Theme.Translucent.NoTitleBar"  
                android:windowSoftInputMode="stateHidden|adjustResize"/>  

布局文件很简单,就两个textiew和两个button,下面贴上主代码:

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {  

        private static final String TAG = "SmsYanzheng";  
        EditText mEditTextPhoneNumber;  
        EditText mEditTextCode;  
        Button mButtonGetCode;  
        Button mButtonLogin;  

        EventHandler eventHandler;  
        String strPhoneNumber;  

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

            mEditTextPhoneNumber = (EditText) findViewById(R.id.phone_number);  
            mEditTextCode = (EditText) findViewById(R.id.verification_code);  
            mButtonGetCode = (Button) findViewById(R.id.button_send_verification_code);  
            mButtonLogin = (Button) findViewById(R.id.button_login);  

            mButtonGetCode.setOnClickListener(this);  
            mButtonLogin.setOnClickListener(this);  

            SMSSDK.initSDK(this, "app key", "app secret"); //使用你申请的key 和 secret  

            eventHandler = new EventHandler() {  

                /** 
                 * 在操作之后被触发 
                 * 
                 * @param event  参数1 
                 * @param result 参数2 SMSSDK.RESULT_COMPLETE表示操作成功,为SMSSDK.RESULT_ERROR表示操作失败 
                 * @param data   事件操作的结果 
                 */  

                @Override  
                public void afterEvent(int event, int result, Object data) {  
                    Message message = myHandler.obtainMessage(0x00);  
                    message.arg1 = event;  
                    message.arg2 = result;  
                    message.obj = data;  
                    myHandler.sendMessage(message);  
                }  
            };  

            SMSSDK.registerEventHandler(eventHandler);  
        }  

        @Override  
        protected void onDestroy() {  
            super.onDestroy();  
            SMSSDK.unregisterEventHandler(eventHandler);  
        }  

        @Override  
        public void onClick(View view) {  
            if (view.getId() == R.id.button_login) {  
                String strCode = mEditTextCode.getText().toString();  
                if (null != strCode && strCode.length() == 4) {  
                    Log.d(TAG, mEditTextCode.getText().toString());  
                    SMSSDK.submitVerificationCode("86", strPhoneNumber, mEditTextCode.getText().toString());  
                } else {  
                    Toast.makeText(this, "密码长度不正确", Toast.LENGTH_SHORT).show();  
                }  
            } else if (view.getId() == R.id.button_send_verification_code) {  
                strPhoneNumber = mEditTextPhoneNumber.getText().toString();  
                if (null == strPhoneNumber || "".equals(strPhoneNumber) || strPhoneNumber.length() != 11) {  
                    Toast.makeText(this, "电话号码输入有误", Toast.LENGTH_SHORT).show();  
                    return;  
                }  
                SMSSDK.getVerificationCode("86", strPhoneNumber);  
                mButtonGetCode.setClickable(false);  
                //开启线程去更新button的text  
                new Thread() {  
                    @Override  
                    public void run() {  
                        int totalTime = 60;  
                        for (int i = 0; i < totalTime; i++) {  
                            Message message = myHandler.obtainMessage(0x01);  
                            message.arg1 = totalTime - i;  
                            myHandler.sendMessage(message);  
                            try {  
                                sleep(1000);  
                            } catch (InterruptedException e) {  
                                e.printStackTrace();  
                            }  
                        }  
                        myHandler.sendEmptyMessage(0x02);  
                    }  
                }.start();  
            }  
        }  

        Handler myHandler = new Handler() {  
            @Override  
            public void handleMessage(Message msg) {  
                switch (msg.what) {  
                    case 0x00:  
                        int event = msg.arg1;  
                        int result = msg.arg2;  
                        Object data = msg.obj;  
                        Log.e(TAG, "result : " + result + ", event: " + event + ", data : " + data);  
                        if (result == SMSSDK.RESULT_COMPLETE) { //回调  当返回的结果是complete  
                            if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) { //获取验证码  
                                Toast.makeText(MainActivity.this, "发送验证码成功", Toast.LENGTH_SHORT).show();  
                                Log.d(TAG, "get verification code successful.");  
                            } else if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) { //提交验证码  
                                Log.d(TAG, "submit code successful");  
                                Toast.makeText(MainActivity.this, "提交验证码成功", Toast.LENGTH_SHORT).show();  
                                Intent intent = new Intent(MainActivity.this, SecondActivity.class);  
                                startActivity(intent);  
                            } else {  
                                Log.d(TAG, data.toString());  
                            }  
                        } else { //进行操作出错,通过下面的信息区分析错误原因  
                            try {  
                                Throwable throwable = (Throwable) data;  
                                throwable.printStackTrace();  
                                JSONObject object = new JSONObject(throwable.getMessage());  
                                String des = object.optString("detail");//错误描述  
                                int status = object.optInt("status");//错误代码  
                                //错误代码:  http://wiki.mob.com/android-api-%E9%94%99%E8%AF%AF%E7%A0%81%E5%8F%82%E8%80%83/  
                                Log.e(TAG, "status: " + status + ", detail: " + des);  
                                if (status > 0 && !TextUtils.isEmpty(des)) {  
                                    Toast.makeText(MainActivity.this, des, Toast.LENGTH_SHORT).show();  
                                    return;  
                                }  
                            } catch (Exception e) {  
                                e.printStackTrace();  
                            }  
                        }  
                        break;  
                    case 0x01:  
                        mButtonGetCode.setText("重新发送(" + msg.arg1 + ")");  
                        break;  
                    case 0x02:  
                        mButtonGetCode.setText("获取验证码");  
                        mButtonGetCode.setClickable(true);  
                        break;  
                }  
            }  
        };  
    }  

当然还需要在AndroidManifest文件中声明权限:

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>  
    <uses-permission android:name="android.permission.READ_SMS"/>  
    <uses-permission android:name="android.permission.READ_CONTACTS"/>  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  


    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
    <uses-permission android:name="android.permission.INTERNET"/>  
    <uses-permission android:name="android.permission.GET_TASKS"/>  

详情代码csdn
https://blog.csdn.net/u010153076/article/details/53305224

———-第二种———————————————-看–集成文档 需要注意的方法 如下
一、配置gradle
1、将下面的脚本添加到您的根模块build.gradle中:

buildscript {
    // 添加MobSDK的maven地址
    repositories {
        maven {
            url "http://mvn.mob.com/android"
        }
    }

    dependencies {
        // 注册MobSDK
        classpath 'com.mob.sdk:MobSDK:+'
    }
}

2、在使用SMSSDK模块的build.gradle中,添加MobSDK插件和扩展,(内层build.gradle)如:

// 添加插件  (最上面-顶头)
apply plugin: 'com.mob.sdk'

// 在MobSDK的扩展中注册SMSSDK的相关信息  (“android{}中”)
MobSDK {
    appKey "d580ad56b4b5"
    appSecret "7fcae59a62342e7e2759e9e397c82bdd"

    SMSSDK {}
}

二、添加代码
1、初始化MobSDK

如果您没有在 AndroidManifest 中设置appliaction的类名,MobSDK会将这个设置为com.mob.MobApplication,但如果您设置了,请在您自己的Application类中调用(实例化一个 AndroidManifest 继承application 写入 oncreate方法 ,不要忘记在清单文件中 application 中填入 android:name=”.AndroidManifest”)

MobSDK.init(this);

2、发送验证码并取得验证结果

有两种方法完成验证码短信的发送和验证:调用可视化界面和使用无界面接口

2-1、以可视化界面完成操作

public void sendCode(Context context) {
    RegisterPage page = new RegisterPage();
    page.setRegisterCallback(new EventHandler() {
        public void afterEvent(int event, int result, Object data) {
            if (result == SMSSDK.RESULT_COMPLETE) {
                // 处理成功的结果
                HashMap<String,Object> phoneMap = (HashMap<String, Object>) data;
                String country = (String) phoneMap.get("country"); // 国家代码,如“86”
                String phone = (String) phoneMap.get("phone"); // 手机号码,如“13800138000”
                // TODO 利用国家代码和手机号码进行后续的操作
            } else{
                // TODO 处理错误的结果
            }
        }
    });
    page.show(context);
}

2-2、以无界面接口完成操作

// 请求验证码,其中country表示国家代码,如“86”;phone表示手机号码,如“13800138000”
public void sendCode(String country, String phone) {
    // 注册一个事件回调,用于处理发送验证码操作的结果
    SMSSDK.registerEventHandler(new EventHandler() {
        public void afterEvent(int event, int result, Object data) {
            if (result == SMSSDK.RESULT_COMPLETE) {
               // TODO 处理成功得到验证码的结果
               // 请注意,此时只是完成了发送验证码的请求,验证码短信还需要几秒钟之后才送达
            } else{
                // TODO 处理错误的结果
            }

        }
    });
    // 触发操作
    SMSSDK.getVerificationCode(country, phone);
}

// 提交验证码,其中的code表示验证码,如“1357”
public void submitCode(String country, String phone, String code) {
    // 注册一个事件回调,用于处理提交验证码操作的结果
    SMSSDK.registerEventHandler(new EventHandler() {
        public void afterEvent(int event, int result, Object data) {
            if (result == SMSSDK.RESULT_COMPLETE) {
                // TODO 处理验证成功的结果
            } else{
                // TODO 处理错误的结果
            }

        }
    });
    // 触发操作
    SMSSDK.submitVerificationCode(country, phone, code);
}

    protected void onDestroy() {
        super.onDestroy();
        //用完回调要注销掉,否则可能会出现内存泄露
        SMSSDK.unregisterAllEventHandler();
    };

三、混淆设置
SMSSDK已经做了混淆处理,再次混淆会导致不可预期的错误,请在您的混淆脚本中添加如下的配置,跳过对SMSSDK的混淆操作:

-keep class com.mob.**{*;}
-keep class cn.smssdk.**{*;}
-dontwarn com.mob.**

添加权限

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>  
    <uses-permission android:name="android.permission.READ_SMS"/>  
    <uses-permission android:name="android.permission.READ_CONTACTS"/>  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  


    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
    <uses-permission android:name="android.permission.INTERNET"/>  
    <uses-permission android:name="android.permission.GET_TASKS"/>  

报错的话就需要在清单文件中 application 中添加

tools:replace="android:name"

猜你喜欢

转载自blog.csdn.net/shitou0/article/details/79925006