我也花了一些时间对这个问题进行调查。而且似乎没有公开的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