android 自動獲取簡訊驗證碼
阿新 • • 發佈:2018-12-14
很多專案中都會用到,自動獲取驗證碼填到輸入框,這樣使用者體驗比較好,廢話不多說,現在實現
用的是ContentObserver這個類,幫助我們來監聽簡訊資料庫發生的變化
package com.smart.android.activity; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.EditText; import com.smart.android.R; import com.smart.android.base.BaseActivity; import com.smart.android.utils.SmsObserver; /** * @Title: * @Description: * @Author:leo * @Since: * @Version: */ public class ObtainMsgActivity extends BaseActivity { public static final int MSG_RECEIVED_CODE = 1; private EditText mEditText; private SmsObserver mObserver; private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { if (msg.what == MSG_RECEIVED_CODE) { String code = (String)msg.obj; mEditText.setText(code); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_obtainmsg); mEditText = (EditText)findViewById(R.id.et_msg); mObserver = new SmsObserver(ObtainMsgActivity.this, mHandler); Uri uri = Uri.parse("content://sms"); getContentResolver().registerContentObserver(uri, true, mObserver); } }
package com.smart.android.utils; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Handler; import com.smart.android.activity.ObtainMsgActivity; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @Title: * @Description: * @Author:leo * @Since: * @Version: */ public class SmsObserver extends ContentObserver { private Handler mHandler; private Context mContext; public SmsObserver(Context context,Handler handler) { super(handler); mContext = context; mHandler = handler; } @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); String code; if (uri.toString().equals("content://sms/raw")) ////onChange會執行二次,第二次簡訊才會入庫 { return ; } Uri inboxUri = Uri.parse("content://sms/inbox"); Cursor c = mContext.getContentResolver().query(inboxUri, null, null, null, "date desc"); if (c != null) { if (c.moveToFirst()) { String body = c.getString(c.getColumnIndex("body"));//獲取簡訊內容 Pattern pattern = Pattern.compile("(\\d{6})");//正則表示式 連續6位數字 Matcher matcher = pattern.matcher(body); if (matcher.find()) { code = matcher.group(0); mHandler.obtainMessage(ObtainMsgActivity.MSG_RECEIVED_CODE, code).sendToTarget(); } } c.close(); } } }