Android 12 targetSDKVersion 31 挑战(广播接收器、待定意图)崩溃问题

问题描述 投票:0回答:3

以下是我迄今为止在操作系统版本为 Android 12 的手机上运行带有 targetSDKVersion 31

的 Android 应用程序时遇到的挑战

1) 应用程序未上传到商店 错误:- 您上传的 APK 或 Android 应用程序包具有带有意图过滤器的活动、活动别名、服务或广播接收器,但未设置 'android:exported' 属性。此文件无法安装在 Android 12 或更高版本上。请参阅:developer.android.com/about/versions/12/behavior-changes-12#exported

2) 应用程序崩溃了 java.lang.IllegalArgumentException:面向 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一。 强烈考虑使用 FLAG_IMMUTABLE,仅当某些功能依赖于 PendingIntent 可变时才使用 FLAG_MUTABLE,例如如果需要与内联回复或气泡一起使用。 所有待处理意图都需要 FLAG_IMMUTABLE / FLAG_MUTABLE 标签

请帮忙解决这些问题??????

android broadcastreceiver android-service android-pendingintent targetsdkversion
3个回答
3
投票

1)应用程序未上传到存储错误:-您上传了一个 APK 或 Android 应用程序包,其中包含带有意图过滤器的活动、活动别名、服务或广播接收器,但未设置“android:exported”属性。此文件无法安装在 Android 12 或更高版本上。请参阅:developer.android.com/about/versions/12/behavior-changes-12#exported

解决方案:- 从 12 开始,如果应用程序的 AndroidManifest.xml 或任何库中的任何活动/服务/接收器正在使用意图过滤器,那么它应该明确指定 android:exported 标记。您可以在 AndroidManifest.xml 中选择 MergerManifest 选项来识别哪个库具有服务和活动。

2) 应用程序崩溃了 java.lang.IllegalArgumentException:面向 S+(版本 31 及更高版本)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一。 强烈考虑使用 FLAG_IMMUTABLE,仅当某些功能依赖于 PendingIntent 可变时才使用 FLAG_MUTABLE,例如如果需要与内联回复或气泡一起使用。 所有待处理意图都需要 FLAG_IMMUTABLE / FLAG_MUTABLE 标签

解决方案:- 为所有 PendingIntents 添加 FLAG_IMMUTABLE。如果您的 PendingIntent 已经有一个标志,则使用 | 附加该标志。例如:- FLAG_UPDATE_CURRENT | FLAG_IMMUTABLEFLAG_CANCEL_CURRENT | FLAG_IMMUTABLE


3
投票

android 12迁移解决方案

在 Android 12 中,我们需要进行一些主要的代码更改:

  • 我们需要导出所有活动和其他应用程序组件,我们需要 使启动器导出为 true

    android:exported="true"

  • 我们需要为待处理的意图对象设置不可变或可变标志。

    val intent = Intent(this, AlarmReceiver::class.java) val pendingIntent = PendingIntent.getBroadcast( this,  ALARM_SERVICE_CODE, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT )

我最近迁移了我的应用程序,并在此处列出了完整的迁移过程以及这些崩溃的解决方案

解决方案:https://medium.com/native-mobile-bits/lets-use-android-12-migration-of-our-android-apps-to-android12-api-31-af329b6829d0

解决方案:我还在我的Youtube上展示了我的项目迁移到Android 12。我在这里解决所有这些问题 https://www.youtube.com/watch?v=X9IfLFLaVKI


0
投票

对于大多数老开发人员来说,这是非常奇怪的错误之一 以下 3 个解决方案

1.android:exported'属性集 您的应用程序的 AndroidManifest.xml 或任何库中的活动/服务/接收器正在使用意图过滤器,那么它应该明确指定 android:exported 标记。

     <activity
                android:name="com.example.MainActivity"
                android:exported="true"
                android:screenOrientation="portrait">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>



  

   <service
        android:name="com.example.ServiceControl"
        android:exported="false"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"/>
     

2.瞄准S+ 如果您的目标是 S+,请

PendingIntent activity;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            activity = PendingIntent.getActivity(this,
                    0, new Intent(this, Your Class.class),
                    PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
        } else {
            activity = PendingIntent.getActivity(this,
                    0, new Intent(this, Your Class.class),
                    PendingIntent.FLAG_UPDATE_CURRENT);
        }

3.如果上述方法不起作用,最后一个神奇的解决方案 在 build.gradle 中添加以下行

实现'androidx.work:work-runtime:2.7.1'

© www.soinside.com 2019 - 2024. All rights reserved.