タイトルが示すように、UsbManager.getDeviceList() を使用して、USB 対応の Android フォンで特定の USB デバイスを列挙するのに問題があります。この電話や他の電話で他の USB デバイスの列挙と通信に問題はありませんでしたが、この特定の USB デバイスが見つかりません。また、 USB Device Infoなどのサードパーティ アプリで列挙することもできません。
以下は、PC で適切に列挙された USB プロパティです。外部企業がデバイスが USB 2.0 仕様に準拠していることを認定したことを確認したデバイス メーカーと連絡を取りました。当初、私の疑惑は、他の準拠デバイスに含まれていた iManufacturer、iProduct、および iSerialNumber のフィールドが削除されたため、デバイスが Android によって拒否されたというものでした。ただし、 USB 2.0 仕様のセクション 9.5 からの抜粋を確認すると、これらのフィールドは必要ないようです。
適切な場合、記述子には、人間が読める形式で記述子を説明する表示可能な情報を提供する文字列記述子への参照が含まれます。文字列記述子の組み込みはオプションです。ただし、記述子内の参照フィールドは必須です。デバイスが文字列記述子をサポートしていない場合は、文字列参照フィールドをゼロにリセットして、使用できる文字列記述子がないことを示す必要があります。
私の質問は、UsbManager がこの USB デバイスの列挙を拒否する原因は何ですか? さらに重要なことに、Android にこのデバイスを強制的に列挙させるためにできることはありますか? 理想的には、root アクセスを必要としないソリューションに最も関心がありますが、必ずしも契約を破るものではありません。
編集: いくつかのサンプル コード。
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
// When I plug in this USB device, deviceList is empty.
// Other devices are discoverable, however.
編集 2: 私はいくつかの電話でテストしました。次の電話で USB デバイスを正常に列挙しました。
- 注2
- LG-V400
次のデバイスはデバイスを列挙できませんでした:
- ネクサス5
- ギャラクシー S4、S5、S6
- LG G2、4G LTE
編集 3: USB デバイスを接続した後、Nexus 5 で呼び出したログを次に示します。adb shell dmesg
4 ~ 16 行目で、電話がデバイスの列挙に失敗していることを明確に確認できます。