安卓系统从未发送WAP_PUSH_DELIVER意图

5
我花了5个小时试图让自定义的MMS广播接收器工作。我在Google和Stackoverflow上搜索了无数看似重复的帖子,但是没有一个解决方法或建议可行。
一些随机调试注释:
  • 该应用已被设置为默认短信应用,并且已授予权限。
  • 通过Google的Messenger验证了RCS已被禁用。
  • DUT是最新软件更新的Pixel 3 XL。
  • 测试了许多第三方SMS/MMS应用程序,几乎所有应用都无法接收MMS,但Pulse可以。 Pulse的开发人员提供了一个开源MMS库。我尝试过利用这个库,但没有成功。核心问题似乎是WAP_PUSH_DELIVER意图未发送到我的应用程序。
  • 解码Pulse应用程序以查看其AndroidManifest.xml并在我的应用程序中尝试一些不同的更改。没有成功。
  • 测试MMS通过遗留Hangouts的Google Voice帐户发送,以及来自各种运营商的其他Android手机。
  • SMS可以正常接收,包括SMS_RECEIVEDSMS_DELIVER(如果该应用程序是默认的SMS应用程序)。
  • 如果该应用程序不是默认的SMS应用程序,则会接收到WAP_PUSH_RECEIVED事件。
  • 如果该应用程序默认的SMS应用程序,则不会接收到WAP_PUSH_DELIVER事件。
  • 安装了Intent Intercepter并运行$ adb logcat | fgrep -i intent以验证是否记录了任何权限问题。没有。

MmsReceiver:

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中记录。
1个回答

2

让你的应用成为默认短信应用程序

在Android 4.4上,只有一个应用程序可以接收新的SMS_DELIVER_ACTION意图,这是系统在新的短信消息到达时广播的。哪个应用程序接收此广播取决于用户在系统设置中选择的默认SMS应用程序。同样,只有默认的SMS应用程序在新的WAP_PUSH_DELIVER_ACTION意图到达时接收新的MMS。

看起来你的应用程序不是默认的默认短信应用程序。因此,您无权监听传入广播。

你需要做的是引导用户选择你的应用程序作为默认值。就像官方文档所说:

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强调:

此intent仅会被传递到默认的短信应用程序。


正如我在我的问题中提到的,这个应用程序被设置为默认的短信应用。然而,这个答案不幸不能帮助解决问题。 - Basic Coder
@BasicCoder 我提到了“你的应用程序似乎不是默认的短信应用程序”,这并不是一定的问题目标,但我认为是这样。 - A Farmanbar
不确定您想要查看哪些代码,因为该应用程序基本上仅由清单和一堆空接收器组成... - Basic Coder
@BasicCoder 如果应用程序不是默认的短信应用程序,则会收到WAP_PUSH_RECEIVED事件。如果应用程序是默认的短信应用程序,则不会收到WAP_PUSH_DELIVER事件。您能否在问题中进一步解释这两个事件?并且您想要什么具体内容? - A Farmanbar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接