用户无需再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也不一样,获取不到纯属正常。(好心塞!)