You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:36:08