2010-02-15 12 views
12

Pracowałem z PhoneGap i było świetnie, ale mam problem z uzyskaniem lokalizacji w Verizon Droid w/2.0. 1 (działa zgodnie z oczekiwaniami na G1 w/1.6).Używanie navigator.geolocation.getCurrentPosition w WebView na Androida 2.0+ (PhoneGap related)

Obsługa interfejsu API GeoLocation została dodana do systemu Android w wersji 2.0 (Eclair) i działa w domyślnej przeglądarce Verizon Droid (w wersji 2.0.1). Oznacza to, że jeśli odwiedzę stronę internetową, która wywołuje navigator.geolocation.getCurrentPosition (success_callback, error_callback), urządzenie wyświetli monit, że bieżąca domena "chce znać twoją lokalizację" w oknie dialogowym z opcjami "Udostępnij lokalizację" lub "odrzuć". Jeśli wybiorę opcję "Udostępnij lokalizację", success_callback zostanie ostatecznie wywołana z danymi o lokalizacji.

Jeśli odwiedzę tę samą stronę internetową w WebView, wywołanie funkcji navigator.geolocation.getCurrentPosition nie generuje błędu javascript, ale okno dialogowe "udostępnij swoją lokalizację" nie jest wyświetlane, a wywołanie zwrotne nie jest wywoływane. W logcat widzę, co wydaje się być związany z błędem: "02-15 10: 37: 00.413: ERROR/geolocationService (16871): Wykryto wyjątek Caught Security dla aktualizacji lokalizacji z systemu. To powinno się zdarzyć tylko w DumpRenderTree."

Wydaje mi się, że WebView nie rejestruje się w poszukiwaniu aktualizacji lokalizacji, ponieważ nie ma wymaganych uprawnień, co z kolei jest wynikiem niezapytania użytkownika o pozwolenie. Chociaż do pakietu Webkit w systemie Android 2.0 związanych z GeoPermissions dodano kilka metod i obiektów, nie mogłem użyć żadnego z nich, aby spowodować, że WebView wyświetli okno dialogowe GeoPermission.

Poniższy dokument oparty jest na przykładzie Hello, WebView z Przewodnika dla programistów Androida, ale dodaje niektóre z połączeń i obiektów dodanych w wersji 2.0 związanej z GeoPermissions. * Zaktualizowano odpowiednim adresem URL (za zgodą the author - thanks Oliver!).

Czy ktoś mógł to sprawdzić? Wszelkie opinie będą wspaniałe, dzięki!

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

} 

} 

Odpowiedz

22

Próbowałem tylko kod na Nexus One z Androidem 2.1, i to działa dobrze. Pamiętaj, że musisz dodać niezbędne uprawnienia do manifestu:

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

Dzięki za odpowiedź i dodatkowe informacje, Roman. Cieszę się, że jest to rozwiązane w wersji 2.1. Jestem zaskoczony, że napisany przeze mnie kod zadziałał - właśnie wyrzuciłem tam wszystkie materiały GeoPermissions, aby zilustrować, co próbowałem zrobić, aby ktoś mógł mi powiedzieć, jak to zrobić. Masz pomysł, czy jest jakiś sposób, aby działał w WebView 2.0.1? Obecnie pracuję nad navigator.geolocation, ponieważ nie wydaje się być użyteczny w 2.0.1 WebView. Dzięki jeszcze raz! – ajh158

3

My (zespół PhoneGap) wydaliśmy ostatnio poprawkę. Zasadniczo problem polegał na tym, że począwszy od wersji Android 2.0 macierzysty WebView ma teraz własną implementację navigator.geolocation, a więc mostek PhoneGap dla tej funkcji nie został prawidłowo ustawiony w JavaScript.

Od tego czasu określone zatwierdzenie utworzyło obejście tego problemu: "proxy" natywny obiekt navigator.geolocation do naszej własnej definicji tego obiektu. Ten obiekt działa dobrze w ramach PhoneGap.

Aby rozwiązać ten problem, zobacz następujące popełnić: http://github.com/phonegap/phonegap-android/commit/5255f632377c36beb0b4d2620940f33b6d02b2c7

+0

Dzięki fil Maj - Wiedziałem, że dodanie natywnego obiektu złamał PhoneGap. W efekcie zrobiłem coś podobnego do obejścia, ale miałem nadzieję, że uda nam się znaleźć sposób na wykorzystanie natywnego obiektu geolokalizacji z poziomu WebView. Mój kod miał na celu wykazanie, że to po prostu nie działa z WebView (phonegap lub nie). – ajh158

+0

fil, jestem nowy w luce telefonicznej, czy twoje zobowiązanie zostanie włączone do następnej wersji? gdy? Nie chcę przecinać mojej własnej kompilacji, ale jeśli wydasz instrukcje, z radością odetniesz się od swojej gałęzi. –

+1

@fil, twój adres URL to 404. Proszę zaktualizować. –