2012-08-16 22 views
12

Mam stronę internetową za pomocą interfejsu API geolokacji javascript i chcę ją otworzyć w widoku internetowym. Założyłem te uprawnienia w pliku manifestu:Baza danych geopolokalizacji systemu Android nie otworzy się

<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"/> 

W mojej działalności, ja też zestaw funkcji webview ustawienia:

webview.setWebChromeClient(new WebChromeClient(){ 
    @Override 
    public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { 
     callback.invoke(origin, true, false); 
    } 
}); 

Geolokalizacja:

webview.getSettings().setDatabaseEnabled(true); 
webview.getSettings().setDomStorageEnabled(true); 
webview.getSettings().setGeolocationDatabasePath("/data/data/com.my.app/databases"); 
webview.getSettings().setGeolocationEnabled(true); 

I ja również obsługiwane dialogowe javascript geolokalizacja sama działa, ale nie mogę buforować geopozycji w bazie danych. Należy to robić sama w CachedGeoposition.db, ale kiedy rozpocząć webview, otrzymuję ten dziwny błąd 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) 

Kiedy sprawdzać istnienie pliku CachedGeoposition.db w Eksploratorze plików, to zawsze istnieje , i uprawnienia do bazy danych są ustawione na -rw -------.

Czy coś pominąłem w ustawieniach, co może spowodować, że baza danych nie otworzy się poprawnie? Jestem nowy na Androida i próbuję znaleźć rozwiązanie na 2 dni. Każda pomoc będzie wielce ceniona. Dziękuję Ci.

+0

sprawdź tę odpowiedź http://stackoverflow.com/questions/12801690/error-log-sqlite-failed-to-load-from-cachedgeoposition-db – jpotts18

Odpowiedz

0

Linia

D/WebKit (22653) SQLite baza danych nie można załadować z /CachedGeoposition.db

ciekawe

Spróbuj ustawienie odpowiedniej ścieżki dB WebSettings.setDatabasePath, jak również, mogłoby się okazać, że jest on używany jako korzeń dla ścieżki geo db

0

wiem, że to jest stare pytanie, ale nikt z tego problemu może znaleźć interesujące skupiając się na tej funkcji:

mWebView.getSettings().setGeolocationDatabasePath(getFilesDir().getPath()); 

Geolokalizacja korzysta z baz danych do utrzymywania buforowanych pozycji i uprawnień między sesjami. To połączenie ustawia lokalizację bazy danych.

Zamiast ustawiać stałą ścieżkę jako parametr powinien dostać to dynamicznie wywołanie:

getFilesDir().getPath() 
2

wyślę rozwiązanie, które pracowały dla mnie w nadziei, że może ona dostarczyć kilka pomysłów na to, gdzie błąd może być. Pomógłby także, gdybyś mógł podać szczegóły dotyczące urządzenia (emulatora)/os, na którym testujesz.

Testowałem na (bez błędów):

  • (Emulator) Galaxy Nexus (2.3.3) (data/data/package.name/pliki/plik CachedGeoposition.db stworzony)
  • (Emulator) Galaxy Nexus (3.0) (plik data/data/package.name/files/CachedGeoposition.db)
  • HTC One S (4.1.1) (plik data/data/package.name/files/CachedGeoposition.db utworzony)
  • Galaxy S3 (4.3) (plik nie mógł się wyświetlić, ponieważ mój telefon nie jest zrootowany, a na 4.3 występują błędy "run-as")
  • Nexus 7 (4.4.4) - przeglądarka nad KIT KAT zmieniła się nieco i plik już tam nie jest, ale nie pokazał się żaden błąd (nawet jeśli podano błędną ścieżkę folderu "bazy danych")
  • (Emulator) Galaxy S4 (5.0) (tak samo jak na 4.4.4)

uprawnieniami AndroidManifest (prawie to samo):

<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"/> 

zobacz Web ustawienia:

WebSettings webSettings = webview.getSettings(); 
webSettings.setJavaScriptEnabled(true); 
webSettings.setDatabaseEnabled(true); 
webSettings.setDomStorageEnabled(true); 
webSettings.setGeolocationDatabasePath(getFilesDir().getPath()); 
webSettings.setGeolocationEnabled(true); 

Web CHRO mnie klient (taki sam):

webview.setWebChromeClient(new WebChromeClient(){ 
    @Override 
    public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { 
     callback.invoke(origin, true, false); 
    } 
}); 

testowy plik html dla uzyskania geolokalizacji:

<!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> 

Również dla lokalnego testu, można utworzony plik zawierający kod HTML z „/ assets/www /index.html”i kliknąć na poniższy kod, aby załadować je do WebView:

try { 
    String html = readAssetFile("www/index.html"); 
    webview.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null); 
} catch (IOException e) { 
} 

Czytaj metody plik atut:

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(); 
} 

Nie można odtworzyć błędu bez podania nieprawidłowo zakodowanej ścieżki do folderu "bazy danych".

+0

OH MY GODNESSS !!!! THANKSSSSSSSSSSS !!!! Jedyną inną linią jest WebChromeClient 'callback.invoke (origin, true, false);' ale działa koleś !!! –

+0

cieszę się, że pomogło :) – Spiri

+0

To było wymagane dla mojej pracy i doprowadzało mnie do szaleństwa przez 2 tygodnie !! Wiedziałem, że to musi być głupia rzecz ... Czy wiesz dokładnie, co robi zdanie 'callback.invoke'? –

Powiązane problemy