2012-04-17 3 views
12

Я пытаюсь установить связь USB как хост. Я следую примерам здесь http://developer.android.com/guide/topics/usb/host.html, но я не могу заставить это работать. Вот мой код:Как связаться с устройством USB?

private static final String ACTION_USB_PERMISSION = "com.multitools.andres.LCView"; 
    UsbDevice device; 
    //Pide permisos al usuario para comunicacion con el dispositivo USB 
    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (ACTION_USB_PERMISSION.equals(action)) { 
       synchronized (this) { 
        UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
        if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { 
         if(device != null){ 
          //call method to set up device communication 
         } 
        } 
        else { 
         Log.d(TAG, "permission denied for device " + device); 
        } 
       } 
      } 
     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(DEBUG) Log.i(TAG, "onCreate() -> MainMenu"); 

     actionBar = getActionBar();      //obtengo el ActionBar 
     actionBar.setDisplayHomeAsUpEnabled(true);  //el icono de la aplicacion funciona como boton HOME 
     //Menu 
     setListAdapter(new ArrayAdapter<String>(MainMenu.this, android.R.layout.simple_list_item_1, MenuNames)); 

     //USB 
     if(DEBUG) Log.i(TAG, "Setting UsbManager -> MainMenu"); 
     UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
     PendingIntent mPermissionIntent; 

     if(DEBUG) Log.i(TAG, "Setting PermissionIntent -> MainMenu"); 
     mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); 
     if(DEBUG) Log.i(TAG, "Setting IntentFilter -> MainMenu"); 
     IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
     if(DEBUG) Log.i(TAG, "Setting registerReceiver -> MainMenu"); 
     registerReceiver(mUsbReceiver, filter); 
     if(DEBUG) Log.i(TAG, "Setting requestPermission -> MainMenu"); 
     mUsbManager.requestPermission(device, mPermissionIntent); 

    } 

Я получаю диалог Force Close, когда я раскомментировать строку mUsbManager.requestPermission(device, mPermissionIntent); Если я комментирую, я не получаю силу близко, но он не работает. Я думаю, что проблема заключается в:

private static final String ACTION_USB_PERMISSION = "com.multitools.andres.LCView"; 

На примере Google, это как:

private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; 

Но я не знаю, что именно я должен поставить там, и я не смог найти каких-либо объяснений по этому поводу. Что я должен поставить там, где моя ошибка? Вот LogCat я получаю, когда я начала моего приложения:

04-17 00:57:50.944: I/dalvikvm(1362): threadid=3: reacting to signal 3 
04-17 00:57:51.331: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 
04-17 00:57:51.981: I/(1362): onCreate() -> MainMenu 
04-17 00:57:52.013: I/dalvikvm(1362): threadid=3: reacting to signal 3 
04-17 00:57:52.151: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 
04-17 00:57:52.570: I/dalvikvm(1362): threadid=3: reacting to signal 3 
04-17 00:57:52.731: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 
04-17 00:57:53.122: I/dalvikvm(1362): threadid=3: reacting to signal 3 
04-17 00:57:53.231: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 
04-17 00:57:53.390: I/(1362): Setting UsbManager -> MainMenu 
04-17 00:57:53.451: I/(1362): Setting PermissionIntent -> MainMenu 
04-17 00:57:53.470: I/(1362): Setting IntentFilter -> MainMenu 
04-17 00:57:53.470: I/(1362): Setting registerReceiver -> MainMenu 
04-17 00:57:53.511: I/(1362): Setting requestPermission -> MainMenu 
04-17 00:57:53.660: I/dalvikvm(1362): threadid=3: reacting to signal 3 
04-17 00:57:53.791: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 
04-17 00:57:54.311: I/dalvikvm(1362): threadid=3: reacting to signal 3 
04-17 00:57:54.401: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 
04-17 00:57:54.531: I/(1362): onCreateOptionsMenu() -> MainMenu 
04-17 00:57:54.683: I/dalvikvm(1362): threadid=3: reacting to signal 3 
04-17 00:57:54.772: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 
04-17 00:57:55.186: I/dalvikvm(1362): threadid=3: reacting to signal 3 
04-17 00:57:55.291: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 
04-17 00:57:55.661: I/dalvikvm(1362): threadid=3: reacting to signal 3 
04-17 00:57:55.751: I/dalvikvm(1362): Wrote stack traces to '/data/anr/traces.txt' 
04-17 00:57:55.791: D/gralloc_goldfish(1362): Emulator without GPU emulation detected. 
04-17 01:11:47.323: I/dalvikvm(1459): threadid=3: reacting to signal 3 
04-17 01:11:47.720: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 
04-17 01:11:48.124: I/dalvikvm(1459): threadid=3: reacting to signal 3 
04-17 01:11:48.291: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 
04-17 01:11:48.452: I/(1459): onCreate() -> MainMenu 
04-17 01:11:48.691: I/dalvikvm(1459): threadid=3: reacting to signal 3 
04-17 01:11:48.813: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 
04-17 01:11:49.172: I/dalvikvm(1459): threadid=3: reacting to signal 3 
04-17 01:11:49.321: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 
04-17 01:11:49.653: I/dalvikvm(1459): threadid=3: reacting to signal 3 
04-17 01:11:49.821: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 
04-17 01:11:49.901: I/(1459): Setting UsbManager -> MainMenu 
04-17 01:11:49.931: I/(1459): Setting PermissionIntent -> MainMenu 
04-17 01:11:50.021: I/(1459): Setting IntentFilter -> MainMenu 
04-17 01:11:50.031: I/(1459): Setting registerReceiver -> MainMenu 
04-17 01:11:50.051: I/(1459): Setting requestPermission -> MainMenu 
04-17 01:11:50.071: D/AndroidRuntime(1459): Shutting down VM 
04-17 01:11:50.133: W/dalvikvm(1459): threadid=1: thread exiting with uncaught exception (group=0x409c01f8) 
04-17 01:11:50.231: I/dalvikvm(1459): threadid=3: reacting to signal 3 
04-17 01:11:50.331: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 
04-17 01:11:50.401: E/AndroidRuntime(1459): FATAL EXCEPTION: main 
04-17 01:11:50.401: E/AndroidRuntime(1459): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.multitools.andres/com.multitools.andres.MainMenu}: java.lang.NullPointerException 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.os.Looper.loop(Looper.java:137) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at dalvik.system.NativeStart.main(Native Method) 
04-17 01:11:50.401: E/AndroidRuntime(1459): Caused by: java.lang.NullPointerException 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.os.Parcel.readException(Parcel.java:1333) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.os.Parcel.readException(Parcel.java:1281) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.hardware.usb.IUsbManager$Stub$Proxy.requestDevicePermission(IUsbManager.java:535) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.hardware.usb.UsbManager.requestPermission(UsbManager.java:361) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at com.multitools.andres.MainMenu.onCreate(MainMenu.java:80) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.app.Activity.performCreate(Activity.java:4465) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
04-17 01:11:50.401: E/AndroidRuntime(1459):  ... 11 more 
04-17 01:11:50.751: I/dalvikvm(1459): threadid=3: reacting to signal 3 
04-17 01:11:50.851: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 
04-17 01:11:51.331: I/dalvikvm(1459): threadid=3: reacting to signal 3 
04-17 01:11:51.403: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 
04-17 01:11:51.774: I/dalvikvm(1459): threadid=3: reacting to signal 3 
04-17 01:11:51.961: I/dalvikvm(1459): Wrote stack traces to '/data/anr/traces.txt' 

Спасибо Вам :)

+0

Что находится в строке 80 вашего файла 'MainMenu.java'? Кажется, что эта строка выбрасывает «NullPointerException». – chandsie

+0

mUsbManager.requestPermission (устройство, mPermissionIntent); строка, что если комментарий это приложение не FC, и я думаю, это из-за частной статической окончательной строки ACTION_USB_PERMISSION = "com.multitools.andres.LCView"; потому что я не знаю, что положить туда – Andres

ответ

17

Эта строка просто маркер, чтобы вы признать намерение, который возвращается при вызове registerReceiver(mUsbReceiver, filter);. Это не проблема.

Я думаю, что проблема здесь:

UsbManager mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 

Эта линия должна получить вам ваш менеджер USB, но, насколько я помню, не все телефоны должны поддерживать API Android USB аксессуаров. Эта строка, вероятно, просто назначает null на номер mUsbManager, который затем вызывает NullPointerException, когда вы вызываете метод по нему далее в коде. Попытка проверить, не является ли это null перед тем, как позвонить ему.

Для получения дополнительной информации, Checkout эти ссылки:

  1. http://developer.android.com/guide/topics/usb/index.html
  2. http://developer.android.com/guide/topics/usb/accessory.html

EDIT:

Я думаю, я понимаю, что этот вопрос сейчас. Вы правы, это не USB-менеджер. Это объект UsbDevice (device). Он никогда не инициализируется нигде в вашем коде. В этой строке:

mUsbManager.requestPermission(device, mPermissionIntent); 

вы в основном стреляя намерение спросить пользователя, если это хорошо для вас, чтобы работать с устройством, изображенным объектом UsbDevice device. Однако при запуске этого вызова device еще не был инициализирован (и поэтому имеет значение по умолчанию null). Поэтому, когда вы пытаетесь запросить разрешение, вы получаете NullPointerException вместо ожидаемого результата. Чтобы исправить это, вам нужно выяснить, к какому устройству вы хотите подключиться, и назначить его device. Посмотрите в here, в разделе «Перечисление устройств», чтобы выяснить, как это сделать.Один из способов, если вы знаете имя устройства, которое вы хотите подключиться, чтобы сделать следующие вызовы после получения Usb-менеджер:

HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList(); 
device = deviceList.get("<deviceName>"); 

(Очевидно, что вы должны заменить <deviceName> с фактическим именем . устройство

+0

Я использовал журнал, чтобы узнать значение mUsbManager, и я понял, что это значение: [email protected], так что это не null, я тестирую эмулятор, потому что у меня нет устройство с возможностями USB Host: /, поэтому строка может быть любым именем, которое не является проблемой? – Andres

+0

Спасибо вам :) Вы правы. Я тестирую эмулятор. Теперь я помещаю этот код для проверки USB-устройств: HashMap deviceList = mUsbManager.getDeviceList(); Log.i (TAG, «Список устройств:» + список устройств); и я получаю «Список устройств: {}» на LogCat, это значит, что у меня нет подключенного устройства? – Andres

+1

Да, это правильно. Вам нужно будет подключить некоторые устройства к вашему эмулятору. Здесь [вопрос] (http://stackoverflow.com/questions/1913979/how-to-emulate-usb-devices) о том, как это сделать. – chandsie

3

minSdkVersion обязательно> = 12

Чтобы включить USB-хост API поддержку, которую вы должны добавить файл с именем android.hardware.usb.host.xml и содержащие следующие строки:

<permissions> 
<feature name="android.hardware.usb.host"/> 
+0

подробнее об этом https://github.com/452/USBHIDTerminal/wiki/How-to-enable-USB-host-API-support – pantos27

Смежные вопросы