Android系统中,只有系统设置里面有入口开关位置服务。其他的应用应该怎么去开关这个服务呢?
首先,应用需要有系统权限(签名),在这基础上,我们就可以通过一些手段来实现这个功能。
这里要注意一点,不通的Android版本的操作方式也不一样。需要区别对待。
应用加上系统签名
在manifest
标签里面,加上android:sharedUserId="android.uid.system"
,然后用系统的签名给apk签名,可以放到系统中去编译,也可以用AndroidStudio
指定签名文件签名
<?
Android 5 到 Android 8
对于这几个版本,通过修改Settings.Secure
数据库加上广播即可实现。
private static boolean updateLocationMode(Context context, int oldMode, int newMode) { Intent intent = new Intent("com.android.settings.location.MODE_CHANGING"); intent.putExtra("CURRENT_MODE", oldMode); intent.putExtra("NEW_MODE", newMode); context.sendBroadcast(intent, android.Manifest.permission.WRITE_SECURE_SETTINGS); return Settings.Secure.putInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE, newMode);}/** * Settings.Secure.LOCATION_MODE_OFF // 关闭 * Settings.Secure.LOCATION_MODE_SENSORS_ONLY // GPS only * Settings.Secure.LOCATION_MODE_BATTERY_SAVING // 降低GPS上报频率 * Settings.Secure.LOCATION_MODE_HIGH_ACCURACY // 高精度 */public static void setLocationEnabled(Context context, int mode){ int oldMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF); updateLocationMode(context, oldMode, mode);}
Android 9
这里需要使用反射,调用LocationManager
的setProviderEnabledForUser
方法来实现
@RequiresApi(api = Build.VERSION_CODES.P)public static void setProviderEnabledForUser(Context context, String provider, boolean enabled){ LocationManager locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); try{ Field field = UserHandle.class.getDeclaredField("SYSTEM"); field.setAccessible(true); UserHandle userHandle = (UserHandle) field.get(UserHandle.class); Method method = LocationManager.class.getDeclaredMethod( "setProviderEnabledForUser", String.class, boolean.class, serHandle.class); method.invoke(locationManager, provider, enabled, userHandle); }catch(Exception e){ Log.e(TAG, "can not setProviderEnabledForUser:(" + provider +"," + enabled +")"); }}
Android 10以上
和Android 9
类似,只不过调用的方法不一样,通过调用LocationManager
的setLocationEnabledForUser
方法来实现
@RequiresApi(api = Build.VERSION_CODES.Q)public static void setLocationEnabledForUser(Context context, boolean enabled){ LocationManager locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); try{ Field field = UserHandle.class.getDeclaredField("SYSTEM"); field.setAccessible(true); UserHandle userHandle = (UserHandle) field.get(UserHandle.class); Method method = LocationManager.class.getDeclaredMethod( "setLocationEnabledForUser", boolean.class, UserHandle.class); method.invoke(locationManager, enabled, userHandle); }catch(Exception e){ Log.e(TAG, "can not setLocationEnabledForUser:(" + enabled +")"); }}
原文转载:http://www.shaoqun.com/a/521196.html
智赢:https://www.ikjzd.com/w/1511
淘粉吧首页:https://www.ikjzd.com/w/1725.html
Android系统中,只有系统设置里面有入口开关位置服务。其他的应用应该怎么去开关这个服务呢?首先,应用需要有系统权限(签名),在这基础上,我们就可以通过一些手段来实现这个功能。这里要注意一点,不通的Android版本的操作方式也不一样。需要区别对待。应用加上系统签名在manifest标签里面,加上android:sharedUserId="android.uid.system"
easel:easel
自贸区跨境通网站:自贸区跨境通网站
旺季过后单量下跌严重?应对方案拿走不谢!:旺季过后单量下跌严重?应对方案拿走不谢!
速卖通上半年创业规划:速卖通上半年创业规划
亚马逊选品表格:亚马逊选品表格
No comments:
Post a Comment