Android開發之監聽或獲取手機簡訊內容
阿新 • • 發佈:2019-01-11
最近開始學習安卓,要做一個可以監聽手機簡訊的內容,做個筆記,方便以後檢視
有兩種方式:
方式一:通過廣播監聽簡訊資訊
註冊一個廣播接收器
<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,直接通過模擬器直接傳送簡訊進行測試---