受信トレイからSMSを削除していますが、知りたい:受信トレイに到達する前に削除するにはどうすればよいですか?
受信トレイからSMSを削除していますが、知りたい:受信トレイに到達する前に削除するにはどうすればよいですか?
回答:
はい。
この質問に対するいくつかの否定的な反応にもかかわらず、SMS傍受の正当な使用法があります。例:電話番号の検証の自動化、SMSを介してプロビジョニングされるサービス(通常、これはデータSMSを使用して行う必要があります)、または特別な形式のメッセージを処理してユーザーエクスペリエンスを向上させ、素敵なAndroidで表示するアプリケーションの場合固有のUI。
Android 1.6以降、着信SMSメッセージブロードキャスト(android.provider.Telephony.SMS_RECEIVED
)は「順序付きブロードキャスト」として配信されます。つまり、最初にブロードキャストを受信するコンポーネントをシステムに通知できます。
android:priority
SMSリスニング<intent-filter>
で属性を定義すると、ネイティブSMSアプリケーションの前に通知が届きます。
この時点で、ブロードキャストをキャンセルして、他のアプリに反映されないようにすることができます。
アップデート(2013年10月): Android 4.4がリリースされると、SMS APIに変更が加えられ、SMS配信に影響を与えるアプリの機能に影響する可能性があります。
詳細については、このAndroid Developersブログの投稿を確認してください:http :
//android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html
1000
ので、可能です。実際、Handcentは優先度を使用しています2147483647
。
"Beginning with Android 4.4—any attempt by your app to abort the SMS_RECEIVED_ACTION broadcast will be ignored so all apps interested have the chance to receive it."
。
手順1: SMSを受信するカスタムブロードキャストレシーバーを作成します。メッセージを受信トレイで利用できないように、最も広い範囲を中止するロジックを記述します
public class SMSReceiver extends BroadcastReceiver
{
public void onReceive(Context context, Intent intent)
{
if(conditionMatches){
abortBroadcast();
}
}
}
ステップ -2 AndoridManifestにブロードキャストレシーバーを登録し、android:priorityの値を大きくする
<receiver android:name=".SMSReceiver" >
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
それでおしまい
上記のコードはどのように機能しますか
ブロードキャストを受信するSMSは順序付けされたブロードキャストであるため、優先度の高いレシーバが最初に受信するため、アプリケーションが最初に受信し、受信後にブロードキャストを中止します。したがって、他のアプリケーションはそれを受信できません。したがって、SMSは受信トレイに存在しません
以下の( "android:priority"およびabortBroadcast())ソリューションは、Androidメッセージングアプリケーションがデフォルトである限り機能します(私はストックのAndroidメッセージングアプリケーションを意味しました)。ユーザーが「GoSMSPro」または「HandcentSMS」をインストールしても、これらのアプリケーションは引き続き受信トレイにメッセージを表示しますが、これは「android:priority」が原因であると考えています。サードパーティのメッセージングアプリケーションが電話にインストールされている場合、上記の問題を解決するためのより良い方法はありません。
/**
* Check priority
* @param activity
*/
public static void receiverPriority(Activity activity){
Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED");
List<ResolveInfo> infos = activity.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0);
for (ResolveInfo info : infos) {
System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority);
}
}
優先度を確認し、他の受信者よりも(マニフェストで)高い優先度を設定します。