Как получить геолокацию, работая на титановом мобильном приложении appcelerator с android webview - PullRequest
4 голосов
/ 09 мая 2011

Я просто играю на платформе Appcelerator Titanium для разработки мобильных приложений.

Мое тестовое приложение просто открывает веб-просмотр, указывающий на онлайн-страницу.Эта страница использует API геолокации W3C для получения местоположения пользователя.

Это мои специфичные для tiapp.xml разрешения для Android:

<android xmlns:android="http://schemas.android.com/apk/res/android">
    <manifest>
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
    </manifest>
</android>

Это мой код JavaScript для полученияКоординаты:

if (navigator.geolocation) {

    navigator.geolocation.getCurrentPosition(function(position){

        $("#results").append('Longitude: ' + position.coords.longitude + '<br/>');
        $("#results").append('Latitude: ' + position.coords.latitude + '<br/>');

    }, function(error){

        $("#results").append('An error ocurred ' + error.message);
    });

} else {

    $("#results").append('Geolocation not supported');
}

Кажется, что navigator.geolocation и navigator.geolocation.getCurrentPosition определены, но делегаты все равно не выполняются.

Вопрос: как заставить это работать?: -)

Заранее спасибо.

Обновление: Я обнаружил, что проблема, по-видимому, в том, что в Android 2.x есть собственная реализация navigator.geolocation.Согласно этот коммит для исходного кода phonegap.

Обновление 2: Я написал очень маленькое полнофункциональное Android-приложение, которое открывает веб-клиент на той же веб-странице и работает нормально.:

package com.sourcerebels;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.GeolocationPermissions.Callback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;

class MyClient extends WebChromeClient {

    @Override
    public void onGeolocationPermissionsShowPrompt(String origin,
            Callback callback) {
        callback.invoke(origin, true, false);
    }
}

public class TestWebClient extends Activity {

    WebView webView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        webView = (WebView) findViewById(R.id.webView1);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setGeolocationDatabasePath("/data/data/testWebClient");
        webView.loadUrl("http://www.sourcerebels.com/index2.html");

        webView.setWebChromeClient(new MyClient());
    }
}

Обновление 3 : Я нашел этот источник с сайта github appcelerator: https://github.com/appcelerator/titanium_mobile/blob/master/android/modules/ui/src/ti/modules/titanium/ui/widget/webview/TiWebChromeClient.java

Ответы [ 3 ]

4 голосов
/ 09 мая 2011

Самым сильным аспектом Titanium является то, что это Native Code на каждой платформе. Используя веб-просмотр, вы значительно избегаете преимущества нативного кода.

http://wiki.appcelerator.org/display/guides/Using+Location+services

http://wiki.appcelerator.org/display/guides/HTML5+vs+Native+UI

В разделе «Когда использовать HTML» указывается следующее:

"HTML следует избегать как можно больше. Почти все, что вам нужно, можно сделать с помощью собственного кода. Приложение будет загружаться быстрее и быстрее реагировать на действия пользователя, что приведет к улучшению взаимодействия с пользователем."

Следуя этим стандартам, я бы посоветовал вам узнать местоположение, а затем создать или обновить веб-просмотр. Что касается того, почему javascript не работает, у меня нет ответа, потому что при создании веб-просмотра загружается полный DOM?

3 голосов
/ 09 мая 2011

Наконец-то я решил эту «проблему», изменив TiWebChromeClient.java из источников мобильного SDK для Titanium и создав новый файл titanium-ui.jar.

Добавлен этот код, и теперь я могу использовать геолокацию на Android WebView:

import android.webkit.GeolocationPermissions.Callback;

...

    @Override
    public void onGeolocationPermissionsShowPrompt(String origin,
            Callback callback) {
        callback.invoke(origin, true, false);
    }
1 голос
/ 09 сентября 2011

Наше решение выглядит следующим образом:

import android.webkit.GeolocationPermissions;

    // enable navigator.geolocation 
    mWebView.getSettings().setGeolocationEnabled(true);
    mWebView.getSettings().setGeolocationDatabasePath("/data/data/databases/");


    // START Allow Geolocation prompt
    public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
        callback.invoke(origin, true, false);
    }
...