그래서 나는 연극을했고, 이다 수신 된 SMS를 삭제할 수. 불행히도 그것은 모든 평범한 항해가 아닙니다 :(
수신 SMS 메시지를 수신하는 수신기가 있습니다. 이제 Android SMS 수신 라우팅이 작동하는 방식은 메시지를 디코딩하는 코드 조각이 메시지가 도착할 때마다 브로드 캐스트를 전송하는 것입니다 ( sendBroadcast()
불행히도 단순히 호출 할 수있는 버전이 아닌 방법을 사용함 abortBroadcast()
).
내 수신자는 Systems SMS 수신자보다 먼저 호출되거나 호출되지 않을 수 있으며, 어떤 경우에도 수신 된 브로드 캐스트에는 _id
SMS 테이블 의 열을 반영 할 수있는 속성이 없습니다 .
그러나 SmsMessage를 첨부 된 개체로 사용하여 지연된 메시지를 (Handler를 통해) 쉽게 게시 할 수있는 중지되지는 않습니다. (당신도 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에서 숨겨져 있으며 지표를 정확하게 만들기 위해 모든 코드를 복제하고 싶지 않았습니다.