2012-08-16 18 views
12

javascript geolocation apiを使用してウェブサイトを開いていて、ウェブビューで開くことができます。 Android webview geopositionデータベースを開くことができませんでした

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

そして、私はまた、javascriptの地理的位置]ダイアログ取り扱わ:私も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.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

この回答を確認http://stackoverflow.com/questions/12801690/error-log-sqlite-failed-to-load-from-cachedgeoposition-db – jpotts18

答えて

0

D/WebKitの(22653):SQLiteのデータベースは/CachedGeoposition.db

からの読み込みに失敗しましたが興味深い

もWebSettings.setDatabasePathに適切なDBのパスを設定してみてください、これはジオデータベースパスのルートとして使用される可能性があります

0

これは古い質問ですが、この問題を抱えている人は、この機能に興味を持っているかもしれません:

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

ジオロケーションは、セッション間でキャッシュされた位置と権限を永続化するためにデータベースを使用しています。 この呼び出しは、データベースの場所を設定します。

代わりにパラメータとして固定パスを設定するのあなたはそれが動的呼び出しを取得する必要があります

getFilesDir().getPath() 
2

を、私はそれがエラーがかもしれない上のいくつかのアイデアを提供するかもしれないことを期待して私のために働いた解決策を投稿しますさあ。また、テストしているデバイス(エミュレータ)/ OSについての詳細を提供できる場合にも役立ちます。

私は(エラーなしで)上でテスト:

  • (エミュレータ)ギャラクシーネクサス(2.3.3)(作成されたデータ/データ/ package.name /ファイル/ CachedGeoposition.dbファイル)
  • (エミュレータ)ギャラクシーネクサス(3.0)(作成されたデータ/データ/ package.name /ファイル/ CachedGeoposition.dbファイル)
  • HTCワンS(4.1.1)(データ/データ/ package.name /ファイル/ CachedGeoposition.dbファイル作成された)
  • ギャラクシーS3(4.3)(自分の携帯電話が根付いたといくつかの「を実行-として」バグ4.3上)
  • がありますされていないので、ファイルを見ることができませんでした
  • Nexus 7(4.4。4) - KIT KAT上のウェブビューが少し変更されました。 ファイルは存在しなくなりましたが、エラーは表示されませんでした(間違った 'データベース'フォルダパスを提供しても)
  • (エミュレータ)Galaxy S4

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

    Webビューの設定:

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

    ウェブCHRO

AndroidManifest権限(ほとんど同じ))4.4.4上と同じ私のクライアント(同じ):

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> 

はまた、ローカルテストのために、あなたは「/資産/ www以下のhtmlを含むファイルを作成でき/index.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(); 
} 

ハード_コードされたパスを 'databases'フォルダーに指定しないと、エラーを再現できませんでした。

+0

OH MY GODNESSS !!!!感謝します!唯一の異なる行は、WebChromeClient 'callback.invoke(origin、true、false);'ですが、これはうまく動作します! –

+0

助けてくれてうれしいです:) – Spiri

+0

それは私の仕事に必要とされ、それは2週間狂った私を運転!私はそれが愚かなものでなければならないことを知っていました...あなたは 'callback.invoke'という文章を正確に知っていますか? –

関連する問題