2017-06-02 29 views
1

AndroidでUSB OTGデバイスとインターフェース接続しようとしています。USB OTGデバイスが抜き差ししても機能しない

  • は(私が興味を持ってデバイスIDのためのフィルタ処理)USB_DEVICE_ATTACHEDためのインテントフィルタを持つアクティビティありますマニフェストで宣言された:コードは少し長いですので、私は基本を概説します。
  • アクティビティが特定のインテントで起動されると、サービスが開始され、USBデバイスが引数として渡されます。
  • servieが起動すると、USB_DEVICE_DETACHEDのブロードキャストレシーバが登録され、デバイスに接続され、デバイスとの対話が開始されます(現在はログ出力が生成されています)。
  • USB切断ブロードキャストが受信されると、が現在使用されているデバイスであり、USBデバイス接続でclose()が呼び出され、サービスが停止します。

デバイスは、Si4701 USB FMチューナーで、USB HIDデバイスとして表示されます。

初めてデバイスを接続すると、サービスが接続されていることがわかります。チャンネルを変更してRDSデータを受信できます。

しかし、プラグを抜いてプラグを差し込むと、サービスが再び接続されていることが確認できます(デバイスレジスタの読み込みに成功しました)が、周波数の変更に失敗し、RDSデータが表示されません。

私は、デバイスのプラグを抜くとrepluggingの間で停止するようにアプリを強制した場合、デバイスは再び取り付けgeing後に正常に動作します。

これは、いくつかのクリーンアップは場所を取るために失敗した提案する、またはいくつかのリソースが正しく解放されていません。ただし:

  • 私は接続間のデバイスに関連するデータ構造を保持しません。 USB接続に関連するすべてのものは、デバイスが検出されたときに作成されるクラスインスタンスにあり、これらのクラスのすべての静的メンバーは最終的です。
  • デバイスの種類やファームウェアのバージョン(USB HID機能レポートを取得することによって機能する)のためのレジスタの読み込みなど、デバイスを再構成した後に機能するものがあります。初期化では、エラーを返さないレジスタもいくつか設定されますが(USB機能レポートの送信による)、周波数の変更(レジスタの設定も含まれます)は機能しません。
  • アンプラグと再挿入の間隔は〜15分で効果はありません(デバイスが動作しません)。一方、デバイスのプラグを抜いてサービスを終了してプラグインし直すと、即座に動作するため、デバイス側ではなく、Android側で問題が発生しています。

電源を切る/再接続した後にUSBデバイスを動作させるには、何が必要ですか?

答えて

0

私はここで何が起こっているのかまだ完全に理解していませんが、今はうまくいくようです。

私は、アプリケーションがマルチスレッドであり、Si470xラッパークラスが複数のスレッドから呼び出されていることに言及する必要があります。

これは競合状態(別のスレッドがそれを閉じたときに1つのスレッドがデバイスにアクセスする)になったため、すべてのメソッドを​​として適切に宣言し、2つのスレッドが同時にチューナークラスのメソッドにアクセスできないようにしました。デバイスのプラグを差し込み、プラグを抜き、プラグを差し込んでプラグを差し込んで見てください。周波数が変わり、RDSデータが想定どおりに吐き出されます。

疑惑:

UsbDeviceConnection#close()はスレッドセーフではないかもしれません。

結論:

  • あなたは(デバイスが取り外されたときを含む)デバイスで実行している場合は、常にUsbDeviceConnection#close()を呼び出します。
  • アプリがマルチスレッド化されている場合は、(直接的または間接的に)USB接続にアクセスするすべてのものが適切に同期されていることを確認してください。
関連する問題