我有使用javascript geolocation api的网站,并希望它在webview中打开。我在清单文件中设置了这些权限:
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
在我的活动中,我还设置了webview设置:
webview.getSettings().setDatabaseEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.getSettings().setGeolocationDatabasePath("/data/data/com.my.app/databases");
webview.getSettings().setGeolocationEnabled(true);
我还处理了javascript地理定位对话框:
webview.setWebChromeClient(new WebChromeClient(){
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false);
}
});
地理位置本身正在运行,但我无法将地理位置缓存到数据库中。它应该自己进入CachedGeoposition.db,但是当我启动webview时,我得到了这个奇怪的SQLite错误:
E/SQLiteLog(22653): (14) cannot open file at line 30174 of [00bb9c9ce4]
E/SQLiteLog(22653): (14) os_unix.c:30174: (2) open(/CachedGeoposition.db) -
D/WebKit (22653): ERROR:
D/WebKit (22653): SQLite database failed to load from /CachedGeoposition.db
D/WebKit (22653): Cause - unable to open database file
D/WebKit (22653):
D/WebKit (22653): external/webkit/Source/WebCore/platform/sql/SQLiteDatabase.cp
p(71) : bool WebCore::SQLiteDatabase::open(const WTF::String&, bool)
当我在文件资源管理器中检查CachedGeoposition.db文件的存在时,它始终存在, 并且db的权限设置为-rw -------。
我是否遗漏了设置中可能导致数据库无法正确打开的内容? 我是Android新手,现在试图找到解决方案2天。任何帮助将不胜感激。谢谢。
答案 0 :(得分:2)
我会发布一个对我有用的解决方案,希望它可以提供有关错误可能位置的一些想法。如果您可以提供有关您正在测试的设备(模拟器)/操作系统的详细信息,也会有所帮助。
我测试过(没有错误):
AndroidManifest权限(几乎相同):
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
网络视图设置:
WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDatabaseEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setGeolocationDatabasePath(getFilesDir().getPath());
webSettings.setGeolocationEnabled(true);
Web chrome客户端(相同):
webview.setWebChromeClient(new WebChromeClient(){
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false);
}
});
测试html文件以获取地理位置:
<!DOCTYPE html>
<html>
<head>
<script>
var x = document.getElementById("demo");
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition, showError);
} else {
x.innerHTML = "Geolocation is not supported by this browser.";
}
}
function showPosition(position) {
var latlon = position.coords.latitude + "," + position.coords.longitude;
document.getElementById("locationHolder").innerHTML = latlon;
}
function showError(error) {
switch(error.code) {
case error.PERMISSION_DENIED:
x.innerHTML = "User denied the request for Geolocation.";
break;
case error.POSITION_UNAVAILABLE:
x.innerHTML = "Location information is unavailable";
break;
case error.TIMEOUT:
x.innerHTML = "The request to get user location timed out.";
break;
case error.UNKNOWN_ERROR:
x.innerHTML = "An unknown error occurred.";
break;
}
}
</script>
</head>
<body>
<p id="demo">Click the button to get your position.</p>
<div id="locationHolder">No location</div>
<button onclick="getLocation()">Get position</button>
</body>
</html>
此外,对于本地测试,您可以在&#39; /assets/www/index.html'下创建一个包含html的文件。并使用以下代码将其加载到webview中:
try {
String html = readAssetFile("www/index.html");
webview.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null);
} catch (IOException e) {
}
阅读资产文件方法:
private String readAssetFile(String filePath) throws IOException {
StringBuilder buffer = new StringBuilder();
InputStream fileInputStream = getAssets().open(filePath);
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(fileInputStream, "UTF-8"));
String str;
while ((str=bufferReader.readLine()) != null) {
buffer.append(str);
}
fileInputStream.close();
return buffer.toString();
}
我无法在没有提供错误的硬编码路径的情况下重现您的错误&#39;数据库&#39;文件夹中。
答案 1 :(得分:0)
该行
D / WebKit(22653):无法从/CachedGeoposition.db加载SQLite数据库
很有趣
尝试在WebSettings.setDatabasePath中设置相应的数据库路径,也可以将其用作地理数据库路径的根
答案 2 :(得分:0)
我知道这是一个老问题,但任何有这个问题的人都可能会对这个功能感兴趣:
mWebView.getSettings().setGeolocationDatabasePath(getFilesDir().getPath());
地理位置使用数据库在会话之间保留缓存的位置和权限。 此调用设置数据库的位置。
不是将固定路径设置为参数,而是应该动态调用它:
getFilesDir().getPath()