gpt4 book ai didi

android - 如何获取小区广播消息?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:48:35 26 4
gpt4 key购买 nike

我尝试像短信一样获取小区广播消息的文本,但它不起作用:

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();

你知道有什么方法可以得到它吗?

最佳答案

我也花了一些时间调查这个问题。而且似乎没有公共(public) API 可以做到这一点。但我可以分享我的逆向工程研究的一些结果...

我的 Samsung Galaxy S 能够接收 CB 消息,所以我反编译了 SMS 应用程序并查看了代码。它的 list 文件中有以下 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()接口(interface)访问retrieve CB messages,返回 CbMessage 类实例。即使对于简单的 SMS 消息,此接口(interface)也已过时,因此我假设 CbMessage 应该像 SmsMessage 一样与 pdus 一起工作。最后我找到了 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 消息的同时在 toast 中显示 CB 消息。

还有待解决的问题:

  • 如何启用/禁用/配置我的 CB 消息的 channel 应用? SMS 应用程序使用 getCbSettings()/setCbSettings() 函数,但我没有找到他们。所以暂时我使用了其他应用程序。
  • 如何中止CB消息广播,让其他应用收不到?它似乎 abortBroadcast() 在这里不起作用,因为广播消息未排序(isOrderedBroadcast() 返回 false)。

关于android - 如何获取小区广播消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7118378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com