4

アプリケーションが実行されているときにのみADB(USBデバッグ)を有効にし、アプリケーションが実行されていないときに無効にしようとしています。私は電話に完全にアクセスでき、ルート化されている、su利用可能であるなどですが、切り替えを行う方法が見つかりません。

私がこれまでに試したこと:

Process proc = Runtime.getRuntime().exec(new String [] { "su", "-c", "setprop", "persist.service.adb.enable", "0"});
proc.waitFor();
Process proc2 = Runtime.getRuntime().exec(new String [] { "su", "-c", "stop", "adbd"});
proc2.waitFor();

ただし、これにより、電話機は即座に再起動ループに入ります。

4

4 に答える 4

12

動作するコードは簡単です。

Settings.Secure.putInt(getContentResolver(),Settings.Secure.ADB_ENABLED, 0); // 0 to disable, 1 to enable

編集/更新:次の更新をしてくれた@MohanTに感謝します:

Settings.Global.putInt(getContentResolver(),Settings.Global.ADB_ENABLED, 0); // 0 to disable, 1 to enable

ただし、これを使用するには、アプリがシステムアプリである必要があります。署名する必要がないように、カスタムROMを作成するなど。システムアプリにするために次のことを行いました。

まず、Eclipseを使用して定期的にインストールし、次にadbシェルを使用してインストールしました。

> su
# mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
# cat /data/app/filename.apk > /system/app/filename.apk
# mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system
# reboot
于 2012-07-11T15:18:24.433 に答える
5

次の手順で達成できます。

  1. ADBが現在有効になっているかどうかを確認します。これを行うには、関連するグローバル定数を使用できます。

  2. 暗黙的なIntentwithSettings.ACTION_APPLICATION_DEVELOPMENT_SETTINGSアクションを使用して、ユーザーがADBを有効または無効にできる開発者向けオプションを開きます。

コード例:

Java

public static final int API = Build.VERSION.SDK_INT;
public static final int ENABLED=1, DISABLED=0;

public static boolean adbEnabled(Context context){
    if(API>16)
       return ENABLED == Settings.Global.getInt(context.getContentResolver(), Settings.Global.ADB_ENABLED,DISABLED);
    else 
       return ENABLED == Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.ADB_ENABLED,DISABLED);
}

public void checkAdb(Context context){
    //if ADB disabled
    if(!adbEnabled(context)){
        //open developer options settings 
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS);
        context.startActivity(intent);
    }
}

Kotlin

val API = Build.VERSION.SDK_INT
val ENABLED = 1
val DISABLED = 0

fun adbEnabled(context: Context): Boolean {
    return if (API > 16)
        ENABLED == Settings.Global.getInt(context.contentResolver, Settings.Global.ADB_ENABLED, DISABLED)
    else
        ENABLED == Settings.Secure.getInt(context.contentResolver, Settings.Secure.ADB_ENABLED, DISABLED)
}
fun checkAdb(context: Context) {
    //if ADB disabled
    if (!adbEnabled(context)) {
        //open developer options settings
        val intent = Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)
        context.startActivity(intent)
    }
}

参考までに:

API 3より前(おそらく関連性がなくなった)Settings.System.ADB_ENABLEDが使用されていました。

于 2017-01-09T06:26:12.467 に答える
3

セキュアクラスのADB_EN​​ABLEDフィールドが減価償却され、文字列がグローバルクラスに移動されたことを除いて、クリスの答えは正しいです。したがって、以下のコマンドを使用できます-

Settings.Global.putInt(getContentResolver(),Settings.Global.ADB_ENABLED, 0); // 0 to disable, 1 to enable
于 2014-08-29T22:12:14.883 に答える
2

私の経験から、setpropの使用は常に信頼できるとは限らず、[設定]>[アプリケーション]>[開発]>[USBデバッグ]オプションと競合する可能性さえあります。さらに、たとえばUSBデバッグが有効になっているのに、adbが機能しない場合など、イライラする可能性があります。したがって、Settings.Secure.ADB_EN​​ABLEDを使用することをお勧めします。さらに、ステータスパネルに常に通知が表示されます。

Settings.Secure.ADB_EN​​ABLEDにアクセスしようとするだけで、システムパーティションにアプリをインストールする手間をかけたくない場合は、代わりに、すでにこの作業を行っている別のアプリに頼ることができます。

このアプリはADBToggleと呼ばれます。あなたはグーグルプレイでそれを見つけることができます:

https://play.google.com/store/apps/details?id=com.ramdroid.adbtoggle

ADBToggleを介してUSBデバッグ設定にアクセスするためのライブラリは次の場所にあります。

https://github.com/ramdroid/AdbToggleAccessLib

于 2012-09-25T07:46:35.470 に答える