【问题标题】:How can I get the dreaded WRITE_SECURE_SETTINGS permission for my android app?如何获得我的 android 应用程序的可怕 WRITE_SECURE_SETTINGS 权限?
【发布时间】:2011-02-17 20:22:46
【问题描述】:

我需要能够打开和关闭 GPS 接收器,并且需要 WRITE_SECURE_SETTINGS 才能访问安全设置。我已经搜索了很多,我看到的每个答案都说系统/固件之外的任何应用程序都无法获得该权限。

然而,这根本不是事实。市场上有几个应用程序完全符合我的要求(关于 GPS),但还有更多具有 WRITE_SECURE_SETTINGS 权限的应用程序。例如:

Extended Controls

SwitchPro

Profile Flow

那么,如何做到这一点呢?

【问题讨论】:

    标签: android permissions gps


    【解决方案1】:

    我需要能够打开和关闭 GPS 接收器

    出于隐私原因,如果没有其他原因,启用或禁用任何类型的位置跟踪需要完全由用户通过受信任的应用程序进行,而不是应任意第三方的请求。

    因此,如果您希望启用和禁用 GPS,请创建您自己的固件来满足您的需求,并将该固件加载到您希望的任何设备上。或者,将您的更改贡献给现有的固件模块(例如 Cyanogen)。

    需要 WRITE_SECURE_SETTINGS 才能访问安全设置

    正确。

    我已经搜索了很多,我看到的每个答案都说系统/固件之外的任何应用程序都无法获得该权限。

    正确。

    然而,这根本不是事实。

    不,这是真的。

    市场上有几款应用完全符合我的要求(就 GPS 而言)

    他们发现了一个安全漏洞。我将采取措施帮助确保这个漏洞得到修复。

    但还有很多拥有 WRITE_SECURE_SETTINGS 权限

    不,有一群人要求他们。您可以请求任何您想要的权限。您要求的是这些列表中显示的内容。你得到是一个不同的故事。

    【讨论】:

    • 另外,FWIW,Extended Controls(我购买的)不会直接启用或禁用 GPS,而是将您带到“位置和安全设置”页面自行切换。
    • 但在我的应用程序中,用户会选择该选项——只是试图保存一系列首先将它们带到设置的步骤。如果在“位置和安全”中有一个额外的设置(当然是严厉的警告)允许外部应用程序控制 GPS,那不是更有意义吗?这样,用户可以选择易用性而不是安全性,反之亦然。
    • 我很抱歉扩展控制,我的意思是电源控制加。在过去的几周里,我经历了很多,把两者搞混了。
    • @user496854:我不同意你提出的功能(可以启用/禁用 GPS 的应用程序的用户白名单),但它不存在,现在 Android 中也没有类似的东西。如果您喜欢您提议的功能,请随时将问题发布到b.android.com。关于扩展控件,它恰好是我已经拥有并且可以轻松测试的一个。我尝试购买 SwitchPro 看看效果如何,但 Android 市场对我来说表现不佳。
    • @CommonsWare 您能否澄清“您要求的是这些列表中显示的内容”是什么意思?您指的是在安装应用程序之前显示的 Android 应用程序权限列表吗?
    【解决方案2】:

    试试这个 adb 命令,这将在应用程序运行时授予权限

    adb shell pm grant package android.permission.WRITE_SECURE_SETTINGS
    

    接下来的步骤:

    1. 连接您的设备(确保启用 USB 调试)

    2. 执行上面的adb命令

    3. 安装apk

    它对我有用...

    【讨论】:

    • 您是说这将永久授予APK此权限,还是每次都必须运行命令?
    • 它不是永久给定的..每次构建和运行代码时都执行此命令..
    • 用撤销替换授予
    • 仍然像 java.lang.SecurityException: grantRuntimePermission: 用户 2000 和当前进程都没有 android.permission.GRANT_RUNTIME_PERMISSIONS 一样抛出。
    【解决方案3】:

    就这个。您可以访问每个手机都有的小部件。

    public void ativaGPS() {
            LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
            if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                Intent intent = new Intent();
                intent.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
                intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
                intent.setData(Uri.parse("3"));
                sendBroadcast(intent);
            }
    

    【讨论】:

    • 这在 GPS 的情况下。在网络位置的情况下,我仍在寻找一种方法来做到这一点。
    • 这仅适用于旧版本的操作系统。 ICS 和更新的阻止它。
    • 是的,但它只适用于root手机,所以它不属于这个线程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2014-12-08
    • 2011-08-21
    • 1970-01-01
    • 2011-12-05
    • 2011-06-21
    相关资源
    最近更新 更多