<span style="font-size:32px;color:#ff0000;">实</span><span style="font-size:32px;color:#ff0000;">现类似支付宝那样的获得短信动态码后自动填写到EditText </span>
private SmsContent contentObservable;
</pre><pre class="java" name="code">
contentObservable = new SmsContent(new Handler());
//注册短信变化监听
this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, contentObservable);
</pre><pre class="java" name="code">
/*
* 监听短信数据库
*/
class SmsContent extends ContentObserver {
private Cursor cursor = null;
public SmsContent(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
@SuppressWarnings("deprecation")
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
// 读取收件箱中指定号码的短信
cursor = managedQuery(Uri.parse("content://sms/inbox"),
new String[] { "_id", "address", "read", "body" },
" address=? and read=?",
new String[] { "10010", "0" }, "_id desc");
// 按id排序,如果按date排序的话,修改手机时间后,读取的短信就不准了
if (cursor != null && cursor.getCount() > 0) {
ContentValues values = new ContentValues();
values.put("read", "1"); // 修改短信为已读模式
cursor.moveToNext();
int smsbodyColumn = cursor.getColumnIndex("body");
String smsBody = cursor.getString(smsbodyColumn);
EditText editText = (EditText)findViewById(R.id.editText1);
editText.setText(smsBody);
}
// 在用managedQuery的时候,不能主动调用close()方法, 否则在Android 4.0+的系统上, 会发生崩溃
if (Build.VERSION.SDK_INT < 14) {
cursor.close();
}
}
}
1,在AndroidManifest当中需要的权限:
<!-- 发送短信--> <uses-permission android:name="android.permission.SEND_SMS" /> <!-- 阅读消息 --> <uses-permission android:name="android.permission.READ_SMS" /> <!-- 写入消息 --> <uses-permission android:name="android.permission.WRITE_SMS" /> <!-- 接收消息 --> <uses-permission android:name="android.permission.RECEIVE_SMS" />
2,在oncreate()方法中注册短信库的监听:
content = new SmsContent(new Handler()); //注册短信变化监听 this.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, content);
3,SmsContent自定义的ContentObserver: