由于系统广播中的“RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED”错误,应用内更新应用在 Android 14 中崩溃

Roa*_*nmo 14 android in-app-update android-14 android-api-34

我有一个使用应用程序内更新的 Android 应用程序。以 android 14 (API 34) 为目标后,应用程序将因以下错误而无法启动:

\n
FATAL EXCEPTION: main\nProcess: no.norva24.mslam, PID: 8281\njava.lang.RuntimeException: Unable to start activity\nComponentInfo{no.norva24.mslam/no.norva24.mslam.ui.activities.MainActivity}: java.lang.SecurityException: no.norva24.mslam: One\nof RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered\nexclusively for system broadcasts\n    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3782)\n    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3922)\n    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)\n    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139)\n    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)\n    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)\n    at android.os.Handler.dispatchMessage(Handler.java:106)\n    at android.os.Looper.loopOnce(Looper.java:205)\n    at android.os.Looper.loop(Looper.java:294)\n    at android.app.ActivityThread.main(ActivityThread.java:8176)\n    at java.lang.reflect.Method.invoke(Native Method)\n    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)\nCaused by: java.lang.SecurityException: no.norva24.mslam: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED\nshould be specified when a receiver isn't being registered exclusively for system broadcasts\n    at android.os.Parcel.createExceptionOrNull(Parcel.java:3057)\n    at android.os.Parcel.createException(Parcel.java:3041)\n    at android.os.Parcel.readException(Parcel.java:3024)\n    at android.os.Parcel.readException(Parcel.java:2966)\n    at android.app.IActivityManager$Stub$Proxy.registerReceiverWithFeature(IActivityManager.java:5668)\n    at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1852)\n    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1792)\n    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1780)\n    at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:755)\n    at com.google.android.play.core.listener.zzc.zzb(com.google.android.play:core@@1.10.3:3)\n    at com.google.android.play.core.listener.zzc.zzf(com.google.android.play:core@@1.10.3:4)\n    at com.google.android.play.core.appupdate.zzf.registerListener(com.google.android.play:core@@1.10.3:1)\n    at no.norva24.mslam.utilities.updates.InAppUpdate.<init>(InAppUpdate.kt:62)\n    at no.norva24.mslam.ui.activities.MainActivity.onCreate(MainActivity.kt:741)\n    at android.app.Activity.performCreate(Activity.java:8595)\n    at android.app.Activity.performCreate(Activity.java:8573)\n    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1456)\n    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3764)\n    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3922)\xc2\xa0\n    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)\xc2\xa0\n    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139)\xc2\xa0\n    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)\xc2\xa0\n    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)\xc2\xa0\n    at android.os.Handler.dispatchMessage(Handler.java:106)\xc2\xa0\n    at android.os.Looper.loopOnce(Looper.java:205)\xc2\xa0\n    at android.os.Looper.loop(Looper.java:294)\xc2\xa0\n    at android.app.ActivityThread.main(ActivityThread.java:8176)\xc2\xa0\n\n                                                                                                        at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)\xc2\xa0\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)\xc2\xa0\nCaused by: android.os.RemoteException: Remote stack trace:\n    at\ncom.android.server.am.ActivityManagerService.registerReceiverWithFeature(ActivityManagerService.java:13895)\n    at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2563)\n    at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2708)\n    at android.os.Binder.execTransactInternal(Binder.java:1339)\n    at android.os.Binder.execTransact(Binder.java:1275)\n
Run Code Online (Sandbox Code Playgroud)\n

我还没有看到任何关于如何设置这些设置的解释。

\n

以下代码用于应用内更新:

\n
package no.norva24.mslam.utilities.updates\n\nimport android.app.Activity\nimport android.graphics.Color\nimport android.util.Log\nimport androidx.appcompat.app.AppCompatActivity\nimport com.google.android.material.snackbar.Snackbar\nimport com.google.android.play.core.appupdate.AppUpdateInfo\nimport com.google.android.play.core.appupdate.AppUpdateManager\nimport com.google.android.play.core.appupdate.AppUpdateManagerFactory\nimport com.google.android.play.core.install.InstallState\nimport com.google.android.play.core.install.InstallStateUpdatedListener\nimport com.google.android.play.core.install.model.AppUpdateType\nimport com.google.android.play.core.install.model.InstallStatus\nimport com.google.android.play.core.install.model.UpdateAvailability\nimport com.google.android.play.core.ktx.*\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport no.norva24.mslam.repositories.Message\nimport no.norva24.mslam.ui.activities.MainActivity\nimport no.norva24.mslam.utilities.definitions.SELF_UPDATE_REQUEST_CODE\nimport java.lang.Exception\n\nclass InAppUpdate(activity: Activity): InstallStateUpdatedListener {\n\n    var TAG = javaClass.simpleName\n\n    private var appUpdateManager: AppUpdateManager\n    private var parentActivity: Activity = activity\n\n    private var currentType = AppUpdateType.FLEXIBLE\n\n    init {\n        Log.i(TAG, "init: I100: Init InAppUpdate")\n\n        appUpdateManager = AppUpdateManagerFactory.create(parentActivity)\n        appUpdateManager.appUpdateInfo.addOnSuccessListener { info->\n            Log.i(TAG, "init: I100: update info $info")\n            if (info.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE){\n                Message.info("App update available !")\n                if((info.clientVersionStalenessDays?:0)<5){\n                    if(info.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)){\n                        startUpdate(info, AppUpdateType.FLEXIBLE)\n                    } else {\n                        Message.info("App update may be available on Google Play !")\n                    }\n                } else {\n                    if(info.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)){\n                        startUpdate(info, AppUpdateType.IMMEDIATE)\n                    } else if(info.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)){\n                        startUpdate(info, AppUpdateType.FLEXIBLE)\n                    } else {\n                        Message.info("App update may be available on Google Play !")\n                    }\n                }\n\n            } else {\n                Log.i(TAG, "I100: init: no update available")\n            }\n        }\n        appUpdateManager.registerListener(this)\n    }\n\n    private fun startUpdate(info: AppUpdateInfo, type: Int){\n        try {\n            appUpdateManager.startUpdateFlowForResult(info,type,parentActivity, SELF_UPDATE_REQUEST_CODE)\n            currentType = type\n        }catch (exception:Exception){\n            Message.error(exception.message.toString())\n        }\n    }\n\n    fun onResume(){\n        appUpdateManager.appUpdateInfo.addOnSuccessListener { info->\n            if(currentType == AppUpdateType.FLEXIBLE){\n                if(info.installStatus() == InstallStatus.DOWNLOADED)\n                    flexibleUpdateDownloadCompleted()\n            } else if (currentType == AppUpdateType.IMMEDIATE){\n                if(info.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {\n                    startUpdate(info, AppUpdateType.IMMEDIATE)\n                }\n            }\n        }\n    }\n\n    fun onActivityResult(requestCode: Int, resultCode: Int){\n        if(requestCode == SELF_UPDATE_REQUEST_CODE){\n            if(resultCode != AppCompatActivity.RESULT_OK){\n                Message.error("Update flow failed: $resultCode")\n            }\n        }\n    }\n\n    fun checkForUpdates(){\n        CoroutineScope(Dispatchers.IO).launch {\n            Log.i(TAG, "checkForUpdates: requesting appUpdateInfo")\n            val appUpdateInfo = appUpdateManager.requestAppUpdateInfo()\n            Log.i(TAG, "checkForUpdates: appUpdateInfo returned")\n            Log.i(TAG, "checkForUpdates: available version code..........: ${appUpdateInfo.availableVersionCode()}" )\n            Log.i(TAG, "checkForUpdates: bytes downloaded................: ${appUpdateInfo.bytesDownloaded}" )\n            Log.i(TAG, "checkForUpdates: client version staleness days...: ${appUpdateInfo.clientVersionStalenessDays}" )\n            Log.i(TAG, "checkForUpdates: install status..................: ${appUpdateInfo.installStatus}" )\n            Log.i(TAG, "checkForUpdates: is update type allowed flexible.: ${appUpdateInfo.isFlexibleUpdateAllowed}" )\n            Log.i(TAG, "checkForUpdates: is update type allowed immediate: ${appUpdateInfo.isImmediateUpdateAllowed}" )\n            Log.i(TAG, "checkForUpdates: package name ...................: ${appUpdateInfo.packageName()}" )\n            Log.i(TAG, "checkForUpdates: total bytes to download.........: ${appUpdateInfo.totalBytesToDownload}" )\n            Log.i(TAG, "checkForUpdates: update availability ............: ${appUpdateInfo.updateAvailability()}" )\n            Log.i(TAG, "checkForUpdates: update priority ................: ${appUpdateInfo.updatePriority}" )\n\n            when(appUpdateInfo.updateAvailability()){\n                UpdateAvailability.UPDATE_AVAILABLE-> {\n                    if(appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)){\n                        startUpdate(appUpdateInfo, AppUpdateType.FLEXIBLE)\n                    } else {\n                        Message.warning("App version ${appUpdateInfo.availableVersionCode()} should be ready\\nPlease check Google Play")\n                    }\n                }\n                UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS -> {\n                    Message.warning("App update is already in progress, ${appUpdateInfo.bytesDownloaded}/${appUpdateInfo.totalBytesToDownload} bytes downloaded")\n                }\n                UpdateAvailability.UNKNOWN -> {\n                    Message.error("Unknown error occurred checking updates")\n                }\n                UpdateAvailability.UPDATE_NOT_AVAILABLE -> {\n                    Message.info("No updates available at the moment")\n                }\n            }\n        }\n\n    }\n\n    private fun flexibleUpdateDownloadCompleted(){\n        Snackbar.make(\n            (parentActivity as MainActivity).binding.appBarMain.coordinatorLayout,\n            "An app update has just been downloaded. Please restart app.",\n            Snackbar.LENGTH_INDEFINITE\n        ).apply {\n            setAction("RESTART") { appUpdateManager.completeUpdate()}\n            setActionTextColor(Color.WHITE)\n            show()\n        }\n    }\n\n    fun onDestroy(){\n        appUpdateManager.unregisterListener(this)\n    }\n\n    override fun onStateUpdate(state: InstallState) {\n        if(state.installStatus() == InstallStatus.DOWNLOADED){\n            flexibleUpdateDownloadCompleted()\n        }\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

是否应该有一些附加参数manifest.xml尚未正确记录?

\n

Lin*_*ino 10

您正在使用的 Play 应用内更新库的当前版本 (1.10.3) 不支持 Android 14。您必须将其升级到支持新 Android 操作系统的版本 2.1.0。

更多信息:https ://developer.android.com/reference/com/google/android/play/core/release-notes-in_app_updates