Android攔截短信并屏蔽系統的Notification

jopen 10年前發布 | 29K 次閱讀 Android Android開發 移動開發

攔截短信有幾個關鍵點:

 

1.android接收短信時是以廣播的方式

2.程序只要在自己的Manifest.xml里加有"接收"SMS的權限

<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
 

3.要寫個廣播接收類

public class smsreceiveandmask extends BroadcastReceiver {
    private String TAG = "smsreceiveandmask";
    @Override
    public void onReceive(Context context, Intent intent) {

    }
 

4.Manifest.xml的receiver標簽里要加入intent-filter ,action為

<action android:name="android.provider.Telephony.SMS_RECEIVED" />
 

5.重要的是要在這個intent-filter上加上priority優先級,以使自己接收到SMS優先于系統或其它軟件

<receiver android:name=".smsreceiveandmask" >
            <intent-filter android:priority="1000"> 
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
 

6.當自己的程序接收到要屏蔽的SMS后,用 this.abortBroadcast();來結束廣播的繼續發給別的程序,這樣系統就不會收到短信廣播了,Notification也不會有提示了

 // 第三步:取消
            if (flags_filter) {
                this.abortBroadcast();
            }
 

 

源碼如下:

Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hwttnet.test.smsreceiveandmask" android:versionCode="1"
    android:versionName="1.0">
    <uses-sdk android:minSdkVersion="3" />
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <receiver android:name=".smsreceiveandmask" >
            <intent-filter android:priority="1000"> 
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>
 

 

BroadcastReceiver類:

 

package com.hwttnet.test.smsreceiveandmask;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
public class smsreceiveandmask extends BroadcastReceiver {
    private String TAG = "smsreceiveandmask";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v(TAG, ">>>>>>>onReceive start");
        // 第一步、獲取短信的內容和發件人
        StringBuilder body = new StringBuilder();// 短信內容
        StringBuilder number = new StringBuilder();// 短信發件人
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            Object[] _pdus = (Object[]) bundle.get("pdus");
            SmsMessage[] message = new SmsMessage[_pdus.length];
            for (int i = 0; i < _pdus.length; i++) {
                message[i] = SmsMessage.createFromPdu((byte[]) _pdus[i]);
            }
            for (SmsMessage currentMessage : message) {
                body.append(currentMessage.getDisplayMessageBody());
                number.append(currentMessage.getDisplayOriginatingAddress());
            }
            String smsBody = body.toString();
            String smsNumber = number.toString();
            if (smsNumber.contains("+86")) {
                smsNumber = smsNumber.substring(3);
            }
            // 第二步:確認該短信內容是否滿足過濾條件
            boolean flags_filter = false;
            if (smsNumber.equals("10086")) {// 屏蔽10086發來的短信
                flags_filter = true;
                Log.v(TAG, "sms_number.equals(10086)");
            }
            // 第三步:取消
            if (flags_filter) {
                this.abortBroadcast();
            }
        }
        Log.v(TAG, ">>>>>>>onReceive end");
    }
}
 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!