最近开始学习安卓,要做一个可以监听手机短信的内容,做个笔记,方便以后查看
有两种方式:
方式一:通过广播监听短信信息
注册一个广播接收器
<receiver android:name="接收器包名">
<intent-filter android:priority="优先级">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
要监听系统短息信息肯定需要权限,加入权限
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <!-- 接收短信权限 -->
<uses-permission android:name="android.permission.READ_SMS" /> <!-- 读取短信权限 -->
public class CommandReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// ToastUtil.shortToast(context, "hahhahahahh");
//pdus短信单位pdu
//解析短信内容
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for (Object pdu : pdus) {
//封装短信参数的对象
SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);
String number = sms.getOriginatingAddress();
String body = sms.getMessageBody();
//写自己的处理逻辑
}
}
}
此处广播为有序广播,你可以设置优先级,可以在接收到此广播之后,可以删除它abortBroadcast(); 亲测在AS中加上优先级之后,就不起作用了。
方法二:通过短信数据库获取短信
——————可以根据自已的需求查询短信数据库
public class SMSContentObserver extends ContentObserver {
private static final int MSG_INBOX = 1;
private Context mContext;
private Handler mHandler; // 更新UI
public SMSContentObserver(Context mContext,
Handler mHandler) {
super(mHandler); // 所有ContentObserver的派生类都需要调用该构造方法
this.mContext = mContext;
this.mHandler = mHandler;
}
/**
* 当观察到的Uri发生变化时,回调该方法去处理。所有ContentObserver的派生类都需要重载该方法去处理逻辑
* selfChange:回调后,其值一般为false,该参数意义不大
*/
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
mHandler.obtainMessage(MSG_INBOX, "收到了短信!!!").sendToTarget();
}
}
初始化观察者
我这添加了一个Activity
public class MainActivity extends AppCompatActivity {
private SMSContentObserver smsContentObserver;
protected static final int MSG_INBOX = 1;
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_INBOX:
setSmsCode();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
smsContentObserver = new SMSContentObserver(MainActivity.this, mHandler);
}
private void setSmsCode() {
Log.i("zhang", "收到短信了!");
// login_et_sms_code.setText("hahhaha");
Cursor cursor = null;
// 添加异常捕捉
try {
cursor = getContentResolver().query(
Uri.parse("content://sms"),
new String[] { "_id", "address", "body", "date" },
null, null, "date desc"); //
if (cursor != null) {
String body = "";
while (cursor.moveToNext()) {
body = cursor.getString(cursor.getColumnIndex("body"));// 在这里获取短信信息
//-----------------写自己的逻辑
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if (smsContentObserver != null) {
getContentResolver().registerContentObserver(
Uri.parse("content://sms/"), true, smsContentObserver);// 注册监听短信数据库的变化
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if (smsContentObserver != null) {
getContentResolver().unregisterContentObserver(smsContentObserver);// 取消监听短信数据库的变化
}
}
}
// strColumnName=_id strColumnValue=48 //短消息序号
// strColumnName=thread_id strColumnValue=16 //对话的序号(conversation)
// strColumnName=address strColumnValue=+8613411884805 //发件人地址,手机号
// strColumnName=person strColumnValue=null //发件人,返回一个数字就是联系人列表里的序号,陌生人为null
// strColumnName=date strColumnValue=1256539465022 //日期 long型,想得到具体日期自己转换吧!
// strColumnName=protocol strColumnValue=0 //协议
// strColumnName=read strColumnValue=1 //是否阅读
// strColumnName=status strColumnValue=-1 //状态
// strColumnName=type strColumnValue=1 //类型 1是接收到的,2是发出的
// strColumnName=reply_path_present strColumnValue=0 //
// strColumnName=subject strColumnValue=null //主题
// strColumnName=body strColumnValue=您好 //短消息内容
// strColumnName=service_center strColumnValue=+8613800755500 //短信服务中心号码编号,
这个不需要UI,直接通过模拟器直接发送短信进行测试---