編輯:關於Android編程
現在的app基本上都需要用到短信功能,注冊時或者有消息通知時需要給用戶發送一條短信,但是對於個人開發者來說,去買第三方的短信服務實在是有點奢侈,很好的是mob為我們提供了免費的短信驗證碼服務功能,我不是打廣告,的確覺得這項服務很不錯。那麼下面就簡單講一下如何在自己的工程裡集成mob的短信功能,其實整個流程並不復雜,只是個人覺得mob的官方文檔有點小亂,官方Demo也有點小復雜,同時有一些細節地方容易被忽視,也會導致一些問題。
本篇只涉及Android,如果是IOS系統,還望自己斟酌,希望本篇文章也能給您提供幫助,同時IDE是Android Studio。
申請地址: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="\" />
下載後大概是這樣:
申請到了key和secret後就是集成到自己的工程中了。mob主要提供兩種接口方式:1)使用官方自帶的UI;2)使用無GUI接口。
這已經是使用第三方接口的老規矩了。官網文檔我就不貼了,著實看著不舒服,在這裡只貼自己的。
首先是在工程的libs下添加jar包和.aar文件。
然後在build.gradle中添加依賴項
在AndroidManifest中添加相應權限和注冊相應的activity
前面提到了,mob短息提供有GUI和無GUI的兩種方式,無論哪種方式,都需要對SMSSDK先初始化,再調用接口。
初始化:SMSSDK.initSDK(LoginActivity.this, "App Key", "App Secret");
方法如下:
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);
}
});
這種情況一般是使用自己的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,基本就大功告成。
集成中可能會出現幾個問題:
mob默認是開啟了智能驗證的,也意味著如果一個號碼通過了一次驗證碼驗證,那之後再次進行短信驗證時,就會智能驗證通過,而此時是不會接收到驗證碼的,因為mob不會下發驗證碼。這就對我們的測試造成了一定的影響,有時候,我們始終無法接收到驗證碼,原因就在這裡。進入後台,將智能驗證功能關閉就可以了。後台中心->短信設置->智能驗證
還是有可能是因為智能驗證的原因。
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
{
//非智能
}
}
}
}
所以,最妥的方式,就是徹底捨棄掉智能驗證功能。
隔了很久沒寫博客,現在必須快速脈動回來。今天我還是接著上一個多線程中的異步加載系列中的最後一個使用異步加載實現ListView中的圖片緩存及其優化。具體來說這次是一個綜合
Android系統裡面有個東西很好用,也很常用,那就是Toast,但是長期使用也會發現,Toast有他的不足之處:形式單一,只有文字,風格不變等等,那麼要如
一:看程序 二:改布局: 1:在res資源下面,找到layout,打開activity_main.xml 在Graphical Layout視圖下面,可以自定義
1、概述開發Android的同學都知道sdk已經為我們提供了一個SQLiteOpenHelper類來創建和管理SQLite數據庫,通過寫一個子類去繼承它,就可以方便的創建