关于SecurityException RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED

关于SecurityException RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED

https://github.com/android/play-billing-samples/issues/618

https://issuetracker.google.com/issues/277822279

java.lang.SecurityException: com.mercandalli.android.apps.sample: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts
Caused by: java.lang.SecurityException: com.mercandalli.android.apps.sample: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts
	at android.os.Parcel.createExceptionOrNull(Parcel.java:3057)
	at android.os.Parcel.createException(Parcel.java:3041)
	at android.os.Parcel.readException(Parcel.java:3024)
	at android.os.Parcel.readException(Parcel.java:2966)
	at android.app.IActivityManager$Stub$Proxy.registerReceiverWithFeature(IActivityManager.java:5372)
	at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1851)
	at android.app.ContextImpl.registerReceiver(ContextImpl.java:1791)
	at android.app.ContextImpl.registerReceiver(ContextImpl.java:1779)
	at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:754)
	at com.android.billingclient.api.zzn.zzc(com.android.billingclient:billing@@5.2.0:1)
	at com.android.billingclient.api.zzo.zze(com.android.billingclient:billing@@5.2.0:3)
	at com.android.billingclient.api.BillingClientImpl.startConnection(com.android.billingclient:billing@@5.2.0:36)

这个例子里,是调用到

IActivityManager$Stub$Proxy.registerReceiverWithFeature(IActivityManager.java:5393)

在server端写入了Exception,

查看源码 https://cs.android.com/?hl=zh-cn

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

            // Don't enforce the flag check if we're EITHER registering for only protected
            // broadcasts, or the receiver is null (a sticky broadcast). Sticky broadcasts should
            // not be used generally, so we will be marking them as exported by default
            final boolean requireExplicitFlagForDynamicReceivers = CompatChanges.isChangeEnabled(
                    DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED, callingUid);
            if (!onlyProtectedBroadcasts) {
                if (receiver == null && !explicitExportStateDefined) {
                    // sticky broadcast, no flag specified (flag isn't required)
                    flags |= Context.RECEIVER_EXPORTED;
                } else if (requireExplicitFlagForDynamicReceivers && !explicitExportStateDefined) {
                    throw new SecurityException(
                            callerPackage + ": One of RECEIVER_EXPORTED or "
                                    + "RECEIVER_NOT_EXPORTED should be specified when a receiver "
                                    + "isn't being registered exclusively for system broadcasts");
                    // Assume default behavior-- flag check is not enforced
                } else if (!requireExplicitFlagForDynamicReceivers && (

可以根据抛异常的原因去分析处理

你可能感兴趣的:(android)