android - Android 系统从未发送 WAP_PUSH_DELIVER Intent

标签 android android-intent android-permissions mms

我花了 5 个小时尝试使自定义 MMS 广播接收器工作。我在 Stackoverflow 上搜索并搜索了无数看似重复的线程,但没有解决方法或建议的解决方案。

一些随机调试说明:

  • 该应用程序设置为默认短信应用程序并授予所有权限。
  • 已通过 Google 的 Messenger 验证 RCS 已禁用。
  • DUT 是具有最新软件更新的 Pixel 3 XL。
  • 测试了很多3P短信/彩信app,几乎都收不到彩信,Pulse做。 Pulse 的开发人员提供了一个开源 MMS 库。我尝试利用这个库但没有成功。核心问题似乎是 WAP_PUSH_DELIVER Intent 不会发送到我的应用程序。
  • 解码 Pulse 应用程序以查看其 AndroidManifest.xml并尝试对我的一些不同的更改。没有成功。
  • 测试彩信是通过 Google Voice 帐户通过旧版 Hangouts 和其他 Android 手机通过各种运营商发送的。
  • 短信都可以正常接收SMS_RECEIVEDSMS_DELIVER (如果应用程序是默认的 SMS 应用程序)。
  • WAP_PUSH_RECEIVED如果应用程序是 ,则接收事件不是 默认短信一
  • WAP_PUSH_DELIVER如果应用程序 未收到事件是 默认短信一
  • 已安装 Intent Intercepter并运行 $ adb logcat | fgrep -i intent验证是否记录了任何权限问题。没有。

  • 彩信接收器:
    public class MmsReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("MMS Received: " + intent.getAction());
        }
    }
    

    显现:


    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />
    <uses-permission android:name="android.permission.BROADCAST_WAP_PUSH" />
    <uses-permission android:name="android.permission.BROADCAST_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
    <uses-permission android:name="android.permission.WRITE_APN_SETTINGS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.provider.Telephony.SMS_RECEIVED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.SEND" />
                    <action android:name="android.intent.action.SENDTO" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
    
                    <data android:scheme="sms" />
                    <data android:scheme="smsto" />
                    <data android:scheme="mms" />
                    <data android:scheme="mmsto" />
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <receiver
                android:name=".SmsReceiver"
                android:permission="android.permission.BROADCAST_SMS">
                <intent-filter>
                    <action android:name="android.provider.Telephony.SMS_DELIVER" />
                </intent-filter>
            </receiver>
    
            <receiver
                android:name=".MmsReceiver"
                android:permission="android.permission.BROADCAST_WAP_PUSH">
                <intent-filter>
                    <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
                    <data android:mimeType="application/vnd.wap.mms-message" />
                </intent-filter>
            </receiver>
    
            <service
                android:name=".HeadlessSmsSendService"
                android:exported="true"
                android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE" >
                <intent-filter>
                    <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
                    <category android:name="android.intent.category.DEFAULT" />
    
                    <data android:scheme="sms" />
                    <data android:scheme="smsto" />
                    <data android:scheme="mms" />
                    <data android:scheme="mmsto" />
                </intent-filter>
            </service>
        </application>
    
    </manifest>
    

    不用说,Logcat 中没有记录该消息。

    最佳答案

    Make your app the default SMS app

    On Android 4.4, only one app can receive the new SMS_DELIVER_ACTION intent, which the system broadcasts when a new SMS message arrives. Which app receives this broadcast is determined by which app the user has selected as the default SMS app in system settings. Likewise, only the default SMS app receives the new WAP_PUSH_DELIVER_ACTION intent when a new MMS arrives.



    看起来您的应用不是默认的默认短信应用。因此,不允许您收听传入的广播。

    您需要的是导航用户选择您的应用程序作为默认值。就像官方文档所说的那样:
    public class ComposeSmsActivity extends Activity {
    
        @Override
        protected void onResume() {
            super.onResume();
    
            final String myPackageName = getPackageName();
            if (!Telephony.Sms.getDefaultSmsPackage(this).equals(myPackageName)) {
                // App is not default.
                // Show the "not currently set as the default SMS app" interface
                View viewGroup = findViewById(R.id.not_default_app);
                viewGroup.setVisibility(View.VISIBLE);
    
                // Set up a button that allows the user to change the default SMS app
                Button button = (Button) findViewById(R.id.change_default_app);
                button.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        Intent intent =
                                new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
                        intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, 
                                myPackageName);
                        startActivity(intent);
                    }
                });
            } else {
                // App is the default.
                // Hide the "not currently set as the default SMS app" interface
                View viewGroup = findViewById(R.id.not_default_app);
                viewGroup.setVisibility(View.GONE);
            }
        }
    }
    

    还有,WAP_PUSH_DELIVER_ACTION强调

    This intent will only be delivered to the default sms app

    关于android - Android 系统从未发送 WAP_PUSH_DELIVER Intent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59490729/

    相关文章:

    android - 在 2 个 Activity 之间传递图像的更好方法是什么?保存到文件还是缓存?

    Android - 如何导航 Activity 堆栈/任务

    android - 如何获取带有 Activity 名称的 Activity 图标

    android - API 23中的Android权限正常权限和危险权限列表?

    android - 在后台运行时显示弹出窗口的权限

    android - 没有注册访问者。通用补间引擎

    android - 如何从其他 View 的事件访问 View ( View 在布局层次结构中的不同分支中)?

    android - "Write settings"权限未授予 marshmallow android

    java - 动态更改十六进制整数的 alpha 值

    android - 存储一长串坐标的最佳方式?