gpt4 book ai didi

Android - 如何第一个收到 WAP PUSH(彩信)

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:35 27 4
gpt4 key购买 nike

我想拦截传入的彩信以启用移动数据。为此,我需要在任何其他应用程序之前拦截它们。

我已将我的 Intent 过滤器设置为接收具有最高优先级的 WAP_PUSH_RECEIVED_ACTION 广播。

但是,在 Android 文档 ( https://developer.android.com/reference/android/provider/Telephony.Sms.Intents.html ) 中,有以下两个广播:

  • WAP_PUSH_DELIVER_ACTION(仅发送至默认短信应用)
  • WAP_PUSH_RECEIVED_ACTION(发送到所有应用)

请问,您能告诉我这些广播中的哪一个先发送(WAP_PUSH_DELIVER_ACTIONWAP_PUSH_RECEIVED_ACTION)以及您在哪里找到这些信息?

他们从哪里发送 Android 源代码?

是否以尽可能高的优先级监听WAP_PUSH_RECEIVED_ACTION 让我成为第一个接收 WAP PUSH 广播的人?

谢谢

最佳答案

这个话题好像不太热门!我试着自己回答这个问题,我发现了一些有趣的东西。

分析

SMS 和 MMS 接收主要在文件 InboundSmsHandler.java 中进行管理。该文件以解释 SMS/MMS 接收状态机的注释 block 开头。

以下是此评论的摘录和解释:

  1. 状态机以 InboundSmsHandler.IdleState 状态启动。
  2. SMSDispatcher 从 radio 接收到新的 SMS 时,它会调用 dispatchNormalMessage(com.android.internal.telephony.SmsMessageBase),它会转换为 InboundSmsHandler .DeliveringState 状态。
  3. InboundSmsHandler.DeliveringState 状态,调用 processMessagePart(InboundSmsTracker tracker)。在此方法中,如果 SMS 的目标端口号是 SmsHeader.PORT_WAP_PUSH(换言之,如果 SMS 是 MMS),则 WapPushOverSms.dispatchWapPdu(byte[] pdu, BroadcastReceiver receiver , InboundSmsHandler 处理程序) 方法被调用。
  4. dispatchWapPdu 方法中,他们调用了 InboundSmsHandler.dispatchIntent(Intent intent, String permission, int appOp, BroadcastReceiver resultReceiver, UserHandle user)。他们检查是否有默认的 MMS 应用程序,如果是,则将 Intent 配置为仅传送到此应用程序。

代码:

// Direct the intent to only the default MMS app. If we can't find a default MMS app
// then sent it to all broadcast receivers.
ComponentName componentName = SmsApplication.getDefaultMmsApplication(mContext, true);
if (componentName != null) {
// Deliver MMS message only to this receiver
intent.setComponent(componentName);
if (DBG) Rlog.v(TAG, "Delivering MMS to: " + componentName.getPackageName() +
" " + componentName.getClassName());
}

handler.dispatchIntent(intent, permission, appOp, receiver, UserHandle.OWNER);
  1. dispatchIntent 中,我们有我们正在寻找的东西,调用 Context.sendOrderedBroadcastAsUser(...)。因此,正是这种方法将 WAP_PUSH_DELIVER_ACTION 广播作为有序广播发送。
  2. 此广播也由位于 InboundSmsHandler.java< 中的 SmsBroadcastReceiver.onReceive(Context context, Intent intent) 处理程序处理(默认应用程序和 SmsBroadcastReceiver)/。在此处理程序中,处理 WAP_PUSH_DELIVER_ACTION 情况。 Intent 更改为 WAP_PUSH_RECEIVED_ACTION 并通过 InboundSmsHandler.dispatchIntent(Intent intent, String permission, int appOp, BroadcastReceiver resultReceiver, UserHandle user) 方法再次广播。这一次,不仅关注默认应用,还关注所有感兴趣的应用。

代码:

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intents.SMS_FILTER_ACTION)) {
// ...
} else if (action.equals(Intents.SMS_DELIVER_ACTION)) {
// ...
} else if (action.equals(Intents.WAP_PUSH_DELIVER_ACTION)) {
// Now dispatch the notification only intent
intent.setAction(Intents.WAP_PUSH_RECEIVED_ACTION);
intent.setComponent(null);
// Only the primary user will receive notification of incoming mms.
// That app will do the actual downloading of the mms.
dispatchIntent(intent, android.Manifest.permission.RECEIVE_SMS,
AppOpsManager.OP_RECEIVE_SMS, this, UserHandle.OWNER);
} else {
// ...
}
}

结论(对原始问题的快速回答)

收到彩信后,WAP_PUSH_DELIVER_ACTION 首先广播到默认应用,然后是 WAP_PUSH_RECEIVED_ACTION

这两个广播都是有序广播,这意味着可以使用优先级。

嗯,这对我来说是个坏消息,因为这也意味着我不能第一个收到彩信通知,也不能在彩信应用收到通知之前打开调制数据。

啊谷歌,有了 Lollipop,你让我们的事情变得更难了:Android Issue 78084 - setMobileDataEnabled removed

所以,我必须寻找另一种方法才能做到这一点。

关于Android - 如何第一个收到 WAP PUSH(彩信),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28623745/

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