adbコマンドを使用したUSB大容量ストレージのオン/オフの切り替え


17

背景:USBスティックAndroidデバイス(RikoMagicなど)があり、ほとんどが「ヘッドレス」モードで実行されています。とりわけ、adbと内部の "am"コマンドを組み合わせてシャットダウンする方法をすでに理解しています。

adb shell am start -n android/com.android.server.ShutdownActivity

USB大容量記憶装置のサポートをオンまたはオフにする方法を見つけようとしています。次のコマンドを使用して、USBストレージアクティビティウィンドウをポップアップ表示します。

adb shell am start -n com.android.systemui/.usb.UsbStorageActivity

残念ながら、共有ボリュームを実際に「マウント解除」または「共有解除」する(または、「マウント」または「共有」する)ための同等の「意図」を送信する方法を理解できませんでした。次のコマンドは何もしません:

adb shell am start -n com.android.systemui/.usb.UsbStorageActivity -a android.intent.action.MEDIA_UNSHARED file:///mnt/sdcard

何が間違っていますか?Androidデバイスの内部ストレージをマウント/アンマウントする魔法の呪文とは何ですか?

注1:明らかなLinuxの「mount」/「umount」コマンドがあることは知っています。ただし、単にボリュームをマウントまたはアンマウントしても、SDカードに移動されたアプリを再起動または停止するために不可欠なシステム機能はトリガーされません。とにかく、SDカード内のアプリがまだアクティブな場合、「マウント」はおそらく失敗します。

注2:次の再起動までUSBマスストレージサポートを有効/無効にできる「setprop」コマンドがあるようです。繰り返しになりますが、このオールオアナッシングアプローチは、私が探しているものではなく、タッチインターフェースで実行できるように、単一セッション中にUSBマスストレージのオンとオフを切り替える機能です。

adb shell setprop sys.usb.config mass_storage

非常によく研究された質問です。2回賛成できたらいいのにと思います。あなたの努力に感謝し、それらの有用で既に機能しているコマンドを共有してください!例:)指を交差させると、誰かが行方不明のピースを思いつくことができます。
イジー

回答:


9

残念ながら、UsbStorageActivityUSB大容量ストレージを有効または無効にするインテントを使用していないため、を使用してこれを実現する方法はありませんam。代わりに、関数StorageManager.enableUsbMassStorageを呼び出して`StorageManager.disableUsbMassStorage作業を行います。これらの機能はフレームワークに隠されているため、これを行うアプリを作成することもできません。私の知る限り、これを行うための既存のコマンドはありません。

コマンドラインインターフェイスを提供し、バインドされたシステムサービスMountServiceを使用してそのsetUsbMassStorageEnabled機能を呼び出すアプリを作成することは可能かもしれませんが、それはこのサイトのトピックから外れています。


1
しかし、「USBストレージをオンにする」ボタンをタップするとどうなりますか?まったく新しいアプリを作成するという極端な場合でも、このボタンを押しても効果が得られないのはなぜですか?「猿」ユーティリティのよりインテリジェントなバリアントは、トリックを行いませんか?
匿名ハワード

私はその答えで説明した:それは私が言及した関数を呼び出し、それがシステムサービスを呼び出し、システムサービスがすべての仕事をする。詳細については、ソースを読む必要があります。monkeyコードにそのための明示的なチェックがあるため、誤ってストレージをアンマウントするテストを停止するために、ボタンをクリックすることさえできません。
ダンヒューム

serviceシステムサービスメソッドを呼び出すことができるCLIツールを試すことができます。
レオラム

5


「StorageManager.enableUsbMassStorage」と「StorageManager.disableUsbMassStorage」を試して、マスストレージとその機能を有効または無効にしました。
ありがとう。

そのメソッドはプライベートメソッドです。したがって、それらを使用する場合は、リフレクションによって実行する必要があります。そのStorage Managerを取得するには、アクティビティに含まれるgetSystemService(java.lang.String)メソッドを使用します。

 StorageManager storage = (StorageManager)getApplicationContext().getSystemService(STORAGE_SERVICE);
 Method method = storage.getClass().getDeclaredMethod("enableUsbMassStorage");
 method.setAccessible(true); 
 Object r = method.invoke(storage);

そして、マスストレージを無効にするには:

StorageManager storage = (StorageManager) getApplicationContext().getSystemService(STORAGE_SERVICE);
Method method = storage.getClass().getDeclaredMethod("disbleUsbMassStorage");
method.setAccessible(true);
Object r = method.invoke(storage);

Amir Brand-この方法を使用しようとしましたが、USBストレージを無効にできません。それはあなたと働いていますか?はいの場合は、私を助けてください。ありがとう
カンナ

やあカンナ 問題ない。問題をメールでnetmir2002@gmail.comに送ってください。解決策を見つけようとします。
アミールブランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.