Androidの来短信监听详解

时间:2022-09-03 08:55:06

Androidの来短信监听方法详解

1.  来电短信监听内容,需要权限      <uses-permission android:name="android.permission.RECEIVE_SMS" ></uses-permission>   <uses-permission android: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 {
@Override
public 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");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
smsObserver = new SmsObserver(this, smsHandler);
getContentResolver().registerContentObserver(SMS_INBOX, true,smsObserver);
}

@Override
protected 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);
}

@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// 每当有新短信到来时,使用我们获取短消息的方法
getSmsFromPhone();
}
}
}
这里监听数据库中短信变化,获取来短信信息,通多调用 onchange()方法,查询数据库,但是验证中调用了两次。所以需要进行处理,才能获取一次信息。

4.  源代码    android来短信广播监听
      更多源码    http://blog.csdn.net/xiabing082/article/details/10189827