You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用aar Java插件的Unity应用授予USB权限后崩溃问题排查

问题根源

从报错栈可以明确崩溃的直接原因是调用unregisterReceiver时Context为空,核心是你对PluginInstance类的使用方式存在错误:

  • PluginInstance继承了Activity,但你没有通过安卓标准的Activity启动流程实例化它,只是把它当作普通Java类调用,因此它本身没有绑定有效的系统Context,在广播接收器里直接调用unregisterReceiver(mUsbReceiver)本质是调用该空Context的方法,直接触发空指针崩溃。
  • 代码里还存在两个隐藏的待修复问题:
    1. GetGpios方法中你声明了局部变量Gpio lazer1,但类全局的public Gpio laser1并没有被赋值,后续调用GpioOn/GpioOff时会再次触发空指针。
    2. 安卓12及以上版本要求创建PendingIntent时必须显式指定FLAG_IMMUTABLE或FLAG_MUTABLE,你当前传的flag为0,在高版本系统上会抛出异常。
修复方案
  1. 修复广播注销空指针问题:用你已经传入的unityActivity作为上下文执行注销操作,同时增加非空判断:
    把onReceive方法中最后一行的unregisterReceiver(mUsbReceiver);替换为:
if (unityActivity != null) {
    unityActivity.unregisterReceiver(mUsbReceiver);
}
  1. 修复Gpio变量未赋值问题:修改GetGpios方法的赋值逻辑,不要声明局部变量,直接给全局变量赋值:
public void GetGpios() {
    NumatoUSBDevice numatoUSBDevice = mDevicesManager.getDevices().get(0);
    // 去掉前面的Gpio类型声明,直接给全局变量赋值
    this.laser1 = numatoUSBDevice.mGpios.get(1);
}
  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);
  1. 补充校验逻辑:调用MakeConnection前确保已经执行了以下操作:
  • 调用receiveUnityActivity和receiveUnityContext传入了有效的Unity Activity和上下文
  • 调用InstantiateManager初始化了mDevicesManager
  • 调用EnumerateDevices完成了设备枚举,设备列表不为空

内容的提问来源于stack exchange,提问作者Krykiet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:54:10