我也花了一些時間對這個問題進行調查。而且似乎沒有公開的API來做到這一點。但我可以分享我的逆向工程研究的一些結果...
我的三星Galaxy S能夠接收CB消息,所以我反編譯短信應用程序,並查看代碼。它在其清單文件中的以下BroadcastReceiver
:
<receiver android:name=".transaction.PrivilegedSmsReceiver">
...
<intent-filter>
<action android:name="android.provider.Telephony.CB_RECEIVED" />
</intent-filter>
<intent-filter>
<action android:name="android.provider.Telephony.CB_SETTINGS_AVAILABLE" />
</intent-filter>
<intent-filter>
<action android:name="android.provider.Telephony.SET_CB_ERR_RECEIVED" />
</intent-filter>
<intent-filter>
<action android:name="android.provider.Telephony.GET_CB_ERR_RECEIVED" />
</intent-filter>
</receiver>
注意android.provider.Telephony.CB_RECEIVED
意圖過濾器。我沒有找到任何關於它的文檔,但是從它的名字我認爲這是我現在需要捕捉的唯一一個廣播。
然後我通過反編譯apk的代碼進行搜索,發現它使用android.provider.Telephony.Sms.Intents->getCbMessagesFromIntent()
接口訪問檢索CB消息,它返回CbMessage
類實例。即使對於簡單的SMS消息,該接口也是過時的,所以我認爲CbMessage
應該與pdus
一起使用,因爲SmsMessage
可以。最後我發現了source of SmsCbMessage
這個類,它與API的SmsMessage
非常相似。它取決於5-6內部的Android Java文件,所以爲了簡單起見,我只是從同一個網站抓取它們並將它們包含到我的項目中。 的broadcastReceiver
是你的一樣,除了類SmsMessage
由SmsCbMessage
取代:
public class CbReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//---get the CB message passed in---
Bundle bundle = intent.getExtras();
SmsCbMessage[] msgs = null;
String str = "";
if (bundle != null) {
//---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsCbMessage[pdus.length];
for (int i=0; i<msgs.length; i++) {
msgs[i] = SmsCbMessage.createFromPdu((byte[])pdus[i]);
str += "CB lang " + msgs[i].getLanguageCode();
str += " :";
str += msgs[i].getMessageBody().toString();
str += "\n";
}
//---display the new CB message---
abortBroadcast();
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
}
}
}
安裝我的申請,我的SGS電話與所述接收器的上方,並且使在電話SMS應用程序接收的CB消息後,我的應用程序是能夠通過標準的SMS應用程序並行顯示CB信息。仍然需要
的問題需要解決:
- 如何啓用/禁用我的 申請CB消息/ configure_channels?短信應用使用
getCbSettings()
/setCbSettings()
功能, ,但我沒有找到它們。所以暫時我使用了其他應用程序。
- 如何 中止CB消息廣播,所以其他應用程序不會收到它們?它 似乎
abortBroadcast()
在這裏不起作用,因爲廣播 消息沒有排序(isOrderedBroadcast()
返回false
)。
你是什麼意思的小區廣播消息,如推送通知,或...? – Jakar
@Jakar - [小區廣播](http://en.wikipedia.org/wiki/Cell_Broadcast) – GrAnd