我有一个 WebView,它加载一个具有基于位置的功能的页面和一个覆盖了 onGeolocationPermissionsShowPrompt() 的 WebChromeClient。启用位置服务时,为页面启用位置可以正常工作。
问题是,如果用户的位置被关闭,我想提示他们打开它,但如果它被关闭,我从不点击 onGeolocationPermissionsShowPrompt()。是否仅在位置可用时才调用此函数?
我有一个 WebView,它加载一个具有基于位置的功能的页面和一个覆盖了 onGeolocationPermissionsShowPrompt() 的 WebChromeClient。启用位置服务时,为页面启用位置可以正常工作。
问题是,如果用户的位置被关闭,我想提示他们打开它,但如果它被关闭,我从不点击 onGeolocationPermissionsShowPrompt()。是否仅在位置可用时才调用此函数?
一种解决方案是不保留权限(false
用作 中的第三个参数callback
)。这可能导致过多的权限请求,因此在本地存储结果可以解决:
class MyWebChromeClient : WebChromeClient() {
private var givenPermissions: Set<String> = emptySet()
override fun onGeolocationPermissionsShowPrompt(origin: String, callback: GeolocationPermissions.Callback) {
val onResult = { allow: Boolean -> callback(origin, allow, false) }
when {
origin in givenPermissions -> checkSystemPermission { granted ->
if (!granted) givenPermissions -= origin
onResult(granted)
}
else -> askForPermission { allow ->
when (allow) {
false -> onResult(false)
true -> checkSystemPermission { granted ->
if (granted) givenPermissions += origin
onResult(granted)
}
}
}
}
}
private fun askForPermission(callback: (Boolean) -> Unit) {
// ask for permission
}
private fun checkSystemPermission(callback: (Boolean) -> Unit) {
// check/ask for system permission
}
}
如果系统权限被撤销,WebChromeClient
应该自动重新创建。
不确定这是否正是您要寻找的,但我只是调用了一个方法 CheckEnableGPS()
//Method for turning GPS on if it isn't
private void CheckEnableGPS(){
String provider = Settings.Secure.getString(getContentResolver(),
Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
if(!provider.equals(""))
{
//GPS Enabled
Toast.makeText(ShowMapActivity.this, "GPS Enabled: " + provider, Toast.LENGTH_LONG).show();
}
else
{
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent);
}
}
您需要第二个和第三个参数为假
callback.invoke(origin, false, false);