Mathias Conradt
Mathias Conradt

Reputation: 28665

Enable USB debugging (under settings/applications/development) programmatically from within an app

Is it possible to enable USB debugging (under settings/applications/development) programmatically from within my app?

I was looking at Permission.WRITE_SETTINGS and http://developer.android.com/reference/android/provider/Settings.System.html, but I couldn't find anything appropriate.

Upvotes: 12

Views: 15518

Answers (6)

Stefano Zanella
Stefano Zanella

Reputation: 113

You need to follow these 3 steps

  1. in the manifest put <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
  2. Use this command in the code to enable USB debug Settings.Secure.putInt(requireActivity().contentResolver, Settings.Global.ADB_ENABLED, 1) or Settings.Secure.putInt(requireActivity().contentResolver, Settings.Global.ADB_ENABLED, 0) to disable it
  3. IMPORTANT Before being able to use these system API you must grant WRITE_SECURE_SETTINGS from adb running adb shell pm grant your.package.name android.permission.WRITE_SECURE_SETTINGS. The device has to be attached to the computer with USB debug active.

I developed a simple app that uses this approach to enable/disable some developer options such as Debug USB and Keep Device Screen Active https://play.google.com/store/apps/details?id=it.stzan.devtools

Disclaimer: I am the actual developer of DevTools

Upvotes: 2

ArkadiBernov
ArkadiBernov

Reputation: 578

If your device has root, and API level > 17 for enable adb:

Runtime.getRuntime().exec(new String[] {"su", "-c", "settings put global adb_enabled 1"});

or (depends of su implementation)

Runtime.getRuntime().exec(new String[] {"su", "settings put global adb_enabled 1"});

For disable - change last argument from 1 to 0

Upvotes: 0

Milad Faridnia
Milad Faridnia

Reputation: 9477

First: Your app must be a system app

This line of code may help:

Settings.Global.putInt(getContentResolver(), Global.ADB_ENABLED, 1);

and you need this permission:

<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>

but after adding this permission in manifest you will get this error: Permission is only granted to system apps

which means your app must be a system app.

Upvotes: 10

JustHobby
JustHobby

Reputation: 533

You can enable adb programmatically by requesting WRITE_SECURE_SETTINGS in manifest and granting it over adb shell:

adb shell pm grant your.package.name android.permission.WRITE_SECURE_SETTINGS

Then you can enable adb on API 17 and above by calling:

Settings.Global.putString(mContext.getContentResolver, Settings.Global.ADB_ENABLED,"1");

For API 16 to API 3 call:

Settings.Secure.putString(mContext.getContentResolver, Settings.Secure.ADB_ENABLED,"1");

To disable adb replace "1" with "0" in commands

Upvotes: 5

Paul Lammertsma
Paul Lammertsma

Reputation: 38252

You will need root permissions to do so from an app.

That said, it is possible to enable ADB by executing the following terminal commands:

setprop persist.service.adb.enable 1
start adbd

This blog post gives an excellent example of how to execute these commands with escalated permissions through su.

Upvotes: 14

Mathias Conradt
Mathias Conradt

Reputation: 28665

It's not possible without using your own custom firmware that grants access to the security settings. See thread here: http://groups.google.com/group/android-developers/browse_frm/thread/953c6f0eb0fa9bed#

Upvotes: 5

Related Questions