用戶無需再app與短息收件箱之間來回切換
-
ContentObserver.java
/**
* 自動獲取短信驗證碼
* @author dandan
*
*/
public class SMSContentObserver extends ContentObserver{
//上下文
private Context mcontext;
private Handler mhandler; //更新線程
private String code; //驗證碼
//有參的構造方法
public SMSContentObserver(Context context, Handler handler) {
super(handler);
mcontext = context;
mhandler = handler;
}
/**
* 回調函數, 當所監聽的Uri發生改變時,就會回調此方法
* 注意當收到短信的時候會回調兩次
* @param selfChange
* 此值意義不大 一般情況下該回調值false
*/
@Override
public void onChange(boolean selfChange, Uri uri) {
//打印一下Log
Log.e("===================", uri.toString());
// 第一次回調 不是我們想要的 所以直接返回
if(uri.toString().equals("content://sms/raw")){
return ;
}
// 第二次回調 我們查詢收件箱里的內容
Uri inboxUri = Uri.parse("content://sms/sent");
// 按時間順序排列數據庫的短信
Cursor c = mcontext.getContentResolver().query(inboxUri,
null, null, null, "date desc");
//判斷游標
if(c!=null){
//判斷是否為第一個
if(c.moveToFirst()){
//獲取手機號
String address = c.getString(c.getColumnIndex("address")); //系統默認的
// 獲取短信內容
String body = c.getString(c.getColumnIndex("body")); //系統默認的
// 判斷手機號是否為目的號碼
if (!address.equals("想要獲得驗證碼的手機號碼")) //目的號碼
{
return;
}
// 正則表達式截取短信中的6位驗證碼
Pattern pattern = Pattern.compile("(\\d{6})");
Matcher matcher = pattern.matcher(body);
// 如果找到通過Handler發送給主線程
if (matcher.find())
{
code = matcher.group(0);
mhandler.obtainMessage(1, code).sendToTarget();
}
}
}
c.close();
}
}
-
MainActivity.java
/**
* 這里就不寫按鈕了 我們是從另一個手機直接發短信,然后獲取驗證碼
* @author dandan
*
*/
public class MainActivity extends Activity {
private EditText code;
//主線程利用線程
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==1){
code.setText(msg.obj.toString());
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
iviview();
SMSContentObserver sco = new SMSContentObserver(MainActivity.this,handler);
MainActivity.this.getContentResolver().registerContentObserver(
Uri.parse("content://sms/"), true, sco);
}
private void iviview() {
code = (EditText) findViewById(R.id.smsCode);
}
}
-
布局文件
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="你的驗證碼是: " />
<EditText
android:id="@+id/smsCode"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_width="300dp"
android:layout_height="wrap_content"
-
讀取短信的權限要加
<uses-permission android:name="android.permission.READ_SMS"/>
-
注:由于手機的差別,所以每個手機的短信URI也不一樣,獲取不到純屬正常。(好心塞!)