Сбой приложения после предоставления разрешения USB — приложение Unity с использованием плагина aar java

#java #android #unity3d #plugins #android-permissions

Вопрос:

Я создаю приложение Unity, которое будет управлять контроллером Numato GPIO с питанием от USB через USB-подключение смартфона. Так как мне нужно подключить контроллер к телефону, у меня нет журнала отладки, поэтому я понятия не имею, что происходит. Таким образом, я включаю код плагина и пользовательский манифест, который я использую в Unity.

Приложение спрашивает меня, хочу ли я предоставить разрешение на управление устройством (показывает правильное имя устройства и т. Д.), И после предоставления разрешения приложение немедленно аварийно завершает работу.

Есть ли способ проверить, что вызывает ошибку? Или, может быть, я не вижу здесь чего-то очевидного.

 public class PluginInstance extends Activity { private static Activity unityActivity; private static Context unityContext; public Gpio laser1;  public static void receiveUnityActivity(Activity tActivity) {  unityActivity = tActivity; } public static void receiveUnityContext(Context tContext) { unityContext = tContext; } //Debugging purposes public void Toast(String msg) {  Toast.makeText(unityActivity, msg, Toast.LENGTH_SHORT).show(); }  //Action Usb Permission public static final String ACTION_USB_PERMISSION = "com.unity3d.player.UnityPlayerActivity.USB_PERMISSION"; public DevicesManager mDevicesManager;  //USB permission public final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {   public void onReceive(Context context, Intent intent) {  String action = intent.getAction();  if (ACTION_USB_PERMISSION.equals(action)) {  synchronized (this) {  UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);   if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {  if (device != null) {  Bundle deviceIndexBundle = intent.getExtras();  if (deviceIndexBundle == null) {  return;  }  int deviceIndex = deviceIndexBundle.getInt(AppConstant.EXTRA_DEVICE_INDEX);  Toast.makeText(unityActivity, "Usb permission granted", Toast.LENGTH_SHORT).show();  }  } else {  Toast.makeText(unityActivity, "Usb permission declined", Toast.LENGTH_SHORT).show();  }  unregisterReceiver(mUsbReceiver);  }  }  } };   public void InstantiateManager() {  mDevicesManager = DevicesManager.getInstance(); }  public void GetGpios() {  NumatoUSBDevice numatoUSBDevice = mDevicesManager.getDevices().get(0);  Gpio lazer1 = numatoUSBDevice.mGpios.get(1); }  public void GpioOn() {  laser1.setCurrentOutputState(true);  laser1.setState(true); }  public void GpioOff() {  laser1.setCurrentOutputState(false);  laser1.setState(false); }  public void EnumerateDevices() {  UsbManager manager = (UsbManager) unityActivity.getSystemService(Context.USB_SERVICE);  int index = 0;  ArrayListlt;UsbDevicegt; cdcAcmDevices = CdcAcmDriver.ListDevices(manager);  mDevicesManager.clearDevices();  ArrayListlt;Integergt; supportedDevices = NumatoUSBDevice.GetSupportedProductIds();  if(!cdcAcmDevices.isEmpty()){  for (UsbDevice cdcAcmDevice : cdcAcmDevices){  int vendorId = cdcAcmDevice.getVendorId();   if(vendorId == NumatoUSBDevice.VID_NUMATOLAB amp;amp; supportedDevices.contains(cdcAcmDevice.getProductId())){  mDevicesManager.addDevice(new NumatoUSBDevice(index, cdcAcmDevice, manager));  index  ;  }  }  } }  public void MakeConnection() {  NumatoUSBDevice numatoUSBDevice = mDevicesManager.getDevices().get(0);  UsbManager manager = (UsbManager) unityActivity.getSystemService(Context.USB_SERVICE);  //TODO unityContext in mPermissionIntent  PendingIntent mPermissionIntent = PendingIntent.getBroadcast(unityContext, 0,  new Intent(ACTION_USB_PERMISSION).putExtra(AppConstant.EXTRA_DEVICE_INDEX, 0), 0);  IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);  unityActivity.registerReceiver(mUsbReceiver, filter);  manager.requestPermission(numatoUSBDevice.getDevice(), mPermissionIntent);  }  }  

И файл манифеста:

 lt;?xml version="1.0" encoding="utf-8"?gt; lt;!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN--gt; lt;manifest  xmlns:android="http://schemas.android.com/apk/res/android"  package="com.unity3d.player"  xmlns:tools="http://schemas.android.com/tools"gt;  lt;applicationgt;  lt;activity android:name="com.unity3d.player.UnityPlayerActivity"  android:theme="@style/UnityThemeSelector"gt;  lt;intent-filtergt;  lt;action android:name="android.intent.action.MAIN" /gt;  lt;category android:name="android.intent.category.LAUNCHER" /gt;  lt;/intent-filtergt;   lt;intent-filtergt;  lt;action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/gt;  lt;/intent-filtergt;   lt;meta-data  android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"  android:resource="@xml/device_filter"/gt;    lt;/activitygt;  lt;/applicationgt; lt;/manifestgt;  

Edit: I managed to access debug log through wifi and this is what I get:

 FATAL EXCEPTION: main Process: com.jonquil.A2NumatoController, PID: 16837 java.lang.RuntimeException: Error receiving broadcast Intent { act=com.unity3d.player.UnityPlayerActivity.USB_PERMISSION flg=0x10 (has extras) } in com.jonquil.unityplugin.PluginInstance$1@7d45921  at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1689)  at android.app.LoadedApk$ReceiverDispatcher$Args$ExternalSyntheticLambda0.run(Unknown Source:2)  at android.os.Handler.handleCallback(Handler.java:938)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loopOnce(Looper.java:201)  at android.os.Looper.loop(Looper.java:288)  at android.app.ActivityThread.main(ActivityThread.java:7838)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.content.Context.unregisterReceiver(android.content.BroadcastReceiver)' on a null object reference  at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:769)  at com.jonquil.unityplugin.PluginInstance$1.onReceive(PluginInstance.java:63)  at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1679)  ... 9 more  

This looks like there is a problem with broadcast receiver since error is caused by invoking method on a null object reference.