java - 为什么持续调用 onGeolocationPermissionsShowPrompt?
问题描述
我有一个使用 WebView 的应用程序,其中站点可能会请求使用设备的地理位置。我的主要活动有以下内容:
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)
并且不重新提示用户。
推荐阅读
- android - Can I Use ChromeCast to get Audio from TV
- java - Oracle HTTP If-None-Match 返回 ETag + Last-Modified
- excel - Matlab unique() vs Excel 删除重复项
- c++ - 在 C++ 切换案例中省略默认案例
- javascript - Jquery通过多个参数过滤问题
- c# - 使用 table api 时 cosmos 不返回任何记录
- dart - Flutter - 检查数组元素是否为空
- angular - 具有相同名称的打字稿导入类导致覆盖
- python - 尝试使用 os 库获取文件大小时,文件路径不起作用 [WinError 2]
- gradle - 关于QueryDSL、Spring Data、Gradle的几个问题