2012-05-04 84 views
0

我想使用BroadcastReceiver獲得與USB設備通信的權限。我試圖以它在android網站上完成的相同方式實現它http://developer.android.com/guide/topics/usb/host.html 它的一切正常,有點。 但是,只有在創建主要活動後,broadcastReceiver纔會觸發。這意味着我只有在關閉應用後才能與設備進行通信並再次打開它(當我沒有取消註冊broadcastReceiver時,當我無法通信時)。 可能是什麼原因? 我的代碼是這樣的:活動已創建後BroadcastReceiver觸發

私人最終的BroadcastReceiver mUsbReceiver =新的廣播接收器() {

public void onReceive(Context context, Intent intent) 
    { 
     String action = intent.getAction(); 

     if (ACTION_USB_PERMISSION.equals(action)) 
     { 
      synchronized (this) 
      { 
       device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); 
       if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) 
       { 
        if(device != null) 
        { 

      //things I do when the permission is granted    

        } 

       } 
       else 
       { 
        devMessage = "permission denied for device "; 
       } 
      } 
     } 
    } 
}; 

哪裏註冊它的部分代碼:

公共無效的onCreate(捆綁savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

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

    mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); 
    filter = new IntentFilter(ACTION_USB_PERMISSION); 
    registerReceiver(mUsbReceiver, filter); 

    HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList(); 
    Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); 
     while(deviceIterator.hasNext()) 
     { 
      device = deviceIterator.next(); 
      mUsbManager.requestPermission(device, mPermissionIntent);    
     } 

      // ...  

    if(device!=null) 
    { 
     // ... 
    } 
    else 
    { 
     // ... 
    } 
    tv.setText(devMessage); 
    } 

有誰知道爲什麼會發生這種情況,我可能會做錯什麼?

回答

1

您正在將您的廣播接收器註冊到您的活動中。這意味着在您運行該活動之前,您無法接收廣播。

你應該看看在你的AndroidManifest.xml中註冊一個reciever標籤。 This is the docs for the receiver-tag。這允許您註冊接收者而無需開始您的活動。

這部分是非常重要的:

的<應用>元素具有適用於所有應用程序組件,包括廣播接收機自身的啓用屬性。 <應用程序>和<接收器>屬性必須都是「真」才能啓用廣播接收器。如果其中任一個是「假」,則被禁用;它不能被實例化。

+0

謝謝,實際上解決了這個問題(雖然我還是不明白這一點 - 我已經做了的事情只是複製粘貼在Android網站如何獲得許可使用USB設備進行通信) – Magda

+1

@Magda,主要區別在於如果您的清單中定義了操作系統,它可以自行啓動BroadcastReceivers。示例顯示的方式是,在應用程序啓動時註冊它們,因此要求您實際啓動應用程序才能註冊它們。 BroadcastReceivers有自己的生命週期,所以他們不需要在您的活動中註冊。我猜這個例子並不是真正針對持久接收者? :) –