Android 在代码中设置打开关闭GPS不必用户操作
来源:互联网 发布:邪器全集知乐 编辑:程序博客网 时间:2024/05/19 19:59
手机应用中最酷的可能就是位置服务相关的了,如何读取GPS信息,在官方文档上有相当详细的说明,后面如果有机会,我也会专门写例子来介绍(教程已完成,请参见:教程:实现Android的不同精度的定位(基于网络和GPS))。但今天,我们先来看下如何以编程的方式来开启或关闭GPS。
官方的API中,android.provider.Settings.Secure类有2个静态方法:
public static final void setLocationProviderEnabl
和
public static final boolean isLocationProviderEnable
不过遗憾的是,这2个方法都注明了从API Level 8(即Android2.2)才开始提供,那么在2.2之前又该如何编程实现GPS的开关呢?
山重水复疑无路
首先,我们要知道,Android系统的设置画面中就可以进行GPS的开关,那么它是如何实现的呢?
由于我的机器上的android source是2.3版本的,所以直接启动了一个2.1的模拟器,用adbpull将Settings.apk抓下来,反编译之后,在SecuritySettings类中找到如下代码:
package,com.android.settings.SecuritySettings.java
CheckBoxPreference localCheckBoxPreference3
if (paramPreference ==localCheckBoxPreference3
ContentResolver localContentResolver3 = getContentResolver();
boolean bool6=this.mGps.isChecked();
continue;
可以看到2.1系统中已经存在有Settings.Secure.setLocationProviderEnabl
既然Setting画面中的用法,我们不能使用,那么再换1种方法,我们去看一下Settings.Secure.setLocationProviderEnabl
这次,我们直接去看Android 2.3的源码,找到Setting.java之后,找到相关的方法,代码如下:
core, android.provider.Setting.java
原来这个方法只是1个包装,事实上调用的还是Settings.Secure中的putString方法,我们直接借用过来:
在自己的onClick事件中写上
Settings.Secure.putString(getContentResolver(),Settings.Secure.LOCATION_PROVIDERS_ALLOWED, “network,gps”);
然后执行,WOW,发生了什么,需要android.permission.WRITE_SETTINGS权限?在Manifest文件中加上,再运行,还是出错,不过这次需要的是android.permission.WRITE_SECURE_SETTINGS,再次加上。
满怀希望的再次运行,结果还是一样的问题:
java.lang.SecurityException: Permission denial: writing to securesettings requires android.permission.WRITE_SECURE_SETTINGS
看来,Google封死了直接调用Settings的路了,事实上我又试着使用反射来直接调用setLocationProviderEnabl
柳暗花明又一村难道没有别的办法了吗?那些2.1中可以运行的App Widget是如何做到的呢?
再次检视2.1的Settings.apk中的代码,发现有1个widget包,里面有1个类叫SettingsAppWidgetProvide
由于这是反编译的结果,略微有点混乱,但还是可以看出思路,目的是通过PendingIntent来扔出1个Intent,接受者是SettingsAppWidgetProvide
那么我们只要送出custom:3的Uri给SettingsAppWidgetProvide
说到做到,在Activity中添加如下方法:
这个方法是1个纯开关,如果当前是开启的,那么就会关闭它,反之亦然。
检查GPS开关状态那么,如何查看当前的GPS开关状态呢?可以用上面提到的反射方式调用isLocationProviderEnable
也可以直接用下面的方法:
这2种方法的原理都是一样的,方法2其实也就是isLocationProviderEnable
总结如果目标手机是运行Android2.2的话,那么最好还是使用2.2开放的Settings.Secure类中的2个方法来操作。但如果目标手机运行的版本是2.1或以下的话,那么就只能使用变通的方法来实现了。这1方法在Android官方的Wiki上已经有人提出了,详情请见:Issue7890。但可能是2.1版本已经古旧不再维护的原因,官方并未进行任何的Fix。
- Android 在代码中设置打开关闭GPS不必用户操作
- Android中如何打开或关闭GPS
- android中gps的打开关闭
- Android 直接打开Gps,不需要用户操作
- Android在代码中打开Wifi、移动网络和GPS
- Android在代码中打开Wifi、移动网络和GPS
- Android在代码中打开Wifi、移动网络和GPS
- Android在代码中打开Wifi、移动网络和GPS
- Android在代码中打开Wifi、移动网络和GPS
- Android在代码中打开Wifi、移动网络和GPS
- Android在代码中打开Wifi、移动网络和GPS
- Android打开系统GPS设置页面代码
- android 在代码中打开 系统设置
- android 默认打开位置服务,默认关闭GPS设置
- 系统中打开GPS和关闭GPS
- android 打开或关闭GPS
- Android打开或者关闭GPS
- 【笔记】Android在代码中打开或关闭WiFi
- Android为Spinner填充数据后设置默认值的问题
- Android 在OnCreate()中获取控件高度与宽度
- Android 解决Android requires compiler compliance level 5.0 or 6.0. Found '1.7'
- Android TextView自动换行文字排版参差不齐的原因
- ROS学习笔记10 - 编写编译和检验Service Node
- Android 在代码中设置打开关闭GPS不必用户操作
- Android 获取手机IMEI
- Android 解决attempt to acquire a reference on a close SQLiteClosable
- Android 设置Dialog不允许返回或搜索键消除
- 我的博文
- Android 如何使用draw9patch,介绍的很详细,图文并茂,收藏下,备忘!
- Android SQLite中表自动生成字段的方法
- Android ScrollView与ListView一起(嵌套)使用解决ListView自动滚动的几点方案
- Linux 0.11下信号量的实现和应用