Androidの来短信监听详解
16lz
2021-01-23
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
更多相关文章
- Android TextView 自定义字体设置(华文行楷TTF)
- (4.1.15.1) Android简单自定义圆形和水平ProgressBar
- 2种自定义android标题栏titleBar的方法
- Android系统在新进程中启动自定义服务过程(startService)的原理分
- Android之短信广播接收内容
- Android教你一步一步实现简单重用自定义控件
- android自定义Spinner下拉菜单样式并获得选项的值