如何获取Cell Broadcast消息?

VVS*_*VVS 6 android

我尝试像短信一样得到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();
Run Code Online (Sandbox Code Playgroud)

你知道怎么办吗?

GrA*_*And 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>
Run Code Online (Sandbox Code Playgroud)

注意android.provider.Telephony.CB_RECEIVED意图过滤器.我没有找到任何关于它的文档,但从它的名字我认为它是我现在需要捕获的唯一广播.

然后我搜索了反编译的apk代码,发现它使用android.provider.Telephony.Sms.Intents->getCbMessagesFromIntent()接口来访问检索CB消息,返回CbMessage类实例.此接口即使是简单的SMS消息过时了,所以我认为CbMessage应该一起工作pdusSmsMessage呢.最后我发现类的来源SmsCbMessageSmsMessageAPI 非常相似.这取决于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();
        }                         
    }
}
Run Code Online (Sandbox Code Playgroud)

在将我的应用程序安装到带有上述接收器的SGS手机中,并在手机短信应用程序中启用接收CB消息之后,我的应用程序能够在通过标准SMS应用程序接收它们的同时在烤面包中显示CB消息.

这些问题仍有待解决:

  • 如何在我的应用程序中启用/禁用/ configure_channels CB消息?短信应用程序使用getCbSettings()/ setCbSettings()功能,但我没有找到它们.所以我暂时使用其他应用程序.
  • 如何中止CB消息广播,以便其他应用程序不接收它们?这似乎abortBroadcast()不起作用,因为广播消息没有排序(isOrderedBroadcast()返回false).

  • @GrAnd你是否成功使用了abortBroadCast (2认同)