How to grant permission to open usb device with usb manager? openDevice() always returns null

前端 未结 1 1699
被撕碎了的回忆
被撕碎了的回忆 2021-01-05 08:34

I want to use a usb device in the following code. It successfully lists the usb devices and iterates over them. In the following code the object \"device\" is the usbdevice

相关标签:
1条回答
  • 2021-01-05 09:36

    At last I fixed it after trying several suggestions. I found that adding the intent filter in manifest does not solve the permission issue for unknown reasons. It's sounds like a bug of the Xamarin. To tell the truth, It seems that Xamarin usb namespace is too naive, and its better you do not waste your time to use that for USB management and connection. It also has some other annoying limitations. For example look at here. (So I suggest to write low level usb communication codes in java and import the jar file in xamarin by JNI, I tired it and I should say It's a lot easier than it seemed at first time)

    To grant the permission of opening the usb device, you have to use the grantPermission() method. The following code shows how to use the method and BroadcastReceiver to pop up a dialog asking the user to let the usb usage.

     public class MainActivity : Activity
    {
        private static String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
        UsbDevice device; 
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
    
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            UsbManager manager = (UsbManager)GetSystemService(Context.UsbService);
    
            UsbReciever usbReciever = new UsbReciever();
            PendingIntent mPermissionIntent = PendingIntent.GetBroadcast(this, 0, new Intent(
                ACTION_USB_PERMISSION), 0);
            IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
            RegisterReceiver(usbReciever, filter);
    
            foreach (var dev in manager.DeviceList)
            {
                if (dev.Value.VendorId == 8192)
                {
                    device = dev.Value;
                }
            }
            manager.RequestPermission(device, mPermissionIntent);
            bool hasPermision = manager.HasPermission(device);
    
            UsbDeviceConnection connection = manager.OpenDevice(device);
            if (connection == null)
            {
                return;
            }
            Button button = FindViewById<Button>(Resource.Id.MyButton);
        }
        class UsbReciever : BroadcastReceiver
        {
            public override void OnReceive(Context context, Intent intent)
            {
                String action = intent.Action;
                if (ACTION_USB_PERMISSION.Equals(action))
                {
                    lock (this)
                    {
                        UsbDevice device = (UsbDevice)intent
                                .GetParcelableExtra(UsbManager.ExtraDevice);
    
                        if (intent.GetBooleanExtra(
                                UsbManager.ExtraPermissionGranted, false))
                        {
                            if (device != null)
                            {
                                // call method to set up device communication
                            }
                        }
                        else
                        {
    
                        }
                    }
                }
            }
        }
    
    
    }
    
    0 讨论(0)
提交回复
热议问题