如何在集成Google Maps的WebView安卓应用中获取当前定位
Android WebView 无法获取定位问题解决方案
- 补充运行时动态权限申请
Android 6.0(API 23)及以上系统中,ACCESS_COARSE_LOCATION、ACCESS_FINE_LOCATION属于危险权限,仅在AndroidManifest中声明不生效,需要在加载WebView前主动向用户申请权限,用户同意后方可调用定位能力。
参考代码:
// 加载WebView前先检查定位权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 未授权,发起权限申请 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1001); } else { // 已授权,直接加载网页 webView.loadUrl("你的Google Maps页面地址"); } // 重写权限申请结果回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1001) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限申请通过,加载网页 webView.loadUrl("你的Google Maps页面地址"); } else { // 权限被拒绝,可提示用户定位权限为地图功能必需权限 } } }
- 配置WebView定位相关属性
需要手动开启WebView的定位支持,同时重写WebChromeClient的定位权限回调,将系统权限授予网页使用:
WebSettings webSettings = webView.getSettings(); // 开启JavaScript支持(Google Maps必须开启) webSettings.setJavaScriptEnabled(true); // 开启WebView定位功能 webSettings.setGeolocationEnabled(true); // 配置定位权限缓存路径,避免网页重复申请定位权限 webSettings.setGeolocationDatabasePath(getFilesDir().getPath()); // 配置WebChromeClient处理网页的定位申请 webView.setWebChromeClient(new WebChromeClient() { @Override public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { // 直接授予当前网页定位权限,也可自定义弹窗由用户确认后再授权 callback.invoke(origin, true, false); } });
- 检查系统定位开关状态
如果用户设备的总定位开关(位置信息/GPS)未开启,即便应用有授权也无法获取位置,可提前检测开关状态,引导用户开启定位。 - 高版本系统适配
如果应用目标SDK为Android 12(API 31)及以上,需要注意系统新增了精/粗略定位的单独授权选项,Google Maps需要精定位权限才能正常获取当前位置,申请权限时要确认用户是否授予了精定位权限。
内容的提问来源于stack exchange,提问作者rndmntzn
相关产品推荐
相关产品推荐

