Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發:app工程集成mob短信驗證碼功能

Android開發:app工程集成mob短信驗證碼功能

編輯:關於Android編程

一.前言

現在的app基本上都需要用到短信功能,注冊時或者有消息通知時需要給用戶發送一條短信,但是對於個人開發者來說,去買第三方的短信服務實在是有點奢侈,很好的是mob為我們提供了免費的短信驗證碼服務功能,我不是打廣告,的確覺得這項服務很不錯。那麼下面就簡單講一下如何在自己的工程裡集成mob的短信功能,其實整個流程並不復雜,只是個人覺得mob的官方文檔有點小亂,官方Demo也有點小復雜,同時有一些細節地方容易被忽視,也會導致一些問題。

二.實現過程

本篇只涉及Android,如果是IOS系統,還望自己斟酌,希望本篇文章也能給您提供幫助,同時IDE是Android Studio。

1.key申請

申請地址:http://www.mob.com,在產品中心選擇短信驗證碼SDK,然後完成相應的注冊和申請工作;
進入自己的後台中心,就可以看見自己的App Key和App Secret:
這裡寫圖片描述vc+086OsztLDx7/J0tTU2tfUvLq1xLmks8zA77yvs8nBy21vYrbM0MWjrMi7uvPJz8/ftce8x6Os06a4w7/J0tS78bXDuPy24LXEw+K30bbM0MXM9cr9o6yyqdb31N3OtLOiytShozwvcD4NCjxoMj4yLs/C1NhTREs8L2gyPg0KPHA+1NpTREvPwtTYwLjEv9Gh1PFTTVMgZm9yIEFuZHJvaWSjrMi7uvPRodTxz+DTpklERbbU06a1xFNES7y0v8mjqLG+xqpJREXKx2Fzo6k8YnIgLz4NCjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160525/20160525091027342.png" title="\" />
下載後大概是這樣:
這裡寫圖片描述

3.集成過程

申請到了key和secret後就是集成到自己的工程中了。mob主要提供兩種接口方式:1)使用官方自帶的UI;2)使用無GUI接口。

3.1.配置SDK

這已經是使用第三方接口的老規矩了。官網文檔我就不貼了,著實看著不舒服,在這裡只貼自己的。

首先是在工程的libs下添加jar包和.aar文件。
這裡寫圖片描述

然後在build.gradle中添加依賴項
這裡寫圖片描述

在AndroidManifest中添加相應權限和注冊相應的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
                        {
                            //非智能
                        }
                    }
                }
            }

所以,最妥的方式,就是徹底捨棄掉智能驗證功能。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved