Эмулятор Android, Поиск ложных координат местоположения пользователя.Возникли проблемы - PullRequest
1 голос
/ 10 февраля 2011

Привет, ребята, у меня проблемы с поиском долготы и местоположения пользователя, когда я запускаю свою программу и устанавливаю команду telnet для геофиксации для фиктивного местоположения.Пока эмулятор работает, я установил фиктивные координаты только для того, чтобы эмулятор перестал отвечать на запросы, и моя программа не может определить входные координаты.

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class LBSact extends Activity{
    /** Called when the activity is first created. */
    public double longitude;
    public double latitude;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        longitude = 0;
        latitude = 0;
        //Creating the listener and manager
        LocationManager LManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

        LocationListener createListen = new LocationListener(){
            @Override
            public void onLocationChanged(Location location) {
                //longitude = location.getLongitude();
                //latitude = location.getLatitude();
                String printout1 = "My current location is: " + "Latitude = " + location.getLatitude() +
                "Longitude = " + location.getLongitude();
                    Toast.makeText(getApplicationContext(),printout1,Toast.LENGTH_LONG).show();

            }
            @Override
            public void onProviderDisabled(String provider) {
                Toast.makeText(getApplicationContext(), "GPS disabled", Toast.LENGTH_LONG).show();

            }
            @Override
            public void onProviderEnabled(String provider) {
                Toast.makeText(getApplicationContext(), "GPS enabled", Toast.LENGTH_LONG).show();

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

        //Cant use Network with emulator, can only use GPS mock locations
        //Toast.makeText(getApplicationContext(), "Does this work?", Toast.LENGTH_LONG).show();
        LManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, createListen);
    }

}

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Прежде всего.Я предполагаю, что вы прочитали следующее: http://developer.android.com/guide/topics/location/obtaining-user-location.html

Так как вы упомянули, что вводите ложные данные о местоположении.Есть несколько других вещей, которые вы можете попробовать, например, вы можете использовать файл KML для ввода местоположений GPS: http://developer.android.com/guide/developing/tools/ddms.html#emulator-control

Но главное, что вы должны сделать, это создать сообщения регистрации, чтобы вы могли более точноопределить, где ваша программа терпит неудачу.Вот статья о том, как настроить logcat: http://www.droidnova.com/debugging-in-android-using-eclipse,541.html

Я бы посоветовал это, поскольку отправка текста на экран может не всегда работать, поскольку ваше приложение может аварийно завершить работу, прежде чем оно получит эти вызовы.Кроме того, вы пытались отладить приложение через Eclipse?Он сломается при сбое и даст вам место, где происходит сбой приложения.

Я обновлю этот ответ, так как вы дадите более подробную информацию о проблеме, так как довольно сложно увидеть, что происходит без стекатрассировка или запись трассировки.

0 голосов
/ 22 августа 2011

Пара вещей:

  1. Какой у вас уровень AVD API? Подобные сбои - известная проблема в 2.3.

  2. Как вы устанавливаете фиктивные координаты? Через эмулятор управления в Eclipse или через Telnet?

  3. Давайте посмотрим на разрешения в вашем манифесте. Для правильной работы локализации после тега манифеста необходимо несколько разрешений:

    использует разрешение android: name = "android.permission.INTERNET" использование-разрешение android: name = "android.permission.ACCESS_COARSE_LOCATION" использует-разрешение android: name = "android.permission.ACCESS_FINE_LOCATION" использует-разрешение android: name = "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" использование-разрешение android: name = "android.permission.ACCESS_MOCK_LOCATION"

Вот как я запрашиваю обновления для позиции пользователя и устанавливаю POI для элементов наложения:

 package com.snackrocket.location;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.graphics.drawable.Drawable;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import com.snackrocket.R;

public class SrPlacesActivity extends MapActivity implements LocationListener {
    private final static ArrayList<HashMap<String, Object>> POIS = new ArrayList<HashMap<String, Object>>();

    static {
        HashMap<String, Object> row = new HashMap<String, Object>();
        row.put("Name", "Sushi Tei");
        row.put("Description", "Sushi and Much More");
        row.put("Longitude", (101.6769441 * 1E6));
        row.put("Latitude", (3.1184736 * 1E6));
        POIS.add(row);
        row = new HashMap<String, Object>();
        row.put("Name", "Devi's Corner");
        row.put("Description", "Quality Mamak");
        row.put("Longitude", (101.6716426 * 1E6));
        row.put("Latitude", (3.1313672 * 1E6));
        POIS.add(row);
        row = new HashMap<String, Object>();
        row.put("Name", "KFC");
        row.put("Description", "The Colonel's Secret Recipe");
        row.put("Longitude", (101.650006 * 1E6));
        row.put("Latitude", (3.117497 * 1E6));
        POIS.add(row);
        row = new HashMap<String, Object>();
        row.put("Name", "McDonalds");
        row.put("Description", "I'm lovin it");
        row.put("Longitude", (101.6723386 * 1E6));
        row.put("Latitude", (3.1328851 * 1E6));
        POIS.add(row);
        row = new HashMap<String, Object>();
        row.put("Name", "DHaven");
        row.put("Description", "Thai Food and Chicha");
        row.put("Longitude", (101.6710465 * 1E6));
        row.put("Latitude", (3.1315682 * 1E6));
        POIS.add(row);
    }

    private MapView myMap;
    private MyLocationOverlay myLocOverlay;
    private GeoPoint homebase = new GeoPoint((int) (3.1 * 1E6),
            (int) (101.7 * 1E6));
    private int lat;
    private int lng;
    private GeoPoint myPoint = homebase;;
    private Geocoder geocoder;
    private MapController mapController;
    private LocationManager locationManager;
    private TextView locationText;

    private void initMap() {
        myMap = (MapView) findViewById(R.id.mapview);

    }

    private void initMyLocation() {
        myLocOverlay = new MyLocationOverlay(this, myMap);
        myLocOverlay.enableMyLocation();
        myMap.getOverlays().add(myLocOverlay);

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.mapview);

        // Get location manager
        locationManager = (LocationManager) this
                .getSystemService(LOCATION_SERVICE);

        // Create geocoder
        geocoder = new Geocoder(this);

        GeoPoint userPosition = new GeoPoint((int) (lng * 1E6), (int) (lat * 1E6));

        // Prevents NullPointerException
        if (userPosition != null) {
            userPosition = myPoint;
        }

        // Inits
        initMap();
        initMyLocation();

        // Zoom
        int zoomLevel = 14;
        myMap.setBuiltInZoomControls(true);
        MapController mapController = myMap.getController();
        mapController.setCenter(myPoint);
        mapController.setZoom(zoomLevel);

        // Set custom overlay template
        List<Overlay> mapOverlays = myMap.getOverlays();

        // Create my location overlay
        myLocOverlay = new MyLocationOverlay(this, myMap);
        myLocOverlay.enableMyLocation();

        // Enable compass
        myLocOverlay.enableCompass();

        // Add my location overlay
        mapOverlays.add(myLocOverlay);

        // Cycle through POIs and do some magic
        GeoPoint point;
        OverlayItem overlayItem;
        Drawable drawable = getResources().getDrawable(R.drawable.iconr);
        for (HashMap<String, Object> poi : POIS) {
            // Create POI overlay
            SrItemizedOverlay itemizedOverlay = new SrItemizedOverlay(drawable, this);
            point = new GeoPoint(((Double) poi.get("Latitude")).intValue(), ((Double) poi.get("Longitude")).intValue());
            overlayItem = new OverlayItem(point, (String) poi.get("Name"), (String) poi.get("Description"));
            itemizedOverlay.addOverlay(overlayItem);

            // Add POI overlay
            mapOverlays.add(itemizedOverlay);
        }
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    @Override
    protected void onResume() {
        super.onResume();
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                1000, 10, this);

    }

    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(this);

    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    public void onLocationChanged(Location location) {
        location = locationManager
                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
        lat = (int) (location.getLatitude());
        lng = (int) (location.getLongitude());

    }
}

А вот моя детализированная логика наложения:

package com.snackrocket.location;

import java.util.ArrayList;

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class SrItemizedOverlay extends ItemizedOverlay<OverlayItem> {
    Context mContext;

    // Creates ArrayList for ItemizedOverlay
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();


    public SrItemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
    }

    public SrItemizedOverlay(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
    }

    // Adds OverlayItems to the ArrayList
    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }

    // Returns OverlayItem specified by integer
    @Override
    protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
    }

    // Returns current number of OverlayItems in the ArrayList
    @Override
    public int size() {
        return mOverlays.size();
    }

    @Override
    protected boolean onTap(int index) {
        OverlayItem item = mOverlays.get(index);
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();
        return true;
    }
}

Надеюсь, это поможет!

...