Androidの来短信监听方法详解

1. 来电短信监听内容,需要权限 <uses-permissionandroid:name= "android.permission.RECEIVE_SMS" ></uses-permission> <uses-permissionandroid:name="android.permission.READ_SMS"></uses-permission>
2. 通过广播监听短信内容 (注意:这种方式只对新收到的短消息有效,才能接受到广播) 先注册一个广播 <receiver android:name=".MainActivity$SmsReciver" >
<intent-filter android:priority="999">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
然后接受来短信广播代码
public class SmsRecivers extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Bundle bundle = intent.getExtras();SmsMessage msg = null;if (null != bundle) {Object[] smsObj = (Object[]) bundle.get("pdus");for (Object object : smsObj) {msg = SmsMessage.createFromPdu((byte[]) object);Date date = new Date(msg.getTimestampMillis());// 时间SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String receiveTime = format.format(date);System.out.println("blueberry_number:"+ msg.getOriginatingAddress() + "   body:"+ msg.getDisplayMessageBody() + "  time:"+ msg.getTimestampMillis());// 在这里写自己的逻辑if (msg.getOriginatingAddress().equals("10086")) {// TODO}}}}}
如果定义广播类定义在主类activity或者是在service中时候,即内部类,有时候出现异常问题, Caused by: java.lang.InstantiationException: can't instantiate class com.example.smsreceivedemo.MainActivity$SmsReciver; no empty constructor
原因没有构造方法,或者定义该内部类时候,定义为 静态static 状态。即可解决。
系统的这个广播是有序广播,就是当别的程序先获取到了这个广播再传递给你,当然它也可以干掉这个广播,让你接收不到,这样你的程序肯定是接收不到这个广播的了。我们发现,通过设置priority的数值,其实有时是不管用的,现在在一些定制的系统或是有安全软件的情况下,往往短消息都被截取到,并被干掉。
3. 通过监听数据库获取短信内容
(注意:这种方式可以获取手机上所有的短信,包括已读未读的短信,但是也可以只监听来短信情况)
package com.example.smsreceivedemo;import java.util.regex.Matcher;import java.util.regex.Pattern;import android.app.Activity;import android.content.ContentResolver;import android.content.Context;import android.content.Intent;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.os.Handler;public class MainActivity extends Activity {private SmsObserver smsObserver;private Uri SMS_INBOX = Uri.parse("content://sms");@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.fragment_main);smsObserver = new SmsObserver(this, smsHandler);getContentResolver().registerContentObserver(SMS_INBOX, true,smsObserver);}@Overrideprotected void onDestroy() {super.onDestroy();this.getContentResolver().unregisterContentObserver(smsObserver);}public Handler smsHandler = new Handler() {// 这里可以进行回调的操作};public MainActivity() {super();}public void getSmsFromPhone() {ContentResolver cr = getContentResolver();String[] projection = new String[] { "body", "address", "person" };// "_id",String where ="read = ?";Cursor cur = cr.query(Uri.parse("content://sms/inbox"), projection, where,  new String[] { "0" }, "date desc");try {if (null == cur)return;if (cur.moveToNext()) {String number = cur.getString(cur.getColumnIndex("address"));// 手机号String name = cur.getString(cur.getColumnIndex("person"));// 联系人姓名列表String body = cur.getString(cur.getColumnIndex("body"));System.out.println("blueberry_number=" + number + " " + name+ " " + body + " ");}} catch (Exception e) {e.printStackTrace();} finally {cur.close();}}class SmsObserver extends ContentObserver {public SmsObserver(Context context, Handler handler) {super(handler);}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);// 每当有新短信到来时,使用我们获取短消息的方法getSmsFromPhone();}}}
这里监听数据库中短信变化,获取来短信信息,通多调用 onchange()方法,查询数据库,但是验证中调用了两次。所以需要进行处理,才能获取一次信息。
4. 源代码 android来短信广播监听
更多源码 http://blog.csdn.net/xiabing082/article/details/10189827

更多相关文章

  1. Android TextView 自定义字体设置(华文行楷TTF)
  2. (4.1.15.1) Android简单自定义圆形和水平ProgressBar
  3. 2种自定义android标题栏titleBar的方法
  4. Android系统在新进程中启动自定义服务过程(startService)的原理分
  5. Android之短信广播接收内容
  6. Android教你一步一步实现简单重用自定义控件
  7. android自定义Spinner下拉菜单样式并获得选项的值

随机推荐

  1. android读取功能
  2. Android:LayoutAnimation、布局动画
  3. android进度条
  4. android自动更新新版模块(简单,实用)
  5. android webView与js交互
  6. android View的快照与屏幕的截屏
  7. Android修改输入法Enter的文本
  8. Android P图形架构之三屏异显实现
  9. 新说android launch mode
  10. 修改Android ListView字体和颜色