android 默认打开高精度定位模式,accept Improve location accuracy

您所在的位置:网站首页 vivo手机怎么开启高精度导航功能呢 android 默认打开高精度定位模式,accept Improve location accuracy

android 默认打开高精度定位模式,accept Improve location accuracy

2024-07-05 09:54| 来源: 网络整理| 查看: 265

需求:GPS位置信息模式默认为“仅限设备”, 应客户的要求,默认为“高精确度” 修改:/frameworks/base/packages/SettingsProvider/res/values/defaults.xml

- gps + gps,network

编译后烧录,发现没变化还是默认仅限设备(我的项目中有gms),追踪源码发现在SettingsHelper.java中被限制了。 源码路径:frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java

... } else if (Settings.Secure.LOCATION_PROVIDERS_ALLOWED.equals(name)) { setGpsLocation(value); return; } ... private void setGpsLocation(String value) { UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); if (um.hasUserRestriction(UserManager.DISALLOW_SHARE_LOCATION)) { return; } final String GPS = LocationManager.GPS_PROVIDER; boolean enabled = GPS.equals(value) || value.startsWith(GPS + ",") || value.endsWith("," + GPS) || value.contains("," + GPS + ","); Settings.Secure.setLocationProviderEnabled( mContext.getContentResolver(), GPS, enabled); }

可以看到,如果def_location_providers_allowed的值包含gps,就还是默认仅限设备,如果只设置为network,就默认关闭gps了。直接设置

final String NETWORK = LocationManager.NETWORK_PROVIDER; Settings.Secure.setLocationProviderEnabled( mContext.getContentResolver(), NETWORK, enabled);

会有google的弹窗提示,不符合我们的要求。

分析如何去掉Improve location accuracy弹窗

1.使用adb命令抓取弹窗所在的activity,得到com.google.android.location.network.ConfirmAlertActivity 2.根据activity名字,搜索log得到关键词content://com.google.settings/partner/network_location_opt_in 3.反编译GmsCore_arm.apk,从GmsCore_arm的源码中知道点击同意之后对network_location_opt_in的值做了操作,然后关闭弹窗。 adb查看activity apktool反编译

下面给出完整修改: 1.去掉Improve location accuracy弹窗,设置location provider

修改:/package/apps/Launcher3/src/com/android/launcher3/launcher.java

// 在onCreate()方法中添加 mHandler.postDelayed(new Runnable() { public void run() { // 判断用户是否手动设置了定位模式 int mode = Settings.System.getInt(getContentResolver(), "location_mode_changed", 0); // 1 : has changed 0 : no change // 去掉Improve location accuracy弹窗 ContentResolver localContentResolver = getContentResolver(); ContentValues localContentValues = new ContentValues(); localContentValues.put("name", "network_location_opt_in"); localContentValues.put("value", 1); localContentResolver.insert(Uri.parse("content://com.google.settings/partner"), localContentValues); if(mode == 0){ // user did not choose the location mode Settings.Secure.setLocationProviderEnabled(localContentResolver, "network", true); } } }, 10000); // 这里加延时是由于google的应用服务起来比较慢,起来之后会设置network_location_opt_in的值 2.添加google应用中自定义的权限,不加会报错

修改:/package/apps/Launcher3/AndroidManifest.xml

3.系统签名,不是系统签名会报错

修改:/package/apps/Launcher3/Android.mk

LOCAL_CERTIFICATE := platform 4.用户手动设置定位模式

修改:/package/apps/Settings/src/com/android/settings/location/LocationMode.java

@Override public void onRadioButtonClicked(RadioButtonPreference emiter) { int mode = Settings.Secure.LOCATION_MODE_OFF; if (emiter == mHighAccuracy) { mode = Settings.Secure.LOCATION_MODE_HIGH_ACCURACY; } else if (emiter == mBatterySaving) { mode = Settings.Secure.LOCATION_MODE_BATTERY_SAVING; } else if (emiter == mSensorsOnly) { mode = Settings.Secure.LOCATION_MODE_SENSORS_ONLY; } + Settings.System.putInt(getContentResolver(), "location_mode_changed", 1); // 1 : has changed 0 : no change setLocationMode(mode); }

可以在studio中编写,然后对apk做系统签名验证。 对apk系统签名.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3