Android M: 系统权限 vs WebView位置权限

3
我有一个WebView,加载了一些需要GeolocationPermissions权限的页面。为此,我重写了onGeolocationPermissionsShowPrompt()方法。好的。
此外,我的应用程序针对SDK 23(Android M)使用新的权限模型。因此,我需要检查用户是否授予了ACCESS_FINE_LOCATION权限,如果没有,则显示一个对话框请求权限。
如何仅为需要GeolocationPermissions权限的页面显示该对话框?
回调函数onPermissionRequest(PermissionRequest request)未被调用。
AndroidManifest:
WebView回调函数
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
    callback.invoke(origin, true, true);
    super.onGeolocationPermissionsShowPrompt(origin, callback);
}

@Override
public void onPermissionRequest(PermissionRequest request) {
    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
        requestLocationPermission();
    else {
        super.onPermissionRequest(request);
    }

显示对话框权限
private void requestLocationPermission() {
    if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)) {
      new ADPDialogFragment(getActivity()) {
        @Override
        public String getTitre() {
            return getString(R.string.mob_he_configuration_dialogue_message_titre);
        }

        @Override
        public String getMessage() {
            return getString(R.string.permission_location_rationale);
        }

        @Override
        public void doPositiveClick() {
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION);
        }
    }.show(getFragmentManager(), TAG);
} else {
    ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION);
}

权限回调

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

    if (requestCode == REQUEST_LOCATION) {
        // BEGIN_INCLUDE(permission_result)
        // Received permission result for camera permission.
        Log.i(TAG, "Received response for Camera permission request.");

        // Check if the only required permission has been granted
        if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Camera permission has been granted, preview can be displayed

        } else {
            Toast.makeText(getActivity(), getString(R.string.permissions_not_granted), Toast.LENGTH_SHORT).show();

        }
        // END_INCLUDE(permission_result)

    } else {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

感谢您的帮助!

你在 Android SDK 23 上成功了吗?我做不到,就好像 callback.invoke 没有任何作用一样... - Luchi Valles
1个回答

4

当调用onGeolocationPermissionsShowPrompt时,您可以要求用户的权限:

@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED) {
        mCallback = callback;
        mOrigin   = origin;
        requestLocationPermission();
    } else {
        callback.invoke(origin, true, true);
    }
}

当用户选择是否授权给您权限时:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String[] permissions,
                                       @NonNull int[] grantResults)
{
    switch (requestCode) {
    case REQUEST_LOCATION:
        if (mCallback != null && mOrigin != null)
            mCallback.invoke(mOrigin,
                             grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED,
                             false);
        mCallback = null;
        mOrigin   = null;
        break;

    default:
        super.onRequestPermissionsResult(requestCode, permissions,
                                         grantResults);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接