2015-01-07 13 views
3

目前我正在嘗試修改收到的短信,然後將其保存到收件箱。 由於系統是Android 4.4.4,因此不可能使用高優先級廣播接收器進行簡單攔截。這也是我修改Android源代碼(AOSP)而不是構建應用程序的原因。Android - 在到達收件箱之前修改短信主體

到目前爲止,我已經設法確定了一個有前途的類:InboundSmsHandler。在內部類SmsBroadcastReceiver中,當SMS已經到達並且稍後發送「SMS_RECEIVED」意圖時,onReceive方法被觸發。所以基本上這種方法似乎處在一個很好的位置。

問題是我無法修改隨onReceive的意圖提供的SMS。 我已經嘗試與PDU修改它:

byte[] pdu = createFakePDU("15555215556", "modified body"); 
intent.putExtra("pdus", new Object[] { pdu }); 
intent.putExtra("format", "3gpp"); 

(這種方法不奏效,短信應用已經顯示出原始消息)

試圖直接修改SmsMessage的身體: (我已經添加到SmsMessage的方法,以便能夠修改體)

SmsMessage[] msgs = Intents.getMessagesFromIntent(intent); 
int pduCount = msgs.length; 
for(int i=0; i<pduCount; i++) 
{ 
    msgs[i].modifyBody("test"); 
} 

(這種方法沒有工作,短信應用已經顯示出原始消息)

最後添加了一個新的短信數據庫:

.... 
contentResolver.insert(Uri.parse(SMS_URI), values); 

.... 

(用這種方法的問題是,原來的短信仍然會到達,因此不僅是一個修改短信,但一個原始的短信和一個修改到達。原始的短信必須刪除,但我不知道如何。)

有誰知道我可以在它到達收件箱之前修改SMS嗎?

問候 薄荷

回答

1

感謝所有的答案,我發現在InboundSmsHandler現貨可以在發送廣播之前修改PDU:方法proccessMessagePart。在命令「intent.putExtra(」pdus「,pdus);」被執行時,pdus數組,因此消息體可以被修改。

0

據我所知,在4.4.4沒有什麼能阻止你的應用程序通過註冊的BroadcastReceiver的,設置正確的權限和正確的意圖過濾器來接收短信。那就是:

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

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

(如果我沒記錯的話他們)

那麼你的廣播接收器中調用abortBroadcast(),修改短信需要,最後手動存儲它與

getContentResolver().insert(Uri.parse("content://sms/sent"), values); 
+0

謝謝你的回答,但這不是我正在尋找的。在第一篇文章中,我寫道我正在修改Android系統,並且不開發應用程序。 – stackmint54

+1

您寫道:「不可能使用高優先級的廣播接收器進行簡單的攔截,這也是我修改Android源代碼(AOSP)而不是構建應用程序的原因。」我沒有看到「也」,對不起。但是......無論如何,這可能同樣適用:放棄原始廣播,創建新的意圖並播放它。否則,您可能試圖修改意圖的「本地副本」,而不是Android系統存儲以傳遞給每個訂閱接收方的意圖。 – motoDrizzt

+1

@motoDrizzt從KitKat開始,不能中止'SMS_RECEIVED'廣播。 –