0

デバイスに接続されている USB アクセサリのリストを取得しusbAccessories、アダプタが使用する List Collection を更新するメソッドがありますListView。つまり、

private void updateUsbAccessories() {
    List<String> usbAccessories = new ArrayList<String>();

    UsbAccessory[] accessoryList = usbManager.getAccessoryList();

    if (accessoryList != null) {
        usbAccessories.add(accessoryList[0].getSerial());
    }

    // Notify adapter of changes
    myAdapter.notifyDataSetChanged();

}

USB アクセサリがデバイスから取り外されたときに、このメソッドを呼び出します。BroadcastReceiver

class UsbReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        updateUsbAccessories();
    }
}

action でインテント フィルターをリッスンしますACTION_USB_ACCESSORY_DETACHED。問題は、動作が非常に断続的であるように見えることです。つまり、デバイスを取り外したときに時々発生しますaccessoryList.length = 1nullUSBアクセサリが接続されていないため、これは常に返されるはずです。

なぜこれが起こっているのでしょうか?サンクス。

更新アクセサリが実際に取り外される前に Android がブロードキャストを送信するかどうか疑問に思い始めています。つまり、次ACTION_USB_ACCESSORY_DETACHEDのように小さなスリープを導入しました。UsbReceiver

class UsbReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            Thread.sleep(500);
            updateUsbAccessories();
        }
        catch (InterruptedException e) {} 
    }
}

この小さな睡眠では、問題を再現することはできないようです. それがなければ、ブロードキャストが送信されたにもかかわらず、アクセサリが実際に取り外される前getAccessoryListにメソッドを呼び出すとしか思えません。updateUsbAccessoriesこれは本当に問題でしょうか?ACTION_USB_ACCESSORY_DETACHEDもしそうなら、ブロードキャストを送信するタイミングの Android の実装についてはわかりません。

4

1 に答える 1

0

AndroidがACTION_USB_ACCESSORY_DETACHEDイベントを検出しないという同様の問題があります...そして、問題が何であるかがわかりました

最も可能性の高い問題は、Android がアプリケーションに ACTION_USB_ACCESSORY_DETACHED を送信する前に、USB ホストの電源をすばやくオン/オフすることです。

解決策 i) USB ホスト ファームウェアを変更して、OFF の後に再び ON にする前に遅延を追加します (おそらく 200ms - 私にとってはうまくいきます) ii) あなたが提案したように、スレッドに遅延を追加してください!

于 2014-01-20T09:40:56.550 に答える