作者:Andg在路上 | 来源:互联网 | 2022-12-08 14:58
如何解决《navigator.geolocation.getCurrentPosition()永远不会在Android上的WebView中返回》经验,应该怎么办?
我正在尝试访问Android WebView中提供的HTML Geolocation API(使用SDK版本24).
主要问题是Javascript中的调用navigator.geolocation.getCurrentPosition()
永远不会返回(既没有错误,也没有位置数据),而在应用程序端,我检查权限并使用android.webkit.GeolocationPermissions.Callback
类正确地将它们传递给WebView .
更新:这里只是澄清一下,"永不返回"我的意思是没有任何太多提供的回调navigator.geolocation.getCurrentPosition(success, error)
被调用.
在我为测试它而构建的示例应用程序(只有一个托管WebView的小活动)我在清单中声明权限并在App start上正确请求它们.我看到提示,可以授予或拒绝位置信息的许可.
表现:
主要形式的代码:
public boolean checkFineLocationPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION) && !mIsPermissionDialogShown) {
showPermissionDialog(R.string.dialog_permission_location);
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSION_ACCESS_FINE_LOCATION);
}
return false;
} else {
return true;
}
}
我可以在运行时使用期间检查权限Context.checkSelfPermission()
,我看到相应的权限被授予我的应用程序.
然后我尝试在WebView
控件中打开一个网页.我在设置中启用了所有必需的选项:
mWebSettings.setJavascriptEnabled(true);
mWebSettings.setAppCacheEnabled(true);
mWebSettings.setDatabaseEnabled(true);
mWebSettings.setDomStorageEnabled(true);
mWebSettings.setGeolocationEnabled(true);
mWebSettings.setJavascriptCanOpenWindowsAutomatically(true);
mWebSettings.setSupportZoom(true);
我使用以下WebChromeClient
重载来处理来自Javascript的地理定位请求:
protected class EmbeddedChromeClient extends android.webkit.WebChromeClient {
@Override
public void onGeolocationPermissionsShowPrompt(String origin,
android.webkit.GeolocationPermissions.Callback callback) {
// do we need to request permissions ?
if (ContextCompat.checkSelfPermission(EmbeddedBrowserActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// this should never happen, it means user revoked permissions
// need to warn and quit?
callback.invoke(origin, false, false);
}
else {
callback.invoke(origin, true, true);
}
}
}
为了测试这个,我使用以下代码(取自Mozilla API帮助页面,在此缩写):
function geoFindMe() {
function success(position) {}
function error() {}
navigator.geolocation.getCurrentPosition(success, error);
}
我看到的是,Javascript中的调用navigator.geolocation.getCurrentPosition(success, error)
永远不会返回.我看到onGeolocationPermissionsShowPrompt()
Java 中的方法被正确调用,当我检查权限时,我总是得到结果0,即PackageManager.PERMISSION_GRANTED
,callback.invoke(origin, true, true)
每次调用都执行.如果我多次尝试,我会看到几次调用我的Java代码.不过,我打电话后,Javascript端没有任何反应invoke()
.
我加入了代码来检查使用的调用授予的权限getOrigins(ValueCallback> callback)
在GeolocationPermissions
类中,描述了文档中的位置.我在回调中看到我的起源被允许请求位置(它们列在集合中).
任何想法在这里可能是错的?