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
因此,我必须寻找另一种方式来做到这一点.
标签:wap,push,mms,android,broadcast 来源: https://codeday.me/bug/20191028/1953978.html