2012-08-16 19 views
12

खोलने में विफल रहा है मेरे पास जावास्क्रिप्ट भौगोलिक स्थान एपीआई का उपयोग कर वेबसाइट है और इसे वेबव्यू में खोलना है।एंड्रॉइड वेबव्यू जियोपोजिशन डेटाबेस

<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.getSettings().setDatabaseEnabled(true); 
webview.getSettings().setDomStorageEnabled(true); 
webview.getSettings().setGeolocationDatabasePath("/data/data/com.my.app/databases"); 
webview.getSettings().setGeolocationEnabled(true); 

और मैं भी संभाला जावास्क्रिप्ट जियोलोकेशन संवाद:

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

जियोलोकेशन खुद काम कर रहा है, लेकिन मैं डेटाबेस में भूगर्भीकरण को कैश करने में सक्षम नहीं हूं। यह CachedGeoposition.db में अपने आप में यह करना चाहिए, लेकिन जब मैं वेबव्यू शुरू करते हैं, मैं यह अजीब 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) 

जब मैं फ़ाइल Explorer में CachedGeoposition.db फ़ाइल के अस्तित्व की जाँच, यह हमेशा नहीं है , और डीबी की अनुमतियां -rw ------- पर सेट हैं।

क्या मुझे सेटिंग्स में कुछ याद आया जो डेटाबेस को सही तरीके से नहीं खोल सकता है? मैं एंड्रॉइड के लिए नया हूं और अब 2 दिनों के लिए समाधान खोजने की कोशिश कर रहा हूं। किसी भी तरह की सहायता का स्वागत किया जाएगा। धन्यवाद।

+0

इस उत्तर की जांच करें http://stackoverflow.com/questions/12801690/error-log-sqlite-failed-to-load-from-cachedgeoposition-db – jpotts18

उत्तर

0

लाइन

डी/वेबकिट (22,653): SQLite डेटाबेस /CachedGeoposition.db

से लोड करने में विफल दिलचस्प है

रूप में अच्छी तरह WebSettings.setDatabasePath में उपयुक्त डीबी मार्ग स्थापित करने की कोशिश करें, यह हो सकता है कि यह geo db path

0

मुझे पता है कि यह एक पुराना प्रश्न है लेकिन इस समस्या वाले किसी भी व्यक्ति को इस फ़ंक्शन पर दिलचस्प फ़ोकस मिल सकता है:

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

जिओलोकेशन सत्रों के बीच कैश किए गए पदों और अनुमतियों को जारी रखने के लिए डेटाबेस का उपयोग करता है। यह कॉल डेटाबेस का स्थान सेट करता है।

getFilesDir().getPath() 
2

मैं एक समाधान है कि उम्मीद है कि यह जहां त्रुटि हो सकता है पर कुछ विचार प्रदान कर सकते हैं में मेरे लिए काम किया पोस्ट करेंगे:

इसके बजाय पैरामीटर के रूप में एक निश्चित पथ की स्थापना की आप यह गतिशील बुला मिलना चाहिए हो। इससे मदद मिलेगी यदि आप डिवाइस (एमुलेटर)/ओएस के बारे में विवरण प्रदान कर सकते हैं जिस पर आप परीक्षण कर रहे हैं।

मैं पर परीक्षण (कोई त्रुटियों के साथ):

  • (एम्यूलेटर) गैलेक्सी नेक्सस (2.3.3) (डेटा/डेटा/package.name/फ़ाइलें/CachedGeoposition.db बनाई गई फ़ाइल)
  • (एमुलेटर) गैलेक्सी नेक्सस (3.0) (डेटा/डेटा/पैकेज.नाम/फाइलें/कैश्ड जीओपोज़िशन डीबी फाइल बनाई गई)
  • एचटीसी वन एस (4.1.1) (डेटा/डेटा/पैकेज.नाम/फाइलें/कैशडियोपोजिशन डीबी फाइल बनाया गया)
  • गैलेक्सी एस 3 (4.3) (फ़ाइल को तब तक नहीं देख सका क्योंकि मेरा फोन रूट नहीं है और 4.3 पर कुछ 'रन-ए-बग' हैं)
  • नेक्सस 7 (4.4।4) - केआईटी केएटी के ऊपर का वेबव्यू थोड़ा बदल गया है और फ़ाइल अब नहीं है, लेकिन कोई त्रुटि दिखाई नहीं दे रही थी (यहां तक ​​कि गलत 'डेटाबेस' फ़ोल्डर पथ प्रदान करते समय भी)
  • (एमुलेटर) गैलेक्सी एस 4 (5.0) (एक ही 4.4.4 पर के रूप में)

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

वेब Chro मुझे ग्राहक (समान): जियोलोकेशन प्राप्त करने के लिए

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 के तहत एचटीएमएल युक्त एक फ़ाइल बनाया जा सकता था /index.html 'और वेबव्यू में लोड करने के लिए निम्न कोड का उपयोग करें:

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

मैं 'डेटाबेस' फ़ोल्डर में गलत हार्डकोडेड पथ प्रदान किए बिना आपकी त्रुटि को पुन: पेश नहीं कर सका।

+0

ओह मेरे भगवान !!!! THANKSSSSSSSSSSS !!!! एकमात्र अलग पंक्ति WebChromeClient 'callback.invoke (मूल, सत्य, झूठी) है; 'लेकिन यह दोस्त काम करता है !!! –

+0

खुशी हुई यह मदद की :) – Spiri

+0

यह मेरे काम के लिए आवश्यक था और यह मुझे 2 सप्ताह के लिए पागल कर दिया !! मुझे पता था कि यह एक मूर्ख चीज होनी चाहिए ... क्या आप जानते हैं कि 'callback.invoke' वाक्य क्या कर रहा है? –