2010-02-15 17 views
12

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

} 

} 

Trả lời

22

Tôi chỉ cố gắng mã của bạn trên Nexus One với Android 2.1, và nó hoạt động tốt. Hãy nhớ rằng bạn sẽ cần phải thêm các quyền cần thiết để biểu hiện của bạn:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
+0

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

3

Chúng tôi (nhóm PhoneGap) gần đây đã phát hành bản sửa lỗi cho điều này. Về cơ bản, vấn đề là của Android 2.0, WebView nguyên bản giờ đây đã thực hiện riêng navigator.geolocation, và do đó cây cầu PhoneGap cho chức năng này đã không được thiết lập đúng trong JavaScript.

Kể từ đó, một cam kết cụ thể đã tạo ra giải pháp cho việc này: chúng tôi 'proxy' đối tượng navigator.geolocation gốc theo định nghĩa riêng của chúng ta về đối tượng này. Đối tượng này hoạt động tốt với khung công tác PhoneGap.

Đối với sửa chữa này, xem sau cam kết: http://github.com/phonegap/phonegap-android/commit/5255f632377c36beb0b4d2620940f33b6d02b2c7

+0

Cảm ơn fil maj - Tôi biết rằng việc bổ sung các đối tượng bẩm sinh đã bị phá vỡ PhoneGap. Tôi đã kết thúc làm một cái gì đó tương tự như workaround của bạn, nhưng tôi đã hy vọng chúng tôi có thể tìm thấy một cách để làm cho việc sử dụng các đối tượng geolocation bản địa từ bên trong một WebView. Mã của tôi đã có nghĩa là để chứng minh rằng điều này chỉ đơn giản là không làm việc từ một WebView (phonegap hoặc không). – ajh158

+0

fil, tôi mới để khoảng cách điện thoại, cam kết của bạn sẽ được kết hợp trong phiên bản tiếp theo? khi nào? Tôi không muốn cắt xây dựng của riêng tôi nhưng nếu bạn đưa ra hướng dẫn, vui lòng cắt từ chi nhánh của bạn. –

+1

@fil, URL của bạn là 404. Vui lòng cập nhật. –

Các vấn đề liên quan