【问题标题】:WebView not asking geolocationWebView 不询问地理位置
【发布时间】:2016-12-01 12:18:51
【问题描述】:

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

来自 WebChromeClient 的方法“onGeolocationPermissionsShowPrompt”和“onPermissionRequest”没有在 Android Marshmallow 中调用,而在 KitKat 中一切正常。

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

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" />

感谢您的回答。

【问题讨论】:

    标签: android webview geolocation


    【解决方案1】:

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

    这是我用的

        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);
    
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2021-09-15
      相关资源
      最近更新 更多