問題描述
我一直在使用 PhoneGap,它非常棒,但我在 Verizon Droid w/2.0.1 上獲取位置時遇到了問題(在 G1 w/1.6 上按預期工作).
I've been working with PhoneGap and it's been great, but I've run into a problem with getting location on a Verizon Droid w/ 2.0.1 (works as expected on a G1 w/ 1.6).
GeoLocation API 支持已在 2.0 (Eclair) 中添加到 Android,它可以在 Verizon Droid(2.0.1 上)的默認瀏覽器中運行.也就是說,如果我訪問一個調用 navigator.geolocation.getCurrentPosition(success_callback, error_callback) 的網站,設備會在帶有共享位置"或拒絕"選項的對話框中提示當前域想知道你的位置".如果我選擇共享位置",success_callback 最終會被調用位置數據.
GeoLocation API Support was added to Android in 2.0 (Eclair) and it works in the default browser on a Verizon Droid (on 2.0.1). That is, if I visit a website that calls navigator.geolocation.getCurrentPosition(success_callback, error_callback), the device prompts that the current domain "wants to know your location" in a dialog with options to "Share location" or "decline". If I select "Share location", success_callback eventually gets called with location data.
如果我在 WebView 中訪問同一個網站,對 navigator.geolocation.getCurrentPosition 的調用不會生成 javascript 錯誤,但不會顯示共享您的位置"對話框,也不會調用任何回調.在 logcat 中,我看到似乎是一個相關的錯誤:02-15 10:37:00.413: ERROR/geolocationService(16871): Caught security exception registering for location updates from system. 這應該只發生在 DumpRenderTree 中."
If I visit the same website in a WebView, the call to navigator.geolocation.getCurrentPosition does not generate a javascript error, but the "share your location" dialog is not displayed and neither callback ever gets called. In logcat, I see what seems to be a related error: "02-15 10:37:00.413: ERROR/geolocationService(16871): Caught security exception registering for location updates from system. This should only happen in DumpRenderTree."
在我看來,WebView 未能注冊位置更新,因為它沒有所需的權限,而這又是未提示用戶獲得權限的結果.盡管在 Android 2.0 中的 Webkit 包中添加了幾個與 GeoPermissions 相關的方法和對象,但我無法使用它們中的任何一個來使 WebView 顯示 GeoPermission 對話框.
It seems to me that the WebView is failing to register for location updates because it does not have the required permission, which in turn is a result of not prompting the user for the permission. Although there were several methods and objects added to the Webkit package in Android 2.0 related to GeoPermissions, I haven't been able to use any of them to cause WebView to display the GeoPermission dialog.
以下內容基于 Android 開發人員指南中的 Hello, WebView 示例,但它添加了一些在 2.0 中添加的與 GeoPermissions 相關的調用和對象.*使用適當的 url 更新(獲得 的許可作者 - 感謝 Oliver!).
The following is based on the Hello, WebView example from the Android Developer's Guide but it adds some of the calls and objects that were added in 2.0 related to GeoPermissions. *Updated with an appropriate url (with permission from the author - thanks Oliver!).
有沒有人能夠讓這個工作?任何反饋都會很棒,謝謝!
Has anyone been able to get this working? Any feedback would be great, thanks!
package com.example.android.helloactivity;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.GeolocationPermissions.Callback;
public class HelloActivity extends Activity implements GeolocationPermissions.Callback{
WebView webview;
String geoWebsiteURL = "http://maxheapsize.com/static/html5geolocationdemo.html";
public HelloActivity() {
}
/**
* Called with the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hello_activity);
webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.getSettings().setGeolocationEnabled(true); //seems like if i set this, the webview should prompt when I call navigator.geolocation.getCurrentPosition
GeolocationPermissions geoPerm = new GeolocationPermissions(); //added in API Level 5 but no methods exposed until API level 7
GeoClient geo = new GeoClient();
webview.setWebChromeClient(geo);
String origin = ""; //how to get origin in correct format?
geo.onGeolocationPermissionsShowPrompt(origin, this); //obviously not how this is meant to be used but expected usage not documented
webview.loadUrl(geoWebsiteURL);
}
public void invoke(String origin, boolean allow, boolean remember) {
}
final class GeoClient extends WebChromeClient {
@Override
public void onGeolocationPermissionsShowPrompt(String origin,
Callback callback) {
// TODO Auto-generated method stub
super.onGeolocationPermissionsShowPrompt(origin, callback);
callback.invoke(origin, true, false);
}
}
}
推薦答案
我剛剛在裝有 Android 2.1 的 Nexus One 上試用了您的代碼,它運行良好.請記住,您需要為清單添加必要的權限:
I just tried your code on a Nexus One with Android 2.1, and it works fine. Remember that you'll need to add the necessary permissions to your manifest:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
這篇關于在 Android 2.0+ 的 WebView 中使用 navigator.geolocation.getCurrentPosition(PhoneGap 相關)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!