Java 如何以编程方式在android中启用/禁用gps和移动数据?

Java 如何以编程方式在android中启用/禁用gps和移动数据?,java,android,gps,settings,Java,Android,Gps,Settings,我希望我的应用程序能够以编程方式启用/禁用gps和移动数据,因为有许多应用程序,如tasker、profile flow、lookout extra都可以做到这一点,所以我搜索了它,但没有找到任何有用的示例。我找到了以下代码,但它们不起作用 private void setMobileDataEnabled(Context context, boolean enabled) { final ConnectivityManager conman = (ConnectivityManager) c

我希望我的应用程序能够以编程方式启用/禁用gps和移动数据,因为有许多应用程序,如tasker、profile flow、lookout extra都可以做到这一点,所以我搜索了它,但没有找到任何有用的示例。我找到了以下代码,但它们不起作用

private void setMobileDataEnabled(Context context, boolean enabled) {
 final ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
 final Class conmanClass = Class.forName(conman.getClass().getName());
 final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
 iConnectivityManagerField.setAccessible(true);
 final Object iConnectivityManager = iConnectivityManagerField.get(conman);
 final Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
 final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
 setMobileDataEnabledMethod.setAccessible(true);

 setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
} 

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);
 }
} 

试试这个打开gps

public void turnGPSOn()
{
     Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
     intent.putExtra("enabled", true);
     this.ctx.sendBroadcast(intent);

    String provider = Settings.Secure.getString(ctx.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")); 
        this.ctx.sendBroadcast(poke);


    }
}
用于关闭gps

public void turnGPSOff()
{
    String provider = Settings.Secure.getString(ctx.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")); 
        this.ctx.sendBroadcast(poke);
    }
}
对于移动数据,您是否在清单中添加了权限?如果没有,请尝试添加并检查它

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

如果一切顺利,请告诉我

我希望我的应用程序能够启用/禁用gps

幸运的是,出于明显的隐私原因,这是不可能的。虽然有一些黑客,比如你问题中的那个,曾经奏效,但这些安全漏洞已经被修复

因为有很多应用程序可以做到这一点,比如tasker、profile flow和lookout extra


欢迎您提供证据,证明这些应用程序中的任何一款都可以在现代版本的Android上实现这一点。

您使用的Android版本是什么?Android 2.3和4.1.2请尝试以下代码,让我知道这是否有效。这是一种工作感谢,但它正在做的是打开服务,因此,如果使用我的应用程序启动它,状态栏顶部会出现一个图标,它正在搜索gps……如果我甚至手动或从应用程序关闭它,它不会从那里开始,在android 4.1.2上,它没有打开gps图标状态栏,但它启动了服务,但在android 2.3中,它打开了图标,也启动了服务忘记GPS。。。您至少可以禁用移动数据吗?如果是,如何。。。代码(GPS代码除外)有效吗?也,请提及其他需要更改的内容,如名称空间等……这是一种工作方式,谢谢,但它正在做的是打开服务,因此如果使用我的应用程序启动它,状态栏顶部会出现一个图标,它正在搜索gps……如果我甚至手动或从应用程序关闭它,它不会从那里开始,在android 4.1.2上也不会打开状态栏中的gps图标,但它启动了服务,但在android 2.3中,它打开了图标并启动了服务。幸运的是,您的gps攻击依赖于一个已经修复了相当长时间的安全漏洞。@感谢提及Commonware,我将在我的未来场景中更正它。我尝试了这个,它只是表明了这一点“搜索全球定位系统“但实际上并没有打开它。它在通知栏上显示gps图标,但实际上并没有打开配置文件流的开发者gpsim。”。。关于这一讨论,在最新版本的android中,控制/更改GPS设置是不可能的。。除非它生根!因为这个问题也是关于移动网络的,而且你什么也没提到,我想这个功能对我们所有的普通人来说都是有效的…:)?@TacB0sS:我不知道移动数据。我稍后会尝试一下,然后发布一个回复。。。感谢同样的想法,从4.2开始,设备区域设置更改api也受到了限制