Использование navigator.geolocation.getCurrentPosition в WebView на Android 2.0+ (связанный с PhoneGap)

Я работал с PhoneGap, и это было здорово, но у меня возникла проблема с получением места на Verizon Droid w/2.0.1 (работает как ожидается на G1 w/1.6).

Поддержка GeoLocation API была добавлена ​​в Android в версии 2.0 (Eclair), и она работает в браузере по умолчанию на Verizon Droid (в версии 2.0.1). То есть, если я посещаю веб-сайт, который вызывает navigator.geolocation.getCurrentPosition(success_callback, error_callback), устройство запрашивает, чтобы текущий домен "хотел знать ваше местоположение" в диалоговом окне с опциями "Share location" или "снижение". Если я выберу "Share location", в итоге функция success_callback вызывается с данными о местоположении.

Если я перейду на тот же веб-сайт в WebView, вызов navigator.geolocation.getCurrentPosition не приведет к ошибке javascript, но диалог "поделиться своим местоположением" не будет отображаться, и вызов callback никогда не будет вызван. В logcat я вижу, что похоже на связанную с этим ошибку: "02-15 10: 37: 00.413: ERROR/geolocationService (16871): зарегистрировалось исключение безопасности для обновления местоположения из системы. Это должно произойти только в DumpRenderTree".

Мне кажется, что WebView не регистрируется для обновлений местоположения, потому что у него нет требуемого разрешения, что, в свою очередь, является результатом не запроса пользователя о разрешении. Хотя в пакет Webkit в Android 2.0, связанный с GeoPermissions, добавлено несколько методов и объектов, я не смог использовать их, чтобы WebView отображал диалоговое окно GeoPermission.

Ниже приведен пример Hello, WebView из Руководства для разработчиков Android, но он добавляет некоторые вызовы и объекты, которые были добавлены в 2.0, связанные с GeoPermissions. * Обновлен с соответствующим URL (с разрешения автора - спасибо Oliver!).

Кто-нибудь мог получить эту работу? Любая обратная связь будет отличной, спасибо!

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

}

}

Ответ 1

Я просто попробовал свой код на Nexus One с Android 2.1, и он отлично работает. Помните, что вам нужно будет добавить необходимые разрешения для вашего манифеста:

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

Ответ 2

Мы (команда PhoneGap) недавно выпустили исправление для этого. В основном проблема заключалась в том, что с Android 2.0 собственный WebView теперь имеет собственную реализацию navigator.geolocation, и, таким образом, модем PhoneGap для этой функции не был правильно настроен в JavaScript.

С тех пор конкретная фиксация создала обходное решение для этого: мы "проксируем" собственный объект navigator.geolocation для нашего собственного определения этого объекта. Этот объект хорошо работает с каркасом PhoneGap.

Для этого исправления см. следующую фиксацию: http://github.com/phonegap/phonegap-android/commit/5255f632377c36beb0b4d2620940f33b6d02b2c7

Ответ 3

У этой ссылки есть ключ http://cordova.apache.org/docs/en/2.5.0/cordova_device_device.md.html

Я разрабатываю Android - Phonegap

Я добавил

- > app/res/xml/config.xml

< плагин name= Значение "Устройство" = "org.apache.cordova.Device" /" >

- > приложение /AndroidManifest.xml

< use-permission android: name= "android.permission.READ_PHONE_STATE" /" >

и отлично работает