Использование navigator.geolocation.getCurrentPosition в WebView на Android 2.0+ (связано с PhoneGap) - PullRequest
13 голосов
/ 15 февраля 2010

Я работал с 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: ОШИБКА / geolocationService (16871): обнаружена исключительная ситуация безопасности при регистрации обновлений местоположения из системы. Это должно происходить только в DumpRenderTree».

Мне кажется, что WebView не удается зарегистрироваться для обновлений местоположения, поскольку у него нет необходимых разрешений, что, в свою очередь, является результатом того, что пользователь не запрашивает разрешения. Хотя в 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);
}

}

}

Ответы [ 3 ]

23 голосов
/ 31 марта 2010

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

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
4 голосов
/ 19 февраля 2010

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

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

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

0 голосов
/ 18 декабря 2013

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

Я занимаюсь разработкой с Android - Phonegap

Я добавил

Приложение / Рез / XML / config.xml

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

Приложение / AndroidManifest.xml

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...