无法使用“adb shell settings put”设置location_providers_allowed的值

时间:2016-03-27 02:57:02

标签: android adb

我正在尝试使用以下命令打开位置:

adb shell settings put secure location_providers_allowed gps,wifi,network
adb reboot

但是,它既不会更改变量 location_providers_allowed 的值,也不会在重启后在Android设置界面中将其打开。

我尝试使用相同的命令来设置其他变量,比如mock_location,并且它没有问题。 这个变量不可能改变吗?

Android版:M

4 个答案:

答案 0 :(得分:2)

我还没有解决这个问题,但希望提供我觉得相关的其他信息,可能会帮助其他人解决这个问题。

我试图关注this,但在其中一条评论中提及:

  

这曾经在Android 5上运行,但在Android 6上不再使用。无论是否使用root,设置都不会更改并保持与系统上配置的相同。它可能与location_providers_allowed被弃用有关(developer.android.com/reference/android/provider / ...) - gw0 2015年11月4日7:45

我查看了Settings.Secure location_providers_allowed的文档,果然:

  

此常量在API级别19中已弃用。使用LOCATION_MODE和MODE_CHANGED_ACTION(或PROVIDERS_CHANGED_ACTION)

我尝试设置location_mode,但对启用/停用位置服务没有影响。

通过location_providers_allowed标志手动打开/关闭位置服务时会受到影响,而不是location_mode。我发现文档说它已被弃用,但它仍然被使用并且location_mode我觉得很奇怪 不是

这就是我的全部。

答案 1 :(得分:2)

适用于Android 6.0

启用使用:

对于GPS:adb shell settings put secure location_providers_allowed +gps

对于网络:adb shell settings put secure location_providers_allowed +network

禁用:

GPS:adb shell settings put secure location_providers_allowed -gps

对于网络:adb shell settings put secure location_providers_allowed -network

答案 2 :(得分:1)

从Android 6到Android 9,如果您具有WRITE_SECURE_SETTINGS权限,则可以操纵“ location_providers_allowed”。

从Android 10开始,此操作如此处所述(搜索Android Q):enter image description here

均无效。

有一个新的API,但没有任何公开的方式可以更改任何设置:https://developer.android.com/reference/android/provider/Settings.Secure#LOCATION_PROVIDERS_ALLOWED

也许使用root用户或作为系统应用程序,都可以访问此文件:

@SystemApi
@TestApi
@RequiresPermission(WRITE_SECURE_SETTINGS)
public void setProviderEnabledForUser(String provider, boolean enabled, @NonNull UserHandle userHandle);

编辑:这非常适合作为系统应用程序。尚未尝试使用root。

答案 3 :(得分:0)

我通过拉/data/system/users/0/settings_secure.xml解决了这个问题

将以下设置的xml中的值更改为gps,网络或您想要的内容

   <!DOCTYPE html>
    <html>
    <head>
        <title>Parent</title>
        <script src="//cdn.bootcss.com/jquery/2.2.4/jquery.js"></script>
        <script>
            $(function() {

                $("#iframe1").attr("src","iframe.html");

                //iframe加载完毕以后执行的事件
                $("#iframe1").load(function(){
                    console.log('loaded...');
                    Handle();
                })

            });

            function Handle(){
                var money = 20000;
                $("#iframe1").contents().find("#nominal").on("change keyup", function() {
                    var input = $(this);
                    // remove possible existing message
                    if( input.next().is("form") )
                        input.next().remove();
                    // show message
                    if( input.val() > money )
                        alert('Hello');
                });
            }

        </script>
    </head>
    <body>
    <iframe id="iframe1">
    </iframe>
    </body>
    </html>

而不是将其推回到同一个地方并重新启动