java - 为什么不断调用 onGeolocationPermissionsShowPrompt?

标签 java android geolocation location android-permissions

我有一个使用 WebView 的应用程序,其中网站可能会请求使用设备的地理位置。我的主要 Activity 如下:

public void onGeolocationPermissionsShowPrompt(final String origin, final GeolocationPermissions.Callback callback) {
    m_geolocationCallback = null;
    m_geolocationOrigin = null;

    // If we don't have location permissions, we must request them first
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // Show rationale if necessary
        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)) {

            new AlertDialog.Builder(MainActivity.this)
                    .setMessage(getString(R.string.permission_location_rationale, origin))
                    .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            m_geolocationOrigin = origin;
                            m_geolocationCallback = callback;
                            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
                        }
                    })
                    .show();
        }
        else {
            m_geolocationOrigin = origin;
            m_geolocationCallback = callback;
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
        }
    }
    // Otherwise just tell webview that permission has been granted
    else {
        callback.invoke(origin, true, false);
    }
}

为了处理权限请求的结果,MainActivity还有以下内容:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION:
            // Permission granted
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (m_geolocationCallback != null) {
                    m_geolocationCallback.invoke(m_geolocationOrigin, true, false);
                }
            }
            // Permission denied
            else {
                // In this case, the user checked "Don't ask again" and denied permission
                if (Build.VERSION.SDK_INT >= 23 && !shouldShowRequestPermissionRationale(permissions[0])) {
                    Toast.makeText(this, R.string.permission_location_denied, Toast.LENGTH_LONG).show();
                }

                if (m_geolocationCallback != null) {
                    m_geolocationCallback.invoke(m_geolocationOrigin, false, false);
                }
            }
            return;
    }
}

我遇到的问题是,每当网站请求使用地理定位而我拒绝它(导致调用 invoke(origin, false false))时,onGeolocationPermissionsShowPrompt 方法立即被调用,我陷入了无休止地拒绝应用程序权限的循环。

如果我在权限请求中勾选“不再询问”,它工作正常,但我希望能够在稍后的某个时间点再次询问用户权限。

我尝试通过将我的拒绝回调调用更改为来解决此问题 m_geolocationCallback.invoke(m_geolocationOrigin, false, true),但这不会产生预期的效果。这将阻止停止对 onGeolocationPermissionsShowPrompt 的连续调用,但这也意味着即使稍后启用了权限,给定的来源也不能再使用地理定位,而且我发现无法撤消此操作(即使通过卸载/重新安装应用程序)。

关于如何解决这个问题有什么想法吗?

最佳答案

这看起来像是 Android Webview 中的错误。如果使用 granted=false 异步调用 callback.invoke,则会发生无限循环,但如果在 onGeolocationPermissionsShowPrompt 中同步调用,则不会发生无限循环。

我的解决方法是在用户拒绝地理定位权限时节省时间。如果 onGeolocationPermissionsShowPrompt 在短时间内再次被调用并且 checkSelfPermission 没有返回 PERMISSION_GRANTED,运行 callback.invoke(origin, false, false)并且不要重新提示用户。

关于java - 为什么不断调用 onGeolocationPermissionsShowPrompt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53090545/

相关文章:

生产方式中的 Java 和 GeoLite 数据库 : How to use GeoLiteCity. dat?

java - 如何在 Android Studio 中创建分数计数器?

java - hibernate :hbm2ddl.auto=update 和 autoincrement

android - 在 Google Code 上获取整个项目

android - Titanium Android 标签栏文字颜色

geolocation - AWS 数据中心位置在哪里列出?

java - 如何将现有的java项目导入android studio?

java - Android webview进度条无论有没有网络都会持续加载

android - adb 无法在 Ubuntu 64 上运行 - 找不到命令

javascript - 延迟提交表单,直到检索到位置