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 {如果定义广播类定义在主类activity或者是在service中时候,即内部类,有时候出现异常问题, Caused by: java.lang.InstantiationException: can't instantiate class com.example.smsreceivedemo.MainActivity$SmsReciver; no empty constructor
@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
}
}
}
}
}
原因没有构造方法,或者定义该内部类时候,定义为 静态static 状态。即可解决。
系统的这个广播是有序广播,就是当别的程序先获取到了这个广播再传递给你,当然它也可以干掉这个广播,让你接收不到,这样你的程序肯定是接收不到这个广播的了。我们发现,通过设置priority的数值,其实有时是不管用的,现在在一些定制的系统或是有安全软件的情况下,往往短消息都被截取到,并被干掉。
3. 通过监听数据库获取短信内容
(注意:这种方式可以获取手机上所有的短信,包括已读未读的短信,但是也可以只监听来短信情况)
package com.example.smsreceivedemo;这里监听数据库中短信变化,获取来短信信息,通多调用 onchange()方法,查询数据库,但是验证中调用了两次。所以需要进行处理,才能获取一次信息。
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();
}
}
}
4. 源代码 android来短信广播监听
更多源码 http://blog.csdn.net/xiabing082/article/details/10189827