WebView不要求地理定位

时间:2016-12-01 12:18:52

标签: android webview geolocation

我正在使用WebView加载具有地理位置请求的站点。 我在清单中添加权限,请求用户访问,启用javascript。

来自WebChromeClient的方法“onGeolocationPermissionsShowPrompt”和“onPermissionRequest”在KitKat中没有在Android Marshmallow中调用它完全正常工作。

我还添加了日志来检查它是如何工作的。

public void onGeolocationPermissionsShowPrompt(final String origin, final GeolocationPermissions.Callback callback) {
    Log.e("Test", "Geolocation " + origin);
    callback.invoke(origin, true, false);
}

public void onPermissionRequest(PermissionRequest request) {
    Log.e("Test", "Request permission");
    super.onPermissionRequest(request);
}

这是webView设置

webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setGeolocationEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);
webView.getSettings().setSupportMultipleWindows(false);
webView.getSettings().setSupportZoom(false);

并显示权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.vogella.android.locationapi.maps.permission.MAPS_RECEIVE" />
<uses-permission android:name="com.vogella.android.locationapi.maps.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />

感谢您的回答。

1 个答案:

答案 0 :(得分:2)

我认为您需要先获取位置权限才能获得地理位置。

这是我用过的东西

    private static final String[] INITIAL_PERMS={
        android.Manifest.permission.ACCESS_FINE_LOCATION,
        android.Manifest.permission.ACCESS_COARSE_LOCATION
};
private static final int INITIAL_REQUEST=1337;

为每个权限创建方法

    @RequiresApi(api = Build.VERSION_CODES.M)
    private boolean canAccessFineLocation() {
       return(hasPermission(Manifest.permission.ACCESS_FINE_LOCATION));
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private boolean canAccessCoarseLocation() {
      return(hasPermission(Manifest.permission.ACCESS_COARSE_LOCATION));
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private boolean hasPermission(String perm) {
      return(PackageManager.PERMISSION_GRANTED ==checkSelfPermission(perm));
    }
onCreate中的

确保添加此

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
       if(!canAccessCoarseLocation() || !canAccessFineLocation()){
        requestPermissions(INITIAL_PERMS, INITIAL_REQUEST);
       }
    }

还要确保您在Chrome客户端中使用此代码

       webView.setWebChromeClient(new android.webkit.WebChromeClient() {

        // geolocation
        @Override
        public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) {
            callback.invoke(origin, true, false);

        }