2012-08-16 17 views
12

Tengo un sitio web que utiliza la API de geolocalización y quiero que se abra en una vista web. He definido estos permisos en el archivo de manifiesto:Android webview geoposition database failed to open

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

En mi actividad, también establecer la configuración WebView:

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

Y también he manejado Javascript de diálogo de geolocalización:

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

Geolocalización está funcionando, pero no puedo guardar la geoposición en la base de datos. Se debe hacer por sí mismo en CachedGeoposition.db, pero cuando comienzo a la vista web, me sale este error extraño 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) 

Cuando compruebo existencia de archivo CachedGeoposition.db en el Explorador de archivos, que siempre está ahí , y los permisos de la base de datos se establecen en -rw -------.

¿Echaba de menos algo en la configuración que podría causar que la base de datos no se abra correctamente? Soy nuevo en Android y trato de encontrar una solución durante 2 días. Cualquier ayuda sería muy apreciada. Gracias.

+0

verifique esta respuesta http://stackoverflow.com/questions/12801690/error-log-sqlite-failed-to-load-from-cachedgeoposition-db – jpotts18

Respuesta

0

La línea

D/WebKit (22653): base de datos SQLite no se pudo cargar desde /CachedGeoposition.db

es interesante

Pruebe a establecer la ruta de acceso DB apropiado en WebSettings.setDatabasePath así, podría ser que esto se utiliza como la raíz de la ruta de geo db

0

Sé que esta es una pregunta antigua, pero cualquier persona con este problema puede encontrar interesante centrarse en esta función:

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

La geolocalización utiliza bases de datos para conservar las posiciones en caché y los permisos entre sesiones. Esta llamada establece la ubicación de la base de datos.

En lugar de establecer una trayectoria fija como parámetro que debe obtener de forma dinámica llamando:

getFilesDir().getPath() 
2

Voy a publicar una solución que funcionó para mí con la esperanza de que podría proporcionar algunas ideas sobre dónde el error podría ser. También sería útil si pudiera proporcionar detalles sobre el dispositivo (emulador)/sistema operativo en el que está realizando la prueba.

I probado en (sin errores):

  • (Emulador) Galaxy Nexus (2.3.3) (datos/datos/package.name/archivos/archivo creado CachedGeoposition.db)
  • (Emulador) Galaxy Nexus (3.0) (archivo data/data/package.name/files/CachedGeoposition.db creado)
  • HTC One S (4.1.1) (archivo data/data/package.name/files/CachedGeoposition.db) creado)
  • Galaxy S3 (4.3) (no se pudo ver el archivo porque mi teléfono no está rooteado y hay algunos errores 'ejecutables' en 4.3)
  • Nexus 7 (4.4.4) - la vista web anterior KIT KAT ha cambiado un poco y el archivo ya no está allí, pero no se mostró ningún error (incluso cuando proporciona una ruta de carpeta de bases de datos incorrecta)
  • (Emulador) Galaxy S4 (5.0) (mismo que en 4.4.4)

permisos AndroidManifest (más o menos la misma):

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

vista web ajustes: CHRO

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

web Me cliente (el mismo):

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

archivo html de prueba para conseguir la geolocalización:

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

También, para una prueba local, que podría creado un archivo que contiene el código HTML en '/ activos/www /index.html' y utilizar el código siguiente para cargarlo en la vista web:

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

Leer método de archivo activo:

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

No pude reproducir su error sin proporcionar una ruta incorrecta codificada a la carpeta 'bases de datos'.

+0

OH MY GODNESSS !!!! ¡GRACIAS! La única línea diferente es WebChromeClient 'callback.invoke (origin, true, false);' pero funciona tio !!! –

+0

me alegro de que haya ayudado :) – Spiri

+0

¡Era obligatorio para mi trabajo y me volvió loco durante 2 semanas! Sabía que debía ser una tontería ... ¿Sabes exactamente qué está haciendo la oración 'callback.invoke'? –