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

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

概述我想拦截传入的MMS以启用移动数据.为此,我需要先拦截其他应用程序.我已经设置了意图过滤器,以接收具有最高可能优先级的WAP_PUSH_RECEIVED_ACTION广播.但是,在Android文档(https://developer.android.comeference/android/provider/Telephony.Sms.Intents.html)中,有以下两个广

我想拦截传入的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用户)方法再次广播.这次,不仅涉及默认应用程序,而且涉及所有感兴趣的应用程序.

码:

@OverrIDepublic 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-如何成为第一个接收WAP PUSH(MMS)的人全部内容,希望文章能够帮你解决Android-如何成为第一个接收WAP PUSH(MMS)的人所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存