2015-01-25 1 views
2

Я хочу использовать USB-устройство в следующем коде. Он успешно отображает устройства USB и выполняет итерации по ним. В следующем коде объект «устройство» - это usbdevice, который мне нужно открыть. Все кажется ОК, кроме метода OpenDevice(), который всегда возвращает нулевое значение !Как предоставить разрешение на открытие устройства USB с помощью usb-менеджера? openDevice() всегда возвращает null

[Activity(Label = "TestApp", MainLauncher = true, Icon = "@drawable/icon")] 
[IntentFilter(new[] {UsbManager.ActionUsbDeviceAttached})] 
[MetaData(UsbManager.ActionUsbDeviceAttached, Resource = "@xml/device_filter")] 

public class MainActivity : Activity 
{ 
    int count = 1; 
    { 
     base.OnCreate(bundle); 

     // Set our view from the "main" layout resource 
     SetContentView(Resource.Layout.Main); 
     UsbManager manager = (UsbManager)GetSystemService(Context.UsbService); 
     UsbDevice device = null; 
     foreach (var dev in manager.DeviceList) 
     { 
      if (dev.Value.VendorId == 5401) 
      { 
       device = dev.Value; 
      } 
     } 
     var connection = manager.OpenDevice(device); 
     // Read some data! Most have just one port (port 0). 
    } 

device_filter.xml содержит следующие строки:

<?xml version="1.0" encoding="utf-8" ?> 
<resources> 
    <usb-device product-id="8704" vendor-id="5401" /> 
</resources> 

Когда я попытался BOOL hasPermision = manager.HasPermission (устройство); Я видел, что hasPermission является ложным. Может ли кто-нибудь сказать мне, как я могу предоставить разрешение на открытие устройства USB в xamarin? Спасибо за любую помощь.

ответ

6

Наконец-то я исправил его после нескольких предложений. Я обнаружил, что добавление фильтра намерений в манифест не устраняет проблему разрешения по неизвестным причинам. Это звучит как ошибка Xamarin. Честно говоря, кажется, что пространство имен Xamarin usb слишком наивно, и чем лучше вы не тратите свое время, чтобы использовать его для управления USB и подключения. У него также есть некоторые другие досадные ограничения. Например, посмотрите на here. (Поэтому я предлагаю писать коды связи с низким уровнем usb в java и импортировать jar-файл в xamarin JNI, я устал, и я должен сказать, что это намного проще, чем казалось в первый раз)

Предоставить разрешение открывая USB-устройство, вы должны использовать метод grantPermission(). Следующий код показывает, как использовать метод и BroadcastReceiver, чтобы открыть диалоговое окно с просьбой разрешить использование usb.

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

Что это за использование ** com.android.example.USB_PERMISSION **? – JUL2791

+0

@ i-Droid Перед тем как связаться с устройством USB, ваше приложение должно иметь разрешение от ваших пользователей. Примечание. Если ваше приложение использует фильтр намерений для обнаружения USB-устройств по мере их подключения, оно автоматически получает разрешение, если пользователь разрешает вашему приложению обрабатывать намерение. Если нет, вы должны запросить разрешение явно в своем приложении перед подключением к устройству. Обратитесь к: https://developer.android.com/guide/topics/connectivity/usb/host.html –

+0

OK..thanks..и это должно быть в названии пакета ??? – JUL2791