Android WebView加载Leaflet地图提示定位权限不足怎么解决?
解决方案
核心问题原因
你遇到的报错是因为Android 6.0(API 23)及以上系统中,定位属于敏感权限,仅在AndroidManifest.xml中声明是无效的,必须在应用运行时主动向用户申请权限,用户授权通过后WebView才能正常调用定位能力。
具体修改步骤
1. 修改MainActivity.java新增动态权限申请逻辑
完整修改后的代码如下:
package com.vinaysomawat.careerhigh; import android.Manifest; import android.content.pm.PackageManager; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import android.webkit.GeolocationPermissions; import android.webkit.WebChromeClient; public class MainActivity extends ActionBarActivity { WebView mywebview; // 定位权限请求码 private static final int LOCATION_PERMISSION_REQUEST_CODE = 1; public class GeoWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } } public class GeoWebChromeClient extends android.webkit.WebChromeClient { @Override public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback){ callback.invoke(origin, true, false); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 先检查定位权限是否已经授予 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}, LOCATION_PERMISSION_REQUEST_CODE); } else { // 已授权,初始化WebView initWebView(); } } // 抽离WebView初始化逻辑 private void initWebView() { mywebview = (WebView)findViewById(R.id.webView); WebSettings webSettings = mywebview.getSettings(); mywebview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); mywebview.getSettings().setBuiltInZoomControls(true); mywebview.setWebViewClient(new GeoWebViewClient()); mywebview.getSettings().setJavaScriptEnabled(true); mywebview.getSettings().setGeolocationEnabled(true); mywebview.setWebChromeClient(new GeoWebChromeClient()); mywebview.getSettings().setAppCacheEnabled(true); mywebview.getSettings().setDatabaseEnabled(true); mywebview.getSettings().setDomStorageEnabled(true); mywebview.getSettings().setGeolocationDatabasePath(getFilesDir().getPath()); mywebview.loadUrl("https://domoritz.github.io/leaflet-locatecontrol/demo/"); } // 处理权限申请结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { initWebView(); } else { Toast.makeText(this, "定位权限被拒绝,无法使用定位功能", Toast.LENGTH_SHORT).show(); } } } @Override public void onBackPressed(){ if(mywebview != null && mywebview.canGoBack()) { mywebview.goBack(); } else { super.onBackPressed(); } } @Override public boolean onCreateOptionsMenu(Menu menu){ getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item){ int id = item.getItemId(); if(id == R.id.action_settings){ return true; } return super.onOptionsItemSelected(item); } }
2. 测试注意事项
如果之前已经安装过应用并拒绝过定位权限,需要先卸载应用重装,或者手动进入系统设置-应用管理-找到当前应用-权限管理,开启定位权限后再测试。
3. 可选适配(针对Android 12及以上)
如果你的应用targetSdkVersion >=31,还可以在AndroidManifest.xml中补充权限声明,适配系统定位规则,提升定位精度。
内容的提问来源于stack exchange,提问作者Nicolaesse
相关产品推荐
相关产品推荐

