Передача GPS LonLat с Android GPS на веб-страницу (JavaScript) - PullRequest
4 голосов
/ 01 марта 2010

У меня есть следующий код, но lon / lat, кажется, возвращает ноль;

package com.domain.www;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.Criteria;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class WebMapActivity extends Activity implements LocationListener {

    private static final String MAP_URL = "http://www.yahoo.com/";
    private WebView webView;
    private Location mostRecentLocation;

    @Override
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            getLocation();
            setupWebView();
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /** Sets up the WebView object and loads the URL of the page **/
    private void setupWebView() {
        /*
            final String centerURL = "javascript:centerAt("
                    + mostRecentLocation.getLatitude() + ","
                    + mostRecentLocation.getLongitude() + ")"; */

            webView = (WebView) findViewById(R.id.webview);
            webView.getSettings().setJavaScriptEnabled(true);

            webView.setWebViewClient(new WebViewClient() {
                @Override
                public void onPageFinished(WebView view, String url)
                {
                    String jsCode = "javascript:alert('" + getMostRecentLocation("lon") + "')";
                    webView.loadUrl(jsCode.toString());
                }
            });


            webView.loadUrl(MAP_URL);
    }

    /**
     * The Location Manager manages location providers. This code searches for
     * the best provider of data (GPS, WiFi/cell phone tower lookup, some other
     * mechanism) and finds the last known location.
     **/
    private void getLocation() {
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        String provider = locationManager.getBestProvider(criteria, true);

        // In order to make sure the device is getting location, request
        // updates. locationManager.requestLocationUpdates(provider, 1, 0,
        // this);
        //locationManager.requestLocationUpdates(provider, 1, 0, this);
        setMostRecentLocation(locationManager.getLastKnownLocation(provider));
    }

    /** Sets the mostRecentLocation object to the current location of the device **/
    @Override
    public void onLocationChanged(Location location) {
        setMostRecentLocation(location);
    }

    /**
     * The following methods are only necessary because WebMapActivity
     * implements LocationListener
     **/
    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    /**
     * @param mostRecentLocation the mostRecentLocation to set
     */
    public void setMostRecentLocation(Location mostRecentLocation) {
        this.mostRecentLocation = mostRecentLocation;
    }

    /**
     * @return the mostRecentLocation
     */
    public double getMostRecentLocation(String lonLat) {
        double gValue = 0.00;
        try
        {
        Location xx = this.mostRecentLocation;  //Used as a breakpoint
        if(lonLat == "lat") gValue = this.mostRecentLocation.getLatitude();
        if(lonLat == "lon") gValue = this.mostRecentLocation.getLongitude();        

        } catch (Exception e) {
            e.printStackTrace();
        }

        return gValue;  
    }

}

Игнорировать бит URL, который будет страницей с картой Google; но для отладки я бы предпочел, чтобы он просто выдавал предупреждение со значениями в нем.

Есть идеи, что не так? Целевые эмуляторы (Google API 1.5 API (3))

Спасибо

Ответы [ 3 ]

8 голосов
/ 01 марта 2010

Причиной 0,0 широты и долготы является то, что у вас нет широты или долготы. Вы ничего не сделали в своем коде, чтобы получить местоположение - getLastKnownLocation() работает, только если в вашем коде есть что-то еще, запрашивающее обновление местоположения.

Вот пример проекта , который делает то, что вы хотите, либо потянув (как рекомендация г-на Нурика addJavascriptInterface()), либо нажав (используя запись javascript:).

2 голосов
/ 01 марта 2010

Возможно, вы захотите использовать WebView#addJavascriptInterface вместо загрузки javascript: URL, так как это будет намного чище.

В основном вам нужно сделать следующее:

  1. Создайте класс, у которого есть метод, который возвращает данные о местоположении.
  2. Создайте экземпляр класса и передайте его WebView, используя addJavascriptInterface (здесь вы предоставите имя глобальной переменной для использования в Javascript).
  3. Из Javascript на странице, вызовите метод для глобальной переменной, определяемой addJavascriptInterface, и используйте результаты по своему усмотрению.

Подробнее см. этот вопрос о переполнении стека .

0 голосов
/ 02 июля 2010

Если местоположение пусто

Если getLastKnownLocation или getLastKnownBestLocation возвращает значение null, вам следует рассмотреть возможность изменения цели сборки с «Android 1.5» на «Google API 1.5». Это решило проблему для меня.

Вы можете изменить цель сборки для своего проекта в любое время в Eclipse: щелкните правой кнопкой мыши проект в Package Explorer, выберите «Свойства»> «Android» и затем выберите «Google API» для Project Target.

-

Если местоположение 0.0

Если getLastKnownLocation возвращает 0.0 после нажатия кнопки «Отправить» в элементах управления местоположением DDMS, возможно, вы работаете с неанглийскими настройками культуры. Это ошибка эмулятора, исправленная в следующем выпуске 7 инструментов SDK; для быстрого исправления вы можете изменить свой язык на «en». (Подробнее см. http://code.google.com/p/android/issues/detail?id=915.)

Читая ваш комментарий Роману Нурику, я думаю, что ошибка SDK с неанглийскими настройками культуры вас беспокоит. Измените настройки языка в Eclipse или в вашей ОС, и все будет в порядке. В качестве альтернативы этому вы можете использовать сеанс telnet для отправки долготы и широты.

telnet localhost:5554
geo fix 52.383144 5.217133
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...