問題描述
我有一個使用 javascript geolocation api 的網站,并希望它在 web 視圖中打開.我在清單文件中設置了這些權限:
I have website using javascript geolocation api and want it to open in a webview. I set up these permissions in the manifest file:
<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 設置:
In my activity, I also set webview settings:
webview.getSettings().setDatabaseEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.getSettings().setGeolocationDatabasePath("/data/data/com.my.app/databases");
webview.getSettings().setGeolocationEnabled(true);
我還處理了 javascript 地理定位對話框:
And I also handled javascript geolocation dialog:
webview.setWebChromeClient(new WebChromeClient(){
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false);
}
});
地理位置本身正在工作,但我無法將地理位置緩存到數據庫中.它應該在 CachedGeoposition.db 中自行完成,但是當我啟動 webview 時,我得到了這個奇怪的 SQLite 錯誤:
Geolocation itself is working, but I am not able to cache geoposition into the database. It should be doing it by itself into CachedGeoposition.db, but when I start the webview, i get this strange SQLite error:
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------.
When I check existence of CachedGeoposition.db file in File Explorer, it is always there, and permissions of the db are set to -rw-------.
我是否在設置中遺漏了一些可能導致數據庫無法正確打開的內容?我是 Android 新手,現在正在嘗試尋找 2 天的解決方案.任何幫助將不勝感激.謝謝.
Did I miss something in settings what could cause database not to open correctly? I'm new to Android and trying to find solution for 2 days now. Any help would be greatly appreciated. Thank you.
推薦答案
我將發布一個對我有用的解決方案,希望它可以提供一些關于錯誤可能在哪里的想法.如果您可以提供有關您正在測試的設備(模擬器)/操作系統的詳細信息,這也會有所幫助.
I'll post a solution that worked for me in the hope that it might provide some ideas on where the error might be. It would also help if you could provide details about the device(emulator)/os on which you're testing.
我測試過(沒有錯誤):
I tested on (with no errors):
- (模擬器)Galaxy Nexus (2.3.3)(創建數據/數據/package.name/files/CachedGeoposition.db 文件)
- (模擬器)Galaxy Nexus (3.0)(創建數據/data/package.name/files/CachedGeoposition.db 文件)
- HTC One S (4.1.1)(data/data/package.name/files/CachedGeoposition.db 文件已創建)
- Galaxy S3 (4.3)(看不到文件,因為我的手機沒有 root 并且在 4.3 上有一些運行方式"錯誤)
- Nexus 7 (4.4.4) - KIT KAT 上方的 webview 發生了一些變化,并且文件不再存在,但沒有顯示錯誤(即使提供了錯誤的數據庫"文件夾路徑)
- (模擬器)Galaxy S4 (5.0)(與 4.4.4 相同)
AndroidManifest 權限(差不多):
AndroidManifest permissions (pretty much the same):
<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 客戶端(同):
Web chrome client (the same):
webview.setWebChromeClient(new WebChromeClient(){
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false);
}
});
獲取地理位置的測試 html 文件:
Test html file for getting the geolocation:
<!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>
此外,對于本地測試,您可以在/assets/www/index.html"下創建一個包含 html 的文件,并使用以下代碼將其加載到 webview 中:
Also, for a local test, you could created a file containing the html under '/assets/www/index.html' and use the following code to load it into the 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();
}
如果不提供數據庫"文件夾的錯誤硬編碼路徑,我無法重現您的錯誤.
I couldn't reproduce your error without providing a wrong hardcoded path to the 'databases' folder.
這篇關于Android webview 地理定位數據庫無法打開的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!