0

我想使用 BroadcastReceiver 来获得与 USB 设备通信的权限。我正在尝试以与在 android 网站http://developer.android.com/guide/topics/usb/host.html上相同的方式实现它, 这一切都有效。但是广播接收器仅在创建主要活动后才会触发。这意味着我只能在关闭应用程序并再次打开它后才能与设备通信(当我不取消注册广播接收器时,我根本无法通信)。可能是什么原因?我的代码是这样的:

私有最终广播接收器 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 ";
                }
            }
        }
    }
};

我注册它的代码部分:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 设置内容视图(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);
    }

有谁知道为什么会这样,我可能做错了什么?

4

1 回答 1

1

您正在活动中注册广播接收器。这意味着在您运行该活动之前,您无法接收广播。

您可能应该考虑在 AndroidManifest.xml 中注册一个接收者标签。 这是 receiver-tag 的文档。这允许您在不开始活动的情况下注册接收者。

这部分很重要:

<application> 元素有自己的 enabled 属性,适用于所有应用程序组件,包括广播接收器。<application> 和 <receiver> 属性都必须为“true”才能启用广播接收器。如果其中一个为“false”,则它被禁用;它不能被实例化。

于 2012-05-04T14:16:24.693 回答