在已经获取root权限的设备上开启GPS

4

关于在安卓设备上通过程序来开启/关闭GPS功能的问题已经被讨论过很多次,而答案总是相同的:出于安全和隐私原因,你无法这样做。但对于已root的设备,是否可以通过编辑系统设置来开启GPS呢?

2个回答

2

已有root权限的设备可以使用此解决方案。请查看我的个人资料中的一个答案。我现在无法详细说明(正在医院)。但目前需要root和busybox。我正在尝试使其在没有busybox的情况下工作。已经在2.3.5、4.0.1和4.1.2上进行了测试。

http://rapidshare.com/files/3977125468/GPSToggler-20130214.7z


1
你必须从GIT https://github.com/sms2000/GPSToggler 自己下载它。 - OGP
嘿OGP,你是如何处理启用网络定位时显示的GPS免责声明消息的?是否可以删除或隐藏它?非常感谢! - BQuadra
进入设置 > 本地化,手动启用网络本地化。这将显示一个活动,询问您是否要启用网络本地化。通过 netcat,我找到了一种通过 adb 重新打开此活动的方法: am start com.google.android.location/.ConfirmAlertActivity如果您以编程方式使用 Secure.putString(context.getContentResolver(), Secure.LOCATION_PROVIDERS_ALLOWED, "gps,network"); 来启用网络本地化,则会显示此活动,要求用户允许网络本地化,直到用户允许此操作,网络本地化才会启用。 - BQuadra
感谢您的回复OGP,我看到了您的代码,它只启用GPS定位(不使用基于网络的定位)。在您的代码中,您执行'String newSet = String.format ("%s,%s", beforeEnable, LocationManager.GPS_PROVIDER);'并仅允许GPS定位而不是网络。如果您改为调用Secure.putString(context.getContentResolver(), Secure.LOCATION_PROVIDERS_ALLOWED, "gps,network");,则您的代码将显示来自Android的有关允许网络定位的通知。我想要删除这个烦人的消息!谢谢 - BQuadra
很奇怪。代码中的“关闭”部分返回了从启用GPS时读取的字符串。如果是“网络”,则会重新安装相同的内容。但我没有看到任何消息... - OGP
显示剩余5条评论

0

您可以通过编程方式在Android 2.2(API 8)及以下版本中打开/关闭GPS

这是我正在使用的代码

public class GpsOnOff extends Activity implements OnClickListener {
    Button onButton;
    Button offButton;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        onButton = (Button) findViewById(R.id.btnON);
        offButton = (Button) findViewById(R.id.btnOFF);

        onButton.setOnClickListener(this);
        offButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        if(v==onButton){

            //this will work upto 2.2 api only
            turnGPSOn();

            //this will work for all but it Navigate to 
                         GPS setting screen only 
            //not change settings automatically
            /*Intent in = new  Intent(android.provider.Settings
                         .ACTION_LOCATION_SOURCE_SETTINGS); 
            startActivity(in);*/


            Toast.makeText(getApplicationContext(),
                            "gps enabled", 1).show();
        }
        else if(v==offButton){
            turnGPSOff();
            Toast.makeText(getApplicationContext(), 
                           "gps disabled", 1).show();
        }

    }

    private void turnGPSOn(){
        String provider = Settings.Secure
           .getString(getContentResolver(),  
                Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

        if(!provider.contains("gps")){ //if gps is disabled
            final Intent poke = new Intent();
            poke.setClassName("com.android.settings", 
                        "com.android.settings.widget
                     .SettingsAppWidgetProvider"); 
            poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
            poke.setData(Uri.parse("3")); 
            sendBroadcast(poke);
        }
    }

    private void turnGPSOff(){
        String provider = Settings.Secure.getString(
            getContentResolver(), Settings.Secure
              .LOCATION_PROVIDERS_ALLOWED);

        if(provider.contains("gps")){ //if gps is enabled
            final Intent poke = new Intent();
            poke.setClassName("com.android.settings", 
                   "com.android.settings.widget
              .SettingsAppWidgetProvider");
            poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
            poke.setData(Uri.parse("3")); 
            sendBroadcast(poke);
        }
    }
}

请确保您需要在manifest文件中添加以下两个权限

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

你可以将目标设置为2.2,这样就可以正常工作。或者在Android版本大于2.2的情况下,你可以将用户导航到设备中的GPS设置屏幕。 - swiftBoy
实际上,我不希望用户导航到设置屏幕。我知道这是一个坏主意...但是有没有可能的方法来做到这一点...通过root设备并在系统设置中进行一些编辑... - Dory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接