Android SDK 35升级后DJI SDK触发RECEIVER_EXPORTED相关SecurityException求助
解决升级Android SDK 35后DJI SDK引发的广播接收器SecurityException
问题背景
把Android SDK从33升级到35后,Google Play预启动报告里抛出了SecurityException,错误提示广播接收器必须指定RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED(非系统专属广播场景)。从错误栈能看出,问题出在DJI SDK的UsbAccessoryService.registerAoaReceiver方法——它动态注册广播时没加这两个属性中的任何一个。
解决思路
1. 优先升级DJI SDK到最新兼容版
DJI官方已经针对Android 14(SDK 34及以上)的广播权限要求更新了SDK,直接升级到最新稳定版就能解决这个问题,新版本会自动处理广播注册时的导出属性,这是最省心的方案。
2. 静态注册USB相关广播接收器(临时方案)
如果暂时没法升级SDK,可以尝试把DJI SDK动态注册的USB广播改成静态注册:
- 在
AndroidManifest.xml里添加对应的广播接收器,明确指定android:exported属性(根据实际需求选true或false):
<receiver android:name="dji.midware.usb.P3.UsbAccessoryReceiver" <!-- 替换为DJI SDK中实际的接收器类名 --> android:exported="true"> <intent-filter> <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" /> <action android:name="android.hardware.usb.action.USB_ACCESSORY_DETACHED" /> </intent-filter> </receiver>
注意:如果DJI SDK内部的动态注册逻辑没法绕过,这个方案可能不生效,而且长期来看还是得升级SDK。
3. 临时降级targetSdkVersion(不推荐)
要是赶上线,可以暂时把targetSdkVersion降回33,但这只是权宜之计,Google后续会强制要求适配更高版本,最终还是得升级SDK解决根本问题。
错误日志
Exception java.lang.SecurityException: com.kuzu.drone: 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:3183) at android.os.Parcel.createException (Parcel.java:3167) at android.os.Parcel.readException (Parcel.java:3150) at android.os.Parcel.readException (Parcel.java:3092) at android.app.IActivityManager$Stub$Proxy.registerReceiverWithFeature (IActivityManager.java:5860) at android.app.ContextImpl.registerReceiverInternal (ContextImpl.java:1853) at android.app.ContextImpl.registerReceiver (ContextImpl.java:1793) at android.app.ContextImpl.registerReceiver (ContextImpl.java:1781) at android.content.ContextWrapper.registerReceiver (ContextWrapper.java:757) at dji.midware.usb.P3.UsbAccessoryService.registerAoaReceiver at dji.midware.dgh.fdd at dji.sdksharedlib.fdd.fdd at dji.sdk.sdkmanager.DJISDKManager.initParams at dji.sdk.sdkmanager.DJISDKManager.initSDKManager at dji.sdk.sdkmanager.DJISDKManager.registerApp at dji.sdk.sdkmanager.DJISDKManager.access$1400 at dji.sdk.sdkmanager.DJISDKManager$8.onDownloadSuccess at dji.internal.jhg.fdd.fdd at dji.sdk.sdkmanager.DJISDKManager.lambda$registerApp$2 at dji.sdk.sdkmanager.DJISDKManager$$Lambda$4.run at dji.sdksharedlib.dgh.dgh$fdd.run at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:644) at java.lang.Thread.run (Thread.java:1012) Caused by android.os.RemoteException: Remote stack trace: at com.android.server.am.ActivityManagerService.registerReceiverWithFeature (ActivityManagerService.java:14467) at android.app.IActivityManager$Stub.onTransact (IActivityManager.java:2648) at com.android.server.am.ActivityManagerService.onTransact (ActivityManagerService.java:2822) at android.os.Binder.execTransactInternal (Binder.java:1500) at android.os.Binder.execTransact (Binder.java:1444)
内容的提问来源于stack exchange,提问作者makkuzu
相关产品推荐
相关产品推荐

