使用aar Java插件的Unity应用授予USB权限后崩溃问题排查
问题根源
从报错栈可以明确崩溃的直接原因是调用unregisterReceiver时Context为空,核心是你对PluginInstance类的使用方式存在错误:
PluginInstance继承了Activity,但你没有通过安卓标准的Activity启动流程实例化它,只是把它当作普通Java类调用,因此它本身没有绑定有效的系统Context,在广播接收器里直接调用unregisterReceiver(mUsbReceiver)本质是调用该空Context的方法,直接触发空指针崩溃。- 代码里还存在两个隐藏的待修复问题:
GetGpios方法中你声明了局部变量Gpio lazer1,但类全局的public Gpio laser1并没有被赋值,后续调用GpioOn/GpioOff时会再次触发空指针。- 安卓12及以上版本要求创建
PendingIntent时必须显式指定FLAG_IMMUTABLE或FLAG_MUTABLE,你当前传的flag为0,在高版本系统上会抛出异常。
修复方案
- 修复广播注销空指针问题:用你已经传入的
unityActivity作为上下文执行注销操作,同时增加非空判断:
把onReceive方法中最后一行的unregisterReceiver(mUsbReceiver);替换为:
if (unityActivity != null) { unityActivity.unregisterReceiver(mUsbReceiver); }
- 修复Gpio变量未赋值问题:修改
GetGpios方法的赋值逻辑,不要声明局部变量,直接给全局变量赋值:
public void GetGpios() { NumatoUSBDevice numatoUSBDevice = mDevicesManager.getDevices().get(0); // 去掉前面的Gpio类型声明,直接给全局变量赋值 this.laser1 = numatoUSBDevice.mGpios.get(1); }
- 修复高版本安卓PendingIntent兼容问题:修改
MakeConnection方法中PendingIntent的创建逻辑:
int pendingFlag = 0; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) { pendingFlag = PendingIntent.FLAG_IMMUTABLE; } PendingIntent mPermissionIntent = PendingIntent.getBroadcast(unityContext, 0, new Intent(ACTION_USB_PERMISSION).putExtra(AppConstant.EXTRA_DEVICE_INDEX, 0), pendingFlag);
- 补充校验逻辑:调用
MakeConnection前确保已经执行了以下操作:
- 调用
receiveUnityActivity和receiveUnityContext传入了有效的Unity Activity和上下文 - 调用
InstantiateManager初始化了mDevicesManager - 调用
EnumerateDevices完成了设备枚举,设备列表不为空
内容的提问来源于stack exchange,提问作者Krykiet
相关产品推荐
相关产品推荐

