10

タイトルが示すように、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 アクセスを必要としないソリューションに最も関心がありますが、必ずしも契約を破るものではありません。

USB プロパティ


編集: いくつかのサンプル コード。

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 dmesg4 ~ 16 行目で、電話がデバイスの列挙に失敗していることを明確に確認できます。

4

2 に答える 2

2

USB デバイスを Android フォンに接続した後、それを取り外し、電話機をコンピュータに接続してadb shell dmesg、カーネル ログを確認できるようにします。カーネル ログにデバイスが表示されている場合、電話はデバイスを認識しており、UsbManager からデバイスが返されない理由がわかりません。私が疑っているのは、カーネルログに表示されないか、エラーが発生することです。これはおそらく、デバイスが電話の OTG コントローラーと互換性がないか、正しく機能するのに十分な電力が得られていないことを意味します。

于 2015-11-13T00:52:40.550 に答える
1

私には解決策がなく、役立つヒントさえないかもしれませんが、エラーはある程度説明できるようです:

#define EOVERFLOW 75 /* Value too large for defined data type */
于 2015-11-14T22:30:38.687 に答える