#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.