USBデバイスへのアクセスを許可する前に許可を求めるAndroidの停止方法


19

USBホストモードインターフェイスを介してUSBデバイスを制御する、ICS 4.0.3を実行しているルート化された名前のないAndroidタブレットでアプリケーションを実行しています。android.hardware.usb.host.xmlファイルは/ system / etc / permissionsにあり、すべてがうまく機能します。を除いて...

再起動後に初めてアプリを実行し、USBデバイスを接続すると、「アプリAPPNAMEがUSBデバイスにアクセスできるようにしますか?[]このUSBデバイスにデフォルトで使用します。キャンセルOK」というポップアップウィンドウが表示されますデバイスの使用を開始するには、[OK]をタップする必要があります。

アプリがすぐにデバイスを使用できるように、ユーザーの確認をオフにする必要があります。どうすればいいですか?ユーザーが画面上のボタンをタップするのをシミュレートするためにキープレスジェネレーターを使用することについていくつかの提案があるように見えますが、この種のアプローチを避け、確認要求が発生しないように設定したいです。

おそらくサプライヤーにカスタムカーネルビルドを依頼することはできませんが、ファームウェア署名キーを入手して、システムアプリとしてアプリに署名できるようにする必要があります。

1つの関連する問題:[このUSBデバイスにデフォルトで使用する]チェックボックスをオンにしても効果がないようです。デバイスを取り外して再接続すると、確認プロンプトが再度表示されます。この状況で、/ dev / bus / usb / 001 /のデバイス番号は、この特定の問題を説明するプラグを抜き差しするたびに変わることに気づきました(001、002、003など)。


アプリを/ system / appにデプロイするとどうなりますか?システム署名の有無にかかわらず、これを試すことができます。(a)試したことがないので、(b)この展開モデルが利用可能かどうかわからないので、これをコメントとして書きます。
ロブプリダム

回答:


10

この質問と回答は、基本的に
/programming//a/15151075/588476の複製です
サンプルプログラムの詳細については、上記のリンクを参照してください。

私の知る限り、USB許可ボックスのポップアップを表示するには2つの方法があります。

  1. UsbManager.requestPermission(...)を使用して、アプリケーションから明示的に許可を要求します
  2. アクセサリにインテントフィルターを登録し、デバイスが接続されたときにシステムが許可を求めるようにします

1の場合、許可を記憶するポップアップのチェックボックスは効果がないことがわかりました。

私の場合、許可に関連するすべてのコードをソフトウェアから削除し、intent-filterをマニフェストに追加しました。USBデバイスが接続されているときに、まだ許可が与えられていない場合は、USB許可ボックスがポップアップ表示されます。ユーザーが「記憶」ボックスをチェックせずに「OK」をクリックすると、次回デバイスが接続されたときにボックスが再びポップアップします。ただし、ユーザーがボックスをチェックして[OK]を押した場合、ボックスが再び表示されることはありません(ソフトウェアをアンインストールしてから再インストールしない限り)。

デバイスに関連するバグが/ dev / bus / usb / 001、次に002などと表示されているかどうかはわかりません-インテントフィルターを使用しているかどうかを教えてください。何もしない。

許可ポップアップを完全に回避する方法は知りません。あなたが言ったようにアンドロイドのコードを掘り下げることなくそれを行う方法はないと思います。


1
本気ですか?デバイスのプラグが抜かれて再接続されたとき、まだ許可要求が表示されています。この動作は、developer.android.com/ guide/topics/connectivity/usb/host.htmlのドキュメントと一致しています。「インテントフィルターの使用」セクションには、「ユーザーが同意すると、デバイスが切断されるまでアプリケーションにデバイスへのアクセス許可が自動的に与えられます」
-kbro

Nexus 7、Galaxy S3、Galaxy Noteを保証できるのは、許可を1回だけ受け入れる必要があるデバイスのみです(Androidデバイスがホストモ​​ードで実行されている)-チェックボックスを有効にして決定を記憶します。どのデバイス/バージョンのAndroidを使用していますか?カスタム/ OEMデバイスだと感じますか?
ウェインUroda

これは、WonderMedia WM8850-mid SOMをベースにした、Android 4.0.3の味を実行するOEM 7インチタブレットです。
kbro

インテントフィルターは、現在のブートセッションでのみ機能します。はい、私は自分の携帯電話にUSBデバイスを接続し、それが自動的に許可を与える
user924

7

私のコメントに加えて、基礎となるAndroidコードを確認しました。

考えられる答えはありますが、少なくとも4つの大きな警告と障害があります。

  1. 手元に適切なUSBデバイスがないため、試していません。
  2. 新しい許可が必要です
  3. 許可を得るには、システムアプリである必要があります
  4. コードには、パブリックAPIにないものへのアクセスが必要です

通常のアフターマーケットアプリを展開する場合は、これを忘れてください!

最初の前提条件は、MANAGE_USB許可があることです。それはここで説明されます

ただし、そのための前提条件は、システムキーで署名し、アプリを/ system / appにインストールすることです。

とにかく、それでよければ、ここにいくつかのコードがあります:

   IBinder b = ServiceManager.getService(USB_SERVICE);
   IUsbManager service = IUsbManager.Stub.asInterface(b);
   service.grantDevicePermission(mDevice, uid);

mDevice 以前のデバイスです。

uidあなた自身のアプリのUIDであり、あなたはそれを調べることができます。その方法の例は、ここでの最初の答えです

いいですか 番号はServiceManagerあるandroid.os.ServiceManagerので、公開APIではありません。これは、この例では、IUsbManagerサービスを手に入れるための方法です(他のルートがあるかもしれません)。さて、それを回避することは私の答えの範囲を超えています。昔はリフレクションを使用できましたが、まだ使用できるかどうかはわかりません。

これらのすべての後、許可を要求する必要はないように見えます。要求した場合、ダイアログなしですぐに戻ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.