Tôi đã làm việc với PhoneGap và điều đó thật tuyệt, nhưng tôi đã gặp sự cố khi nhận vị trí trên Verizon Droid w/2.0. 1 (hoạt động như mong đợi trên G1 w/1.6).Sử dụng navigator.geolocation.getCurrentPosition trong WebView trên Android 2.0+ (PhoneGap liên quan)
Hỗ trợ API GeoLocation được thêm vào Android 2.0 (Eclair) và nó hoạt động trong trình duyệt mặc định trên Verizon Droid (trên 2.0.1). Tức là, nếu tôi truy cập trang web gọi navigator.geolocation.getCurrentPosition (success_callback, error_callback), thiết bị sẽ nhắc miền hiện tại "muốn biết vị trí của bạn" trong hộp thoại có tùy chọn "Chia sẻ vị trí" hoặc "từ chối". Nếu tôi chọn "Chia sẻ vị trí", success_callback cuối cùng sẽ được gọi với dữ liệu vị trí.
Nếu tôi truy cập cùng một trang web trong WebView, lệnh gọi navigator.geolocation.getCurrentPosition không tạo ra lỗi javascript, nhưng hộp thoại "chia sẻ vị trí của bạn" sẽ không được hiển thị và không gọi lại gọi lại. Trong logcat, tôi thấy những gì có vẻ là một lỗi liên quan: "02-15 10: 37: 00.413: ERROR/geolocationService (16871): Bắt ngoại lệ bảo mật đăng ký cập nhật vị trí từ hệ thống. Điều này chỉ xảy ra trong DumpRenderTree."
Dường như với tôi rằng WebView không đăng ký được các cập nhật vị trí bởi vì nó không có sự cho phép cần thiết, do đó, kết quả là không nhắc người dùng cho phép. Mặc dù đã có một số phương pháp và đối tượng được thêm vào gói Webkit trong Android 2.0 liên quan đến GeoPermissions, nhưng tôi không thể sử dụng bất kỳ phương pháp nào để khiến WebView hiển thị hộp thoại GeoPermission.
Phần sau dựa trên ví dụ Hello, WebView từ Hướng dẫn dành cho nhà phát triển Android nhưng nó bổ sung một số cuộc gọi và đối tượng được thêm vào 2.0 liên quan đến GeoPermissions. * Được cập nhật bằng url thích hợp (với sự cho phép từ the author - thanks Oliver!).
Có ai có thể làm việc này không? Bất kỳ thông tin phản hồi sẽ là tuyệt vời, cảm ơn!
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);
}
}
}
Cảm ơn phản hồi và thông tin bổ sung, Roman. Tôi rất vui khi biết rằng điều này được giải quyết trong 2.1. Tôi ngạc nhiên về mã mà tôi đã đăng tải - tôi vừa ném tất cả các công cụ GeoPermissions vào đó để minh họa những gì tôi đang cố gắng làm trong trường hợp ai đó có thể cho tôi biết cách làm đúng. Bất kỳ ý tưởng nếu có một cách để làm cho nó hoạt động trong một WebView trên 2.0.1? Hiện tại tôi đang làm việc quanh navigator.geolocation vì nó dường như không thể sử dụng được trong WebView 2.0.1. Cảm ơn một lần nữa! – ajh158