Android-如何成为第一个接收WAP PUSH(MMS)的人

我想拦截传入的MMS以启用移动数据.为此,我需要先拦截其他应用程序.

我已经设置了意图过滤器,以接收具有最高可能优先级的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_ACTION或WAP_PUSH_RECEIVED_ACTION),您在哪里找到此信息?

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

以最高的优先级收听WAP_PUSH_RECEIVED_ACTION是否使我成为第一个接收WAP PUSH广播的人?

谢谢

解决方法:

这个话题似乎不太受欢迎!
我试图自己回答这个问题,发现一些有趣的事情.

分析

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

这是此注释的摘要,并带有解释:

>状态机以InboundSmsHandler.IdleState状态启动.
>当SMSDispatcher从无线电接收到新的SMS时,它将调用dispatchNormalMessage(com.android.internal.telephony.SmsMessageBase),该状态将转换为InboundSmsHandler.DeliveringState状态.
>从InboundSmsHandler.DeliveringState状态,调用processMessagePart(InboundSmsTracker tracker).在此方法中,如果SMS的目标端口号是SmsHeader.PORT_WAP_PUSH(换句话说,如果SMS是MMS),则调用WapPushOverSms.dispatchWapPdu(byte [] pdu,BroadcastReceiver接收器,InboundSmsHandler处理程序)方法.
>在dispatchWapPdu方法内部,它们调用InboundSmsHandler.dispatchIntent(意图意图,字符串许可权,int appOp,BroadcastReceiver resultReceiver,UserHandle用户).他们会检查是否存在默认的MMS应用程序,如果是这样,则将意图配置为仅传递给该应用程序.

码:

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

>在dispatchIntent内部,我们有所需的内容,即对Context.sendOrderedBroadcastAsUser(…)的调用.因此,正是这种方法将WAP_PUSH_DELIVER_ACTION广播作为有序广播发送.
>也通过位于InboundSmsHandler.java中的SmsBroadcastReceiver.onReceive(Context context,Intent intent)处理程序来处理此广播(默认应用程序和SmsBroadcastReceiver).在此处理程序内部,处理WAP_PUSH_DELIVER_ACTION案例.该意图更改为WAP_PUSH_RECEIVED_ACTION,并通过InboundSmsHandler.dispatchIntent(意图意图,字符串权限,int appOp,BroadcastReceiver resultReceiver,UserHandle用户)方法再次广播.这次,不仅涉及默认应用程序,而且涉及所有感兴趣的应用程序.

码:

@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 {
        // ...
    }
}

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

收到MMS时,首先将WAP_PUSH_DELIVER_ACTION广播到默认应用程序,然后是WAP_PUSH_RECEIVED_ACTION.

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

好吧,这对我来说是个坏消息,因为这也意味着我不能成为第一个收到传入MMS通知的人,并且在通知MMS应用程序之前先打开模块化数据.

啊,谷歌,有了Lollipop,您让我们更难了:Android Issue 78084 – setMobileDataEnabled removed

因此,我必须寻找另一种方式来做到这一点.

上一篇:无法接收android.provider.Telephony.WAP_PUSH_RECEIVED


下一篇:检测是否是手机登录