我尝试像短信一样获取Cell Broadcast消息的文本,但它不起作用:
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null) {
// ---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
str =msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
你知道有什么办法吗?
答案 0 :(得分:8)
我也花了一些时间研究这个问题。似乎没有公共API可以做到这一点。但我可以从我的逆向工程研究中分享一些结果......
我的三星Galaxy S能够接收CB消息,因此我反编译了SMS应用程序并查看了代码。它的清单文件中包含以下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
intent-filter。我没有找到任何关于它的文档,但从它的名字我认为这是我现在唯一需要捕获的广播。
然后我搜索了反编译的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手机中,并在手机短信应用程序中启用接收CB消息之后,我的应用程序能够在通过标准短信应用程序接收它们的同时在烤面包中显示CB消息。
问题仍然需要解决:
getCbSettings()
/ setCbSettings()
个功能,
但我没找到他们。所以我暂时使用了其他应用程序。 abortBroadcast()
在这里不起作用,因为广播
消息未排序(isOrderedBroadcast()
返回false
)。