0

BroadcastReceiver を使用して、USB デバイスとの通信許可を取得したいと考えています。Android Web サイトhttp://developer.android.com/guide/topics/usb/host.html で行うのと同じ方法で実装しようとしています。しかし、broadcastReceiver は、メイン アクティビティが作成された後にのみ起動します。つまり、アプリを閉じてから再度開いた後にのみ、デバイスと通信できます (broadcastReceiver を登録解除しないと、まったく通信できなくなります)。その理由は何ですか?私のコードは次のようなものです:

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

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

なぜこれが起こっているのか、私が間違っている可能性があることを誰かが知っていますか?

4

1 に答える 1

1

アクティビティでブロードキャスト レシーバーを登録しています。つまり、そのアクティビティを実行する前は、ブロードキャストを受信できません。

おそらく、AndroidManifest.xml に受信者タグを登録することを検討する必要があります。 これは receiver-tag のドキュメントです。これにより、アクティビティを開始せずに受信者を登録できます。

この部分は重要です:

<application> 要素には、ブロードキャスト レシーバーを含むすべてのアプリケーション コンポーネントに適用される独自の enabled 属性があります。ブロードキャスト レシーバーを有効にするには、<application> 属性と <receiver> 属性の両方が「true」である必要があります。どちらかが「false」の場合、無効になります。インスタンス化することはできません。

于 2012-05-04T14:16:24.693 に答える