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

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

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

Если я посещаю тот же веб-сайт в WebView, вызов navigator.geolocation.getCurrentPosition не генерирует ошибку javascript, но диалоговое окно «поделиться своим местоположением» не отображается, и ни один обратный вызов никогда не вызывается. В 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 (с разрешения автору - спасибо Оливер!).

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

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

}

}

person ajh158    schedule 15.02.2010    source источник


Ответы (3)


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

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
person Roman Nurik    schedule 31.03.2010
comment
Спасибо за ответ и дополнительную информацию, Роман. Я рад слышать, что эта проблема решена в версии 2.1. Я удивлен, что код, который я опубликовал, сработал - я просто бросил туда весь материал GeoPermissions, чтобы проиллюстрировать, что я пытался сделать, на случай, если кто-то подскажет мне, как это сделать. Любая идея, есть ли способ заставить его работать в WebView на 2.0.1? В настоящее время я работаю над navigator.geolocation, потому что он не может использоваться в 2.0.1 WebView. Спасибо еще раз! - person ajh158; 01.04.2010

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

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

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

person fil maj    schedule 18.02.2010
comment
Спасибо, fil maj - я знал, что добавление родного объекта нарушило телефонный разговор. В итоге я сделал что-то похожее на ваш обходной путь, но я надеялся, что мы сможем найти способ использовать собственный объект геолокации из WebView. Мой код должен был продемонстрировать, что это просто не работает из WebView (телефонный разговор или нет). - person ajh158; 01.03.2010
comment
fil, я новичок в phone gap, будет ли ваш коммит включен в следующий выпуск? когда? Я не хочу вырезать свою сборку, но если вы дадите инструкции, с радостью вырезал бы из вашей ветки. - person Ryan Oberoi; 22.02.2011

Эта ссылка содержит ключ http://cordova.apache.org/docs/en/2.5.0/cordova_device_device.md.html

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

я добавил

приложение / res / xml / config.xml

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

app / AndroidManifest.xml

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
person joseAndresGomezTovar    schedule 18.12.2013