2012-04-17 4 views
12

Próbuję ustanowić komunikację USB jako host. Podążam za przykładami tutaj http://developer.android.com/guide/topics/usb/host.html, ale nie mogę tego uruchomić. Tu jest mój kodu:Jak komunikować się z urządzeniem 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); 

    } 

pojawia się okno dialogowe Siła Zamknij kiedy odkomentuj linię mUsbManager.requestPermission(device, mPermissionIntent); Gdybym skomentować go, nie mam siły się blisko, ale nie robi praca. Myślę, że problem jest w:

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

Na przykład Google to tak:

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

ale nie wiem co dokładnie muszę tam umieścić i nie mogłem znaleźć żadnego wyjaśnienia na ten temat. Co muszę tam umieścić lub gdzie jest mój błąd? Oto LogCat Dostaję podczas uruchamiania aplikacji:

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' 

dziękuje :)

+0

Co jest w linii 80 pliku 'MainMenu.java'? Wydaje się, że ta linia rzuca 'NullPointerException'. – chandsie

+0

mUsbManager.requestPermission (device, mPermissionIntent); linia, że ​​jeśli komentarz to aplikacja, to nie FC i myślę, że jest z powodu prywatnego statycznego końcowego String ACTION_USB_PERMISSION = "com.multitools.andres.LCView"; ponieważ nie wiem co tam umieścić – Andres

Odpowiedz

17

tego łańcucha jest tylko markerem więc rozpoznaje intencję, która jest zwracana po wywołaniu registerReceiver(mUsbReceiver, filter);. To nie jest problem.

Myślę, że problemem jest tutaj:

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

Linia ta ma Ci swoją Menedżer USB, ale o ile dobrze pamiętam nie wszystkie telefony mają wspierać Android API akcesoriów USB. Linia ta prawdopodobnie po prostu przypisuje null do mUsbManager, która następnie wywołuje NullPointerException, gdy wywołujesz metodę znajdującą się dalej w kodzie. Próbuję sprawdzić, czy to nie jest null przed wykonaniem połączenia.

Aby uzyskać więcej informacji, KASY te linki:

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

EDIT:

myślę, widzę, co problem jest teraz. Masz rację, to nie jest USB Manager. Jest to obiekt UsbDevice (device). To nigdy nie jest inicjowane nigdzie w twoim kodzie. W tej linii:

mUsbManager.requestPermission(device, mPermissionIntent); 

jesteś w zasadzie wypalania akcję zamiar zwrócić się do użytkownika, czy to w porządku, aby pracować z urządzeniem reprezentowanego przez obiekt UsbDevice device. Jednak po wywołaniu tego połączenia device nie został jeszcze zainicjowany (i dlatego ma domyślną wartość null). Tak więc, gdy próbujesz poprosić o pozwolenie, otrzymujesz zamiast tego oczekiwany wynik NullPointerException. Aby to naprawić, musisz dowiedzieć się, z którym urządzeniem chcesz się połączyć i przypisać je do device. Zajrzyj pod numer here, w części "Wyliczanie urządzeń", aby dowiedzieć się, jak to zrobić.Jednym ze sposobów, jeśli znasz nazwę urządzenia, które chcesz połączyć, jest wprowadzenie następujących połączeń po odzyskać Menedżer USB:

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

(Oczywiście, należy wymienić <deviceName> z rzeczywistą nazwą . urządzenie

+0

Użyłem Log, aby poznać wartość mUsbManager i otrzymuję, że wartość jest: [email protected], więc to nie jest null, testuję na emulatorze, ponieważ nie mam Zdolności urządzenia USB Host:/więc ciąg może być dowolną nazwą, która nie jest problemem? – Andres

+0

Dziękuję :) Masz rację. Testuję na emulatorze, teraz wpisuję ten kod do testowania urządzeń USB: HashMap deviceList = mUsbManager.getDeviceList(); Log.i (TAG, "Lista urządzeń:" + lista urządzeń); i otrzymuję "Lista urządzeń: {}" na LogCat, to znaczy, że nie mam podłączonego żadnego urządzenia? – Andres

+1

Tak, zgadza się. Musisz podłączyć niektóre urządzenia do emulatora. Oto [pytanie] (http://stackoverflow.com/questions/1913979/how-to-emulate-usb-devices) o tym, jak to zrobić. – chandsie

3

minSdkVersion koniecznością> = 12

Aby włączyć obsługę hosta USB API należy dodać plik o nazwie android.hardware.usb.host.xml i zawierający następujące wiersze:

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

trochę więcej informacji na ten temat https://github.com/452/USBHIDTerminal/wiki/How-to-enable-USB-host-API-support – pantos27