Используя navigator.geolocation.getCurrentPosition в веб-представлении на Android 2.0 + (связанный PhoneGap)

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

Поддержка GeoLocation API была добавлена к Android в 2,0 (Эклер), и это работает в браузере по умолчанию над Droid Verizon (на 2.0.1). Таким образом, если я посещаю веб-сайт, который называет navigator.geolocation.getCurrentPosition (success_callback, error_callback), подсказки устройства, что текущий домен "хочет знать Ваше местоположение" в диалоговом окне с опциями "Совместно использовать местоположение" или "снижение". Если я выбираю "Местоположение доли", success_callback в конечном счете назван с данными местоположения.

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

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

Следующее на основе Привет, пример веб-представления из Руководства разработчика 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);
}

}

}

13
задан ajh158 15 February 2010 в 19:54
поделиться

2 ответа

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

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
23
ответ дан 1 December 2019 в 21:11
поделиться

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

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

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

4
ответ дан 1 December 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: