用戶無需再app與短息收件箱之間來回切換
-
ContentObserver.java
/**
* 自動(dòng)獲取短信驗(yàn)證碼
* @author dandan
*
*/
public class SMSContentObserver extends ContentObserver{
//上下文
private Context mcontext;
private Handler mhandler; //更新線程
private String code; //驗(yàn)證碼
//有參的構(gòu)造方法
public SMSContentObserver(Context context, Handler handler) {
super(handler);
mcontext = context;
mhandler = handler;
}
/**
* 回調(diào)函數(shù), 當(dāng)所監(jiān)聽的Uri發(fā)生改變時(shí),就會(huì)回調(diào)此方法
* 注意當(dāng)收到短信的時(shí)候會(huì)回調(diào)兩次
* @param selfChange
* 此值意義不大 一般情況下該回調(diào)值false
*/
@Override
public void onChange(boolean selfChange, Uri uri) {
//打印一下Log
Log.e("===================", uri.toString());
// 第一次回調(diào) 不是我們想要的 所以直接返回
if(uri.toString().equals("content://sms/raw")){
return ;
}
// 第二次回調(diào) 我們查詢收件箱里的內(nèi)容
Uri inboxUri = Uri.parse("content://sms/sent");
// 按時(shí)間順序排列數(shù)據(jù)庫(kù)的短信
Cursor c = mcontext.getContentResolver().query(inboxUri,
null, null, null, "date desc");
//判斷游標(biāo)
if(c!=null){
//判斷是否為第一個(gè)
if(c.moveToFirst()){
//獲取手機(jī)號(hào)
String address = c.getString(c.getColumnIndex("address")); //系統(tǒng)默認(rèn)的
// 獲取短信內(nèi)容
String body = c.getString(c.getColumnIndex("body")); //系統(tǒng)默認(rèn)的
// 判斷手機(jī)號(hào)是否為目的號(hào)碼
if (!address.equals("想要獲得驗(yàn)證碼的手機(jī)號(hào)碼")) //目的號(hào)碼
{
return;
}
// 正則表達(dá)式截取短信中的6位驗(yàn)證碼
Pattern pattern = Pattern.compile("(\\d{6})");
Matcher matcher = pattern.matcher(body);
// 如果找到通過Handler發(fā)送給主線程
if (matcher.find())
{
code = matcher.group(0);
mhandler.obtainMessage(1, code).sendToTarget();
}
}
}
c.close();
}
}
-
MainActivity.java
/**
* 這里就不寫按鈕了 我們是從另一個(gè)手機(jī)直接發(fā)短信,然后獲取驗(yàn)證碼
* @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="你的驗(yàn)證碼是: " />
<EditText
android:id="@+id/smsCode"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_width="300dp"
android:layout_height="wrap_content"
-
讀取短信的權(quán)限要加
<uses-permission android:name="android.permission.READ_SMS"/>
-
注:由于手機(jī)的差別,所以每個(gè)手機(jī)的短信URI也不一樣,獲取不到純屬正常。(好心塞!)