Получить GPS-местоположение мгновенно с помощью приложения для Android - PullRequest
1 голос
/ 20 мая 2011

все. Я пишу приложение для Android о местоположении GPS.

Я попробовал его на эмуляторе и ввел широту и долготу вручную, и он работал нормально. Однако моя проблема заключается в следующем: на реальном устройстве в режиме отладки перейти к следующему классу с помощью намерения можно только при изменении местоположения. Если я запускаю приложение напрямую, я вижу мигающий значок GPS, но приложение останется только здесь и не начнет следующую операцию. Кажется, что переменные в onLocationChanged () никогда не изменятся.

Я слышал, что для мгновенного определения местоположения используется метод getLastKnownLocation (). Но я не смог получить, где я должен использовать это.

Вот класс того, как я использую LocationManager, чтобы получить местоположения.

Есть ли решения? Я довольно смущен. Большое спасибо !!

    public class mainMenu extends Activity{

private LocationManager locationManager = null;

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);




    Button button1 = (Button)findViewById(R.id.button1);
    button1.setOnClickListener(new OnClickListener(){
        public void onClick(View v){

            Intent i3 = new Intent();
            i3.setClass(mainMenu.this, police.class);
            i3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mainMenu.this.startActivityForResult(i3,0);


        }
    });

    Button button2 = (Button)findViewById(R.id.button2);
    button2.setOnClickListener(new OnClickListener(){
        public void onClick(View v){

            Intent i3 = new Intent();
            i3.setClass(mainMenu.this, ambulance.class);
            i3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mainMenu.this.startActivityForResult(i3,0);


        }
    });

    Button button3 = (Button)findViewById(R.id.button3);
    button3.setOnClickListener(new OnClickListener(){
        public void onClick(View v){

            Intent i3 = new Intent();
            i3.setClass(mainMenu.this, fire_station.class);
            i3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mainMenu.this.startActivityForResult(i3,0);


        }
    });



        locationManager = (LocationManager)mainMenu.this.getSystemService(Context.LOCATION_SERVICE);

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 120000 , 0, new MyLocationUpdater());

        String provider = LocationManager.GPS_PROVIDER;
        Location location = locationManager.getLastKnownLocation(provider);



}



public class MyLocationUpdater implements LocationListener{ //change location interface
    @Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
    //          store the location data
    //          get the best record



        Double lat = location.getLatitude();
        Double lon = location.getLongitude();

        System.out.println("The latitude is " + lat + "and " 
                + "the longitude is "+ lon);


        Double lat11 = lat - 1/69.0;
        Double lat12 = lat + 1/69.0;
        Double lon11 = lon - 1/42.0;
        Double lon12 = lon + 1/42.0;

        StaticVariables.latS1 = lat11.toString();
        StaticVariables.latN1 = lat12.toString();
        StaticVariables.lonW1 = lon11.toString();
        StaticVariables.lonE1 = lon12.toString();

        Double lat111 = lat - 2/69.0;
        Double lat121 = lat + 2/69.0;
        Double lon111 = lon - 2/42.0;
        Double lon121 = lon + 2/42.0;

        StaticVariables.latS11 = lat111.toString();
        StaticVariables.latN11 = lat121.toString();
        StaticVariables.lonW11 = lon111.toString();
        StaticVariables.lonE11 = lon121.toString();

    //          ==================================================
    //          ambulances

        Double lat21 = lat - 3/69.0;
        Double lat22 = lat + 3/69.0;
        Double lon21 = lon - 3/42.0;
        Double lon22 = lon + 3/42.0;

        StaticVariables.latS2 = lat21.toString();
        StaticVariables.latN2 = lat22.toString();
        StaticVariables.lonW2 = lon21.toString();
        StaticVariables.lonE2 = lon22.toString();

        Double lat211 = lat - 5.5/69.0;
        Double lat221 = lat + 5.5/69.0;
        Double lon211 = lon - 5.5/42.0;
        Double lon221 = lon + 5.5/42.0;

        StaticVariables.latS21 = lat211.toString();
        StaticVariables.latN21 = lat221.toString();
        StaticVariables.lonW21 = lon211.toString();
        StaticVariables.lonE21 = lon221.toString();

    //          ===================================================
    //          fire stations

        Double lat31 = lat - 2/69.0;
        Double lat32 = lat + 2/69.0;
        Double lon31 = lon - 2/42.0;
        Double lon32 = lon + 2/42.0;

        StaticVariables.latS3 = lat31.toString();
        StaticVariables.latN3 = lat32.toString();
        StaticVariables.lonW3 = lon31.toString();
        StaticVariables.lonE3 = lon32.toString();

        Double lat311 = lat - 2/69.0;
        Double lat321 = lat + 2/69.0;
        Double lon311 = lon - 2/42.0;
        Double lon321 = lon + 2/42.0;

        StaticVariables.latS31 = lat311.toString();
        StaticVariables.latN31 = lat321.toString();
        StaticVariables.lonW31 = lon311.toString();
        StaticVariables.lonE31 = lon321.toString();

        Intent intent = new Intent();
        intent.setClass(mainMenu.this, getPhoneNumber.class);
        mainMenu.this.startActivity(intent);
    }

    @Override
    public void onProviderDisabled(String arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        // TODO Auto-generated method stub

    }
}

    }

Ответы [ 4 ]

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

Метод getLastKnownLocation не вызывает событие onLocationChanged.Один из способов рефакторинга вашего кода - переместить логику, действующую на Location, в отдельный метод, а затем вызвать этот метод как после вызова getLastKnownLocation, так и из вашего onLocationChanged метода.

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

Пример кода:

public void onCreate(Bundle savedInstanceState){
    ....
    String provider = LocationManager.GPS_PROVIDER;
    Location location = locationManager.getLastKnownLocation(provider);
    updateLocation(location);
}

public class MyLocationUpdater implements LocationListener{ //change location interface
    @Override
    public void onLocationChanged(Location location) {
        updateLocation(location);
    }
    ...
}

void updateLocation(Location location) {
    Double lat = location.getLatitude();
    Double lon = location.getLongitude();

    // the rest of the code from onLocationChanged
}
0 голосов
/ 07 ноября 2011

У меня такая же проблема раньше ... но у меня есть решение ... это самый простой способ мгновенно определить местоположение.

public class LocationFinder extends Activity {

    TextView textView1;
    Location currentLocation;
    double currentLatitude,currentLongitude;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        textView1 = (TextView) findViewById(R.id.textView1);
        Log.i("@@@@@@@@@@ Inside LocationFinder onCreate", "LocationFinder onCreate");

        FindLocation();

    }

    public void FindLocation() {
        LocationManager locationManager = (LocationManager) this
                .getSystemService(Context.LOCATION_SERVICE);

        LocationListener locationListener = new LocationListener() {
            public void onLocationChanged(Location location) {
                updateLocation(location);

                Toast.makeText(
                        LocationFinder.this,
                        String.valueOf(currentLatitude) + "\n"
                                + String.valueOf(currentLongitude), 5000)
                        .show();

                }

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

            public void onProviderEnabled(String provider) {
            }

            public void onProviderDisabled(String provider) {
            }
        };
        locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

    }


    void updateLocation(Location location) {
            currentLocation = location;
            currentLatitude = currentLocation.getLatitude();
            currentLongitude = currentLocation.getLongitude();
            textView1.setText(String.valueOf(currentLatitude) + "\n"
                    + String.valueOf(currentLongitude));

        }
}

Не забудьте дать разрешение в Manifeast.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET"/>
0 голосов
/ 20 мая 2011
public class HomeActivity extends Activity implements LocationListener{
public static Context mContext;
private double latitude, longitude;
 public LocationManager mLocManager;
// *******This is the new Code start on 11/4/2011 at 3 o'clock


/**
 * This is the Home Button if user Login then it is move to TennisAppActivity otherwise move to Login  
 *
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
    mContext=this;
    super.onCreate(savedInstanceState);
    setContentView(R.layout.homelayout);


    mLocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    mLocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
            this);
    mLocManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0,
            0, this);
    locationUpdate();
    ((Button) this.findViewById(R.id.ButtonHome))
            .setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {

                        startActivity(new Intent(HomeActivity.this,
                                DefaultDisplay.class));

                }
            });

    ((Button) this.findViewById(R.id.ButtonProfile))
            .setOnClickListener(new OnClickListener() {

                public void onClick(View arg0) {
                    if (GUIStatics.boolLoginStatus) {
                        startActivity(new Intent(HomeActivity.this,
                                MyProfile.class));
                    } else {
                        Intent intent=new Intent(HomeActivity.this,
                                Login.class);
                        intent.putExtra("moveTo","MyProfile");
                        startActivity(intent);
                    }
                }
            });

    ((Button) this.findViewById(R.id.ButtonNotifications))
            .setOnClickListener(new OnClickListener() {

                public void onClick(View arg0) {
                    if (GUIStatics.boolLoginStatus) {
                        startActivity(new Intent(HomeActivity.this,
                                ShowAllNotificationActiviry.class));
                    } else {
                        Intent intent=new Intent(HomeActivity.this,
                                Login.class);
                        intent.putExtra("moveTo","ShowAllNotificationActiviry");
                        startActivity(intent);
                    }
                }
            });

    ((Button) this.findViewById(R.id.ButtonFavorites))
            .setOnClickListener(new OnClickListener() {

                public void onClick(View arg0) {
                    if (GUIStatics.boolLoginStatus) {
                        startActivity(new Intent(HomeActivity.this,
                                FavoritesActivity.class));
                    } else {
                        Intent intent=new Intent(HomeActivity.this,
                                Login.class);
                        intent.putExtra("moveTo","FavoritesActivity");
                        startActivity(intent);
                    }
                }
            });

            ((Button) this.findViewById(R.id.ButtonMore))
            .setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {
                        startActivity(new Intent(HomeActivity.this,
                                MoreListActivity.class));
                }
            });

}

public void locationUpdate()
{
    CellLocation.requestLocationUpdate();
}


public void getAddress(double lat, double lng) {
    Geocoder geocoder = new Geocoder(HomeActivity.mContext, Locale.getDefault());
    try {
        List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
        Address obj = addresses.get(0);
        String add = obj.getAddressLine(0);
        GUIStatics.currentAddress = obj.getSubAdminArea() + ","
                + obj.getAdminArea();
        GUIStatics.latitude = obj.getLatitude();
        GUIStatics.longitude = obj.getLongitude();
        GUIStatics.currentCity= obj.getSubAdminArea();
        GUIStatics.currentState= obj.getAdminArea();
        add = add + "\n" + obj.getCountryName();
        add = add + "\n" + obj.getCountryCode();
        add = add + "\n" + obj.getAdminArea();
        add = add + "\n" + obj.getPostalCode();
        add = add + "\n" + obj.getSubAdminArea();
        add = add + "\n" + obj.getLocality();
        add = add + "\n" + obj.getSubThoroughfare();

        Log.v("IGA", "Address" + add);
        // Toast.makeText(this, "Address=>" + add,
        // Toast.LENGTH_SHORT).show();

        // TennisAppActivity.showDialog(add);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
}



public void onLocationChanged(Location location) {
    latitude = location.getLatitude();
    longitude = location.getLongitude();
    GUIStatics.latitude=location.getLatitude();
    GUIStatics.longitude= location.getLongitude();
    Log.v("Test", "IGA" + "Lat" + latitude + "   Lng" + longitude);
    //mLocManager.r

    getAddress(latitude, longitude);
    if(location!=null)
    {

    mLocManager.removeUpdates(this);
    }
    // Toast.makeText(this, "Lat" + latitude + "   Lng" + longitude,
    // Toast.LENGTH_SHORT).show();
}


public void onProviderDisabled(String arg0) {
    // TODO Auto-generated method stub
    Toast.makeText(HomeActivity.this, "Gps Disabled", Toast.LENGTH_SHORT).show();
    Intent intent = new Intent(
            android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivity(intent);
}


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

}


public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
     if(arg1 == 
            LocationProvider.TEMPORARILY_UNAVAILABLE) { 
                                    Toast.makeText(HomeActivity.this, 
            "LocationProvider.TEMPORARILY_UNAVAILABLE", 
            Toast.LENGTH_SHORT).show(); 
                        } 
                        else if(arg1== LocationProvider.OUT_OF_SERVICE) { 
                                    Toast.makeText(HomeActivity.this, 
            "LocationProvider.OUT_OF_SERVICE", Toast.LENGTH_SHORT).show(); 
                        } 

}

}

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

0 голосов
/ 20 мая 2011

getLastKnownLocation () быстрее после установления соединения со спутником GPS.В первый раз он вернет ноль или значение, пока не будет установлено соединение.Вы можете добавить GpsListener, чтобы знать, когда местоположение получено.Поиск "как получить исправление GPS", и вы можете получить ответ на свой вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...