Frage

Ich habe mit PhoneGap arbeiten und es ist großartig, aber ich habe auf ein Problem stoßen mit dem Erhalten Lage auf einem Verizon Droid w / 2.0.1 (funktioniert wie auf einem G1 erwartet w / 1,6).

GeoLocation API-Unterstützung wurde in 2.0 (Eclair) auf Android hinzugefügt und es funktioniert in der Standard-Browser auf einem Verizon Droid (auf 2.0.1). Das heißt, wenn ich eine Website besuchen, die navigator.geolocation.getCurrentPosition (success_callback, error_callback) aufruft, fordert das Gerät, dass die aktuelle Domain „möchte Ihren Standort kennen“ mit Optionen in einem Dialog auf „Teilen Standort“ oder „Ablehnen“. Wenn ich „Standort frei“ wählen, success_callback schließlich mit Standortdaten aufgerufen wird.

Wenn ich die gleiche Website in einem WebView besuchen, wird der Anruf an navigator.geolocation.getCurrentPosition kein Javascript-Fehler erzeugen, aber die „Ihren Standort“ Dialog wird nicht angezeigt, und weder Rückruf jemals aufgerufen wird. In logcat, ich sehe, was ein verwandter Fehler zu sein scheint: „02-15 Oktober: 37: 00,413: ERROR / GeoLocationService (16871):.. Abgefangene Ausnahme Sicherheit für Standortaktualisierungen von System Registrierung Dies sollte nur in DumpRenderTree passieren“

Es scheint mir, dass die WebView für Standort-Updates registrieren versagt, weil sie nicht die erforderliche Berechtigung verfügt, die wiederum ist eine Folge der den Benutzer nicht für die Erlaubnis zu fragen. Obwohl es mehrere Methoden waren und Objekte auf das Webkit-Paket in Android 2.0 zu GeoPermissions Zusammenhang hinzugefügt, habe ich nicht in der Lage gewesen, einen von ihnen zu verursachen WebView zu verwenden, um den GeoPermission Dialog angezeigt werden soll.

Im Folgenden wird auf der Grundlage der Hallo, WebView Beispiel aus der Bedienungsanleitung für Android-Entwickler, aber es fügt einige der Anrufe und Objekte, die in 2.0 hinzugefügt wurden GeoPermissions bezogen. * Mit einer entsprechenden URL (mit freundlicher Genehmigung aktualisiert von der Autor -. dank Oliver )

Hat jemand in der Lage gewesen, diese Arbeit zu bekommen? Jedes Feedback wäre toll, danke!

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

}

}
War es hilfreich?

Lösung

Ich habe gerade versucht, Ihren Code auf einem Nexus One mit Android 2.1, und es funktioniert gut. Denken Sie daran, dass Sie die erforderlichen Berechtigungen zu Ihrem Manifest hinzufügen müssen:

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

Andere Tipps

Wir (die PhoneGap Team) haben vor kurzem ein Update für diese freigegeben. Im Grunde war das Problem, dass ab Android 2.0, das native WebView jetzt eine eigene Implementierung von navigator.geolocation hat und damit die PhoneGap Brücke für diese Funktion nicht richtig in JavaScript festgelegt zu werden.

Seitdem eine bestimmte commit hat eine Abhilfe für dieses erstellt: wir ‚Proxy‘ die native navigator.geolocation Objekt unsere eigene Definition dieses Objekts. Diese Aufgabe arbeitet gut mit dem PhoneGap Rahmen.

Für dieses Updates finden Sie im folgenden begehen: http://github.com/ phonegap / phonegap-android / commit / 5255f632377c36beb0b4d2620940f33b6d02b2c7

hat diesen Link, um den Schlüssel http://cordova.apache.org/docs/en/ 2.5.0 / cordova_device_device.md.html

ich mit Android entwickle - Phonegap

Ich habe

app / res / xml / config.xml

<plugin name="Device" value="org.apache.cordova.Device" />

app / AndroidManifest.xml

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top