Android开发:app工程集成mob短信验证码功能

Posted 生活没有if-else

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发:app工程集成mob短信验证码功能相关的知识,希望对你有一定的参考价值。

一.前言

现在的app基本上都需要用到短信功能,注册时或者有消息通知时需要给用户发送一条短信,但是对于个人开发者来说,去买第三方的短信服务实在是有点奢侈,很好的是mob为我们提供了免费的短信验证码服务功能,我不是打广告,的确觉得这项服务很不错。那么下面就简单讲一下如何在自己的工程里集成mob的短信功能,其实整个流程并不复杂,只是个人觉得mob的官方文档有点小乱,官方Demo也有点小复杂,同时有一些细节地方容易被忽视,也会导致一些问题。
PS:太喜欢mob的logo了。
这里写图片描述

二.实现过程

本篇只涉及android,如果是ios系统,还望自己斟酌,希望本篇文章也能给您提供帮助,同时IDE是Android Studio

1.key申请

申请地址:http://www.mob.com,在产品中心选择短信验证码SDK,然后完成相应的注册和申请工作;
进入自己的后台中心,就可以看见自己的App Key和App Secret:
这里写图片描述
整体趋势栏给我们展示了一些短信服务使用情况。未上线登记时,我们可以免费使用20条/天,如果需求量比较大,我们可以在自己的工程里集成了mob短信,然后上线登记,应该可以获得更多的免费短信条数,博主暂未尝试。

2.下载SDK

在SDK下载栏目选择SMS for Android,然后选择相应IDE对应的SDK即可(本篇IDE是as)
这里写图片描述
下载后大概是这样:
这里写图片描述

3.集成过程

申请到了key和secret后就是集成到自己的工程中了。mob主要提供两种接口方式:1)使用官方自带的UI;2)使用无GUI接口。

3.1.配置SDK

这已经是使用第三方接口的老规矩了。官网文档我就不贴了,着实看着不舒服,在这里只贴自己的。

  • 首先是在工程的libs下添加jar包和.aar文件。
    这里写图片描述

  • 然后在build.gradle中添加依赖项
    这里写图片描述

  • 在AndroidManifest中添加相应权限和注册相应的activity

 <!-- mob短信 需要的权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <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.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--在application中注册activity -->
 <!-- Mob短信(如果使用无GUI的,这个activity应该可以不需要了,自己没试过,就先在这注册着吧) -->
        <activity
            android:name="com.mob.tools.MobUIShell"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:windowSoftInputMode="stateHidden|adjustResize" >
        </activity>

3.2.调用接口发送短信

前面提到了,mob短息提供有GUI和无GUI的两种方式,无论哪种方式,都需要对SMSSDK先初始化,再调用接口。

初始化:SMSSDK.initSDK(LoginActivity.this, "App Key", "App Secret");

1)有GUI,即使用mob提供的界面

这里写图片描述这里写图片描述这里写图片描述
方法如下:

 registerText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //首先初始化SMSSDK
                SMSSDK.initSDK(LoginActivity.this, "App Key", "App Secret");
                RegisterPage registerPage = new RegisterPage();
                //回调函数
                registerPage.setRegisterCallback(new EventHandler()
                {
                    public void afterEvent(int event, int result, Object data)
                    {
                    // 解析结果
                    if (result == SMSSDK.RESULT_COMPLETE)
                    {
                        //提交验证码成功,此时已经验证成功了
                        if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE)
                        {
                        }
                        //已发送验证码
                        else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE)
                        {
                        }
                     }
                 }
                });
                registerPage.show(LoginActivity.this);
            }
        });

2)无GUI

这种情况一般是使用自己的activity界面,然后集成短信功能,比如一个简单的注册。

//我只提供一些关键代码,其他部分就不提供了,太多,看起来太杂
public class ActivityMessageRegister extends Activity 
{
    private static final int CODE_ING = 1;                  //已发送,倒计时
    private static final int CODE_REPEAT = 2;               //重新发送
    private static final int SMSDDK_HANDLER = 3;            //短信回调
    private int TIME = 60;//倒计时60s

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_message_register);
        initView();//界面初始化
        initSDK();//短信初始化
    }
    //初始化界面
     void initView()
    {
        userPhoneText = (EditText)findViewById(R.id.user_phone_input);
        userPasswordText = (EditText)findViewById(R.id.user_password_input);
        userNameText = (EditText)findViewById(R.id.user_name_input);
        registerButton = (Button)findViewById(R.id.register_button);
        registerButton.setOnClickListener(new OnClickListener());
        loginView = (TextView)findViewById(R.id.login_view);
        getCodeButton = (Button)findViewById(R.id.get_code_button);
        getCodeButton.setOnClickListener(new OnClickListener());
        codeText = (EditText)findViewById(R.id.code_view);
        //
        ...
        //
    }
    //初始化SMSSDK
    private void initSDK()
    {
        SMSSDK.initSDK(this, "App Key", "App Secret");
        eventHandler = new EventHandler() {
            @Override
            public void afterEvent(int event, int result, Object data) {
                Message msg = new Message();
                msg.arg1 = event;
                msg.arg2 = result;
                msg.obj = data;
                msg.what = SMSDDK_HANDLER;
                handler.sendMessage(msg);
            }
        };
        // 注册回调监听接口
        SMSSDK.registerEventHandler(eventHandler);
    }
    //监听函数
    private class OnClickListener implements View.OnClickListener
    {
        @Override
        public void onClick(View v) {
            userPhone = userPhoneText.getText().toString();
            switch (v.getId()) {
                case R.id.get_code_button://获取验证码
                    new AlertDialog.Builder(ActivityMessageRegister.this)
                            .setTitle("发送短信")
                            .setMessage("我们将把验证码发送到以下号码:\\n"+"+86:"+userPhone)
                            .setPositiveButton("确定", new DialogInterface.OnClickListener()
                            {
                                @Override
                                public void onClick(DialogInterface dialog, int which)
                                {
                                    SMSSDK.getVerificationCode("86", userPhone);
                                    getCodeButton.setClickable(false);
                                    new Thread(new Runnable()
                                    {
                                        @Override
                                        public void run()
                                        {
                                            for (int i = 60; i > 0; i--)
                                            {
                                                handler.sendEmptyMessage(CODE_ING);
                                                if (i <= 0)
                                                {
                                                    break;
                                                }
                                                try
                                                {
                                                    Thread.sleep(1000);
                                                } catch (InterruptedException e)
                                                {
                                                    e.printStackTrace();
                                                }
                                            }
                                            handler.sendEmptyMessage(CODE_REPEAT);
                                        }
                                    }).start();
                                }
                            })
                            .create()
                            .show();
                    break;

                case R.id.register_button://注册
                    SMSSDK.submitVerificationCode("86", userPhone, codeText.getText().toString());//对验证码进行验证->回调函数
                    break;
                default:
                    break;
            }
        }
    }
    Handler handler = new Handler()
    {
        public void handleMessage(Message msg)
        {
            switch (msg.what)
            {
                case CODE_ING://已发送,倒计时
                    getCodeButton.setText("重新发送("+--TIME+"s)");
                    break;
                case CODE_REPEAT://重新发送
                    getCodeButton.setText("获取验证码");
                    getCodeButton.setClickable(true);
                    break;
                case SMSDDK_HANDLER:
                    int event = msg.arg1;
                    int result = msg.arg2;
                    Object data = msg.obj;
                    //回调完成
                    if (result == SMSSDK.RESULT_COMPLETE)
                    {
                        //验证码验证成功
                        if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE)
                        {
                            Toast.makeText(ActivityMessageRegister.this, "验证成功", Toast.LENGTH_LONG).show();
                            if (check())//其他合法性的检测
                            {
                                UserModel user  = new UserModel();
                                user.setUserId(MyUUID.getUUID());              //id
                                user.setUserPhone(userPhone);
                                user.setUserPassword(MD5.md5(userPassword));   //md5加密
                                user.setUserGender(gender);                    //性别
                                user.setUserName(userName);
                                user.setUserBirthday("19920401");                      //暂时为空
                                //user.setUserIdCard(userIdCard);
                                //user.setUserImage("");                         //暂时为空
                                //注册->服务器
                                UserController.userRegister(user, handler);
                            }

                        }
                        //已发送验证码 
                        else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE)
                        {
                            Toast.makeText(getApplicationContext(), "验证码已经发送",
                                    Toast.LENGTH_SHORT).show();
                        } else
                        {
                            ((Throwable) data).printStackTrace();
                        }
                    }
                    if(result==SMSSDK.RESULT_ERROR)
                    {
                        try {
                            Throwable throwable = (Throwable) data;
                            throwable.printStackTrace();
                            JSONObject object = new JSONObject(throwable.getMessage());
                            String des = object.optString("detail");//错误描述
                            int status = object.optInt("status");//错误代码
                            if (status > 0 && !TextUtils.isEmpty(des)) {
                                Toast.makeText(getApplicationContext(), des, Toast.LENGTH_SHORT).show();
                                return;
                            }
                        } catch (Exception e) {
                            //do something
                        }
                    }
                    break;
                case R.id.register_status:
                    String result_code = msg.getData().getString("result").toString();
                    if("1".equals(result_code))
                    {
                        Toast.makeText(ActivityMessageRegister.this, "注册成功", Toast.LENGTH_LONG).show();
                        Intent intent = new Intent(ActivityMessageRegister.this,LoginActivity.class);
                        intent.putExtra("userPhone", userPhone);
                        ActivityMessageRegister.this.setResult(RESULE_CODE, intent);
                        //startActivity(intent);
                        finish();
                    }else
                    {
                        Toast.makeText(ActivityMessageRegister.this, "注册失败", Toast.LENGTH_LONG).show();
                    }
                    break;
                case R.id.check_phone_exist://手机号是否已存在
                    String result_code_2 = msg.getData().getString("result").toString();
                    if("1".equals(result_code_2))
                    {
                        errPhoneText.setText("手机号码已经注册,请换用其他号码");
                        resultMap.put("phone", false);
                    }
                    else
                    {
                        errPhoneText.setText("");
                        resultMap.put("phone", true);
                    }
                    break;
            }
        }
    };
}

OK,基本就大功告成。

三.问题

集成中可能会出现几个问题:

1.无法接收短信验证码

mob默认是开启了智能验证的,也意味着如果一个号码通过了一次验证码验证,那之后再次进行短信验证时,就会智能验证通过,而此时是不会接收到验证码的,因为mob不会下发验证码。这就对我们的测试造成了一定的影响,有时候,我们始终无法接收到验证码,原因就在这里。进入后台,将智能验证功能关闭就可以了。后台中心->短信设置->智能验证
这里写图片描述

2.短信验证成功后,并未执行相应的代码,而是返回到了某一个界面

还是有可能是因为智能验证的原因。

eventHandler = new EventHandler() {
            @Override
            public void afterEvent(int event, int result, Object data) 
            {
                if (result == SMSSDK.RESULT_COMPLETE)
                {
                    if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE)
                    {
                        //官方文档中说了,如果是智能验证只需要在这里对data进行判断就可以了
                        if((Boolean)data)//是智能验证
                        {
                            //如果增加了这条if语句,那么就算关闭了智能验证,此时的data强制转换成了Boolean也是为true的,所以并不会执行后面的相应代码,所以,如果在集成的时候不需要智能验证,最好的方式就是不去管这个功能。
                        }
                        else
                        {
                            //非智能
                        }
                    }
                }
            }

所以,最妥的方式,就是彻底舍弃掉智能验证功能。

以上是关于Android开发:app工程集成mob短信验证码功能的主要内容,如果未能解决你的问题,请参考以下文章

android_app开发集成mob短信验证码功能

android_app开发集成mob短信验证码功能

sharesdk短信验证码的集成

Android开发之MOB短信验证SDK的使用

Android studio 2.1 集成第三方短信验证类库

Android开发 申请Mob的SMSSDK的短信验证码功能中获取MD5签名(更新中)