なので、遊んだところ、受信したSMSを削除することが可能です。残念ながら、それはすべて単純な航海ではありません:(
着信SMSメッセージを受信するレシーバーがあります。これで、Android SMS着信ルーティングが機能する方法は、メッセージのデコードを担当するコードがブロードキャストを送信することです(sendBroadcast()
メソッドを使用します-残念ながら、これは単純にを呼び出すことができるバージョンではありませんabortBroadcast()
)。メッセージが到着するたびに。
私のレシーバーは、システムSMSレシーバーの前に呼び出される場合と呼び出されない場合があり、受信したブロードキャストには_id
、SMSテーブルの列を反映するプロパティがありません。
ただし、SmsMessageを添付オブジェクトとして使用して遅延メッセージを(ハンドラーを介して)自分で簡単に投稿できるようにする必要があるため、停止する必要はありません。(自分でRunnableも投稿できると思います...)
handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500);
遅延は、メッセージが到着するまでにすべてのブロードキャストレシーバーが受信を終了し、メッセージがSMSテーブルに安全に収まるようにするためにあります。
メッセージ(またはRunnable)がここで受信されると、次のようになります。
case MSG_DELETE_SMS:
Uri deleteUri = Uri.parse("content://sms");
SmsMessage msg = (SmsMessage)message.obj;
getContentResolver().delete(deleteUri, "address=? and date=?", new String[] {msg.getOriginatingAddress(), String.valueOf(msg.getTimestampMillis())});
元のアドレスとタイムスタンプフィールドを使用して、関心のあるメッセージのみを削除する可能性を非常に高くしています。さらに偏執的になりたい場合msg.getMessageBody()
は、クエリの一部としてコンテンツを含めることができます。
はい、メッセージは削除されました(フレイ!)。残念ながら、通知バーは更新されません:(
通知領域を開くと、そこにメッセージが表示されますが、タップして開くと消えてしまいます。
私には、これでは十分ではありません。メッセージのすべての痕跡が消えるようにしたいのですが、TXTがない場合にユーザーにTXTがあると思わせたくないです(バグレポートが発生するだけです)。
内部的にはOSで電話が呼び出されますがMessagingNotification.updateNewMessageIndicator(Context)
、そのクラスはAPIから隠されており、インジケーターを正確にするためだけにそのコードのすべてを複製したくありませんでした。