【问题标题】:How to access device settings programmatically?如何以编程方式访问设备设置?
【发布时间】:2012-08-16 10:28:04
【问题描述】:

有没有办法以编程方式访问设备设置?

例如:设置>开发者选项>USB调试>真/假

提前致谢。

编辑:USB 调试只是一个例子。我可以访问设备设置中存在的所有设置吗?

【问题讨论】:

标签: android


【解决方案1】:

Settings.Secure.putInt(getActivity().getContentResolver(),Settings.Secure.ADB_EN​​ABLED, 1);

但您需要 root 访问权限才能执行此操作。只有系统应用有权更改安全设置

编辑: 试试这个以显示所有 ANR

Settings.Secure.putInt(ContentResolver,Settings.Secure.ANR_SHOW_BACKGROUND,0);

对于不要保留活动

ActivityManagerNative.getDefault().setAlwaysFinish(true)

但 ActivityManagerNative 隐藏在标准 api 集中。您将需要进行反射或使用此method 来获取 android.jar。 我再次猜想这需要root访问权限

【讨论】:

  • 谢谢。此代码有效,但我以 USB 调试为例。真正的问题是,哪些设置是可访问的。我还可以访问“不保留活动”或“显示所有 ANR”吗?
  • Settings.Secure.putInt(getActivity().getContentResolver(),Settings.Secure.ADB_ENABLED, 1); 无法单独运行,因为您需要使用 Android 平台证书对您的应用进行签名,您的应用在 AndroidManifest.xml 中具有适当的配置,并且您的应用安装在 @987654324 中@ 以编程方式或手动方式。你甚至不能用有根设备来做到这一点。
  • 效果很好,但在我的设备上,“putInt”删除了一个旧条目并创建了一个新条目。我通过 adb shell 和 sqlite3 查看了数据库。 (data/data/com.android.providers.settings/databases/settings.db) 执行 putInt 后,“更改”的名称-值对有一个新的 _id。改了_id有副作用吗?
【解决方案2】:

试一试:

 int adb = Settings.Secure.getInt(context.getContentResolver(),
  Settings.Secure.ADB_ENABLED, 0);
 // toggle the USB debugging setting
 adb = adb == 0 ? 1 : 0;
 Settings.Secure.putInt(context.getContentResolver(), 
Settings.Secure.ADB_ENABLED, adb);

在 AndroidManifest.xml 中:

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

最后看看这个例子

http://code.google.com/p/secure-settings-widget/source/browse/src/com/lieryan/adbwidget/ADBAppWidgetProvider.java?r=eb23b2d6989ccade05f095806db5888f1ba62737

【讨论】:

  • 上述方法无法自行运行,因为您需要使用 Android 平台证书对您的应用进行签名,您的应用在 AndroidManifest.xml 中具有相应的配置,并且您的应用安装在 /system/app 中以编程方式或手动方式。
【解决方案3】:

我知道这个问题很老但很有趣。

Nandeesh 的解决方案效果很好。但如果您想更改某些设置(例如 USB 调试),它就不起作用。您必须使用以下权限。

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

但是,它不适用于非系统应用程序。但是,如果您有 root 访问权限,则可以这样做。您可以尝试this 解决方案,作者解决了完全相同的问题。

你也可以试试https://github.com/alseambusher/adb-toggle

【讨论】:

    【解决方案4】:

    如果您的应用是系统应用,那么您只需执行此操作即可启用/禁用 USB 调试

    Settings.Secure.putInt(getActivity().getContentResolver(),Settings.Secure.ADB_EN​​ABLED, 1);

    您还需要 root 访问权限才能执行此操作。 我已经root了设备,我只是简单地执行SU来启用/禁用Usb调试。

    进程 proc = Runtime.getRuntime().exec(new String [] { "su", "-c", "setprop", "persist.service.adb.enable", "0"});

    proc.waitFor();

    进程 proc2 = Runtime.getRuntime().exec(new String [] { "su", "-c", "停止", "adbd"});

    proc2.waitFor();

    好在您不需要将您的应用程序放在 (/system/priv-app/) 您的简单应用,即 (/data/app) 可以做到这一点。

    【讨论】:

      【解决方案5】:

      除非您的应用是系统应用,否则您无法开启 USB 调试。

      【讨论】:

        【解决方案6】:

        这行代码可能会有所帮助:

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

        你需要这个权限:

        &lt;uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/&gt;

        但在清单中添加此权限后,您会收到此错误:权限仅授予系统应用

        这意味着您的应用必须是系统应用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-30
          • 1970-01-01
          • 2010-12-13
          • 2011-12-19
          • 2012-05-26
          • 1970-01-01
          • 1970-01-01
          • 2014-01-26
          相关资源
          最近更新 更多