android – 如何获取Cell Broadcast消息?

android – 如何获取Cell Broadcast消息?,第1张

概述我尝试像短信一样得到Cell Broadcast消息的文本,但它不起作用: public class SMSReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); 我尝试像短信一样得到Cell broadcast消息的文本,但它不起作用:
public class SMSReceiver extends broadcastReceiver {@OverrIDepublic 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();

你知道怎么办吗?

解决方法 我也花了一些时间研究这个问题.似乎没有公共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应该与SmsMessage一样使用pdus.最后我找到了source of SmsCbMessage类,它与API的SmsMessage非常相似.这取决于5-6个内部AndroID java文件,所以为了简单起见,我只是从同一个站点获取它们并将它们包含在我的项目中.
broadcastReceiver与您的相同,只是SmsMessage类替换为SmsMbMessage:

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消息之后,我的应用程序能够在通过标准SMS应用程序接收它们的同时在烤面包中显示CB消息.

这些问题仍有待解决:

>如何在我的中启用/禁用/配置CB消息的信道应用? SMS应用程序使用getCbSettings()/ setCbSettings()函数,但我没找到他们.所以我暂时使用其他应用程序.>怎么样中止CB消息广播,以便其他应用程序不接收它们?它似乎abortbroadcast()在这里不起作用,因为广播消息未排序(isOrderedbroadcast()返回false).

总结

以上是内存溢出为你收集整理的android – 如何获取Cell Broadcast消息?全部内容,希望文章能够帮你解决android – 如何获取Cell Broadcast消息?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1149020.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存