2012-04-17 21 views
12

Ana bilgisayar olarak USB iletişimi kurmaya çalışıyorum. Buradaki örnekleri takip ediyorum http://developer.android.com/guide/topics/usb/host.html ama bu çalışmayı başaramıyorum. İşte benim kodudur: Çizgiyi mUsbManager.requestPermission(device, mPermissionIntent); bunu yorum yaparsanız yorumsuz zaman Bir USB aygıtı ile nasıl iletişim kurulur?

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); 

    } 

Ben Kuvvet Kapat iletişim olsun, ben yakın kuvvet alamadım ancak işe doesnt.

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

Ama oraya koymak zorunda tam olarak ne bilmiyorum ve ben bu konuda herhangi bir açıklama bulamadık: Google'ın örnek üzerinde

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

o şekildedir: Sorunun içinde olduğunu düşünüyorum. Ne koymam gerekiyor ya da benim hatam nerede?

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' 

sayesinde size :)

+0

'MainMenu.java' dosyanızın 80. sayfasında ne var? Bu çizgi bir 'NullPointerException' atıyor gibi görünüyor. – chandsie

+0

mUsbManager.requestPermission (aygıt, mPermissionIntent); Bir yorum varsa, uygulama FC değil ve sanırım özel statik final String olduğunu düşünüyorum. ACTION_USB_PERMISSION = "com.multitools.andres.LCView"; çünkü ben orada ne koymak bilmiyorum çünkü – Andres

cevap

17

O dize yüzden size registerReceiver(mUsbReceiver, filter); çağırdığınızda döndürülen niyet tanıyan bir işaretleyici olduğu: İşte benim uygulamayı başlattığınızda i alıyorum LogCat olduğunu. Sorun bu değil.

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

Bu çizgi size USB Yöneticisi almak gerekiyordu, ama bildiğim kadarıyla Hatırladığım kadarıyla değil tüm telefonlar Android USB Aksesuar API desteklemek zorunda:

Buradaki sorunun olduğunu düşünüyorum. Bu satır muhtemelen null'u mUsbManager'a atayarak, daha sonra kodda bir yöntem çağırdığınızda NullPointerException neden olur. Üzerinde arama yapmadan önce, bunun null olup olmadığını kontrol etmeye çalışın. Daha fazla bilgi için

, ödeme bu bağlantıları:

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

DÜZENLEME:

Ben Sorunun şu an ne olduğunu görmek düşünüyorum. Haklısın, USB yöneticisi değil. UsbDevice nesnesidir (device). Kodunuzda hiçbir zaman başlatılmamış. Bu satırda:

mUsbManager.requestPermission(device, mPermissionIntent); 

işlemi temelde sorun olmazsa UsbDevice nesnesi device tarafından temsil cihazla çalışmak kullanıcıya sormak için bir niyet kapalı ateş ediyorlar. Ancak bu çağrı tetiklendiğinde, device henüz başlatılmamıştır (ve bu nedenle null varsayılan değeri vardır). İzin isteğinde bulunduğunuzda, beklenen sonuç yerine NullPointerException elde edersiniz. Bunu düzeltmek için hangi cihaza bağlanmak istediğinizi belirlemeniz ve onu device'a atamanız gerekir. Bunu yapmanın farklı yollarını bulmak için "Cihazları numaralandırma" altında here'a bakın.

Açıkçası
HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList(); 
device = deviceList.get("<deviceName>"); 

(, sen gerçek adıyla <deviceName> yerini alacak: Eğer bağlanmak istediğiniz cihazın adını biliyorsanız bir yolu, Usb Yöneticisi almak sonra aşağıdaki aramaları yapmaktır . cihaz

+0

kullanıldı Ben mUsbManager değerini bilmek için giriş yapın ve bu değeri elde edin: [email protected] bu yüzden boş değil, emülatör üzerinde test ediyorum çünkü Bir aygıt katiyen USB Host yetenekleri:/böylece string problem olmayan herhangi bir isim olabilir mi? – Andres

+0

Teşekkürler :) Haklısınız. Bu kodu şimdi USB Aygıtlarını test etmek için koyduğum emülatörde test ediyorum: HashMap deviceList = mUsbManager.getDeviceList(); Log.i (TAG, "Cihaz Listesi:" + cihazListesi); ve LogCat'taki "Cihaz Listesi: {}" ile bağlantılıyım, yani herhangi bir cihaz bağlı değil miyim? – Andres

+1

Evet, doğru. Bazı cihazları emülatörünüze eklemeniz gerekir. İşte bununla ilgili olarak bir [soru] (http://stackoverflow.com/questions/1913979/how-to-emulate-usb-devices). – chandsie

3

minSdkVersion zorunluluk> = 12

bir adlı dosyayı android.hardware.usb.host.xml ve içeren aşağıdaki satırları eklemek gerekir USB ana API desteğini etkinleştirmek için:

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

bu https://github.com/452/USBHIDTerminal/wiki/How-to-enable-USB-host-API-support hakkında daha fazla ayrıntı – pantos27

İlgili konular