1

我想显示我当前位置的纬度和经度。为此,我没有在 Google 中搜索,而是在 SO 中搜索。

我只想显示我当前位置的纬度和经度。

请参阅下面的代码:

public class LocationGetter extends Activity {

@Override

public void onCreate(Bundle savedInstanceState)
{

super.onCreate(savedInstanceState);

TextView tv = new TextView(this);

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

LocationListener mlocListener = new LocationManagerHelper();

mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30000, 100,mlocListener);

if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        tv.append("Latitude:- " + LocationManagerHelper.getLatitude()
                + '\n');
        tv.append("Longitude:- " + LocationManagerHelper.getLongitude()
                + '\n');

        Log.i("MyLocation1",Double.toString(LocationManagerHelper.getLatitude())+" "+Double.toString(LocationManagerHelper.getLongitude()));

} else {
    tv.setText("GPS is not turned on...");
}

/** set the content view to the TextView */
setContentView(tv);

}

/* Class My Location Listener */

public static class LocationManagerHelper implements LocationListener {

    private static double latitude;
    private static double longitude;

    @Override
    public void onLocationChanged(Location loc) {
        latitude = loc.getLatitude();
        longitude = loc.getLongitude();
        Log.i("MyLocation",Double.toString(latitude)+" "+Double.toString(longitude));
    }

    @Override
    public void onProviderDisabled(String provider) { }

    @Override
    public void onProviderEnabled(String provider) { }

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

    }

    public static double getLatitude() {
        return latitude;
    }

    public static double getLongitude() {
        return longitude;
    }

}

} 

我还在清单文件中添加了权限:

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

查看我得到的输出:

在此处输入图像描述

我哪里错了?我不明白,它是一个简单的代码,为什么它不起作用?

4

5 回答 5

2

我刚刚验证了您的代码并且它适用于这些更改,您只需将调用移动到每次tv.append()调用的方法,如果您不将其用于回调,那么您将只获得第一个设置值并且onLocationChanged()它只执行一次。

        public void onLocationChanged(Location loc) {
            latitude = loc.getLatitude();
            longitude = loc.getLongitude();
            Log.i("MyLocation",Double.toString(latitude)+" "+Double.toString(longitude));
            tv.append("Latitude:- " + LocationManagerHelper.getLatitude()
                    + '\n');
            tv.append("Longitude:- " + LocationManagerHelper.getLongitude()
                    + '\n');

            Log.i("MyLocation1",Double.toString(LocationManagerHelper.getLatitude())+" "+Double.toString(LocationManagerHelper.getLongitude()));

        }

我已经使用了这些权限AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />    
<uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES" />    

您可以查看这些并过滤掉您不感兴趣的。我使用了从此处下载的 .gpx 文件

我已经在 Android 2.2 上测试过了,位置更新工作

于 2011-04-07T10:32:46.140 回答
2

您在 Onlocation 中的位置已更改

 public void onLocationChanged(Location loc) {
    latitude = loc.getLatitude();
    longitude = loc.getLongitude();
    Log.i("MyLocation",Double.toString(latitude)+" "+Double.toString(longitude));
  }

因此,仅当从当前位置更改时才会显示纬度和经度。用于检查您提供一些纬度和经度并从 DDMS 中的模拟器控件发送,然后运行您的程序。确保它会显示位置。

在此处输入图像描述

于 2011-04-07T10:45:10.047 回答
1

如果你在设备中运行这个程序,那么它会显示纬度和经度 0.0,直到我们改变我们的位置。你必须从当前位置移动至少 10 米才能看到输出。因为不改变当前位置onLocationChange()方法不会触发并且输出将为 0.0

于 2012-09-27T03:49:21.600 回答
0

使用LocationManager.

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
double longitude = location.getLongitude();
double latitude = location.getLatitude();

调用getLastKnownLocation()不会阻塞 - 这意味着null如果当前没有可用的位置,它将返回 - 所以您可能想看看将 a 传递LocationListener给该requestLocationUpdates()方法,这将为您提供位置的异步更新。

private final LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
        longitude = location.getLongitude();
        latitude = location.getLatitude();
    }
}

lm.requestLocationUpdates(LocationManager.GPS, 2000, 10, locationListener);

如果您想使用 GPS,您需要授予您的应用程序ACCESS_FINE_LOCATION许可。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

您可能还想添加GPS 不可用时的ACCESS_COARSE_LOCATION权限,并使用getBestProvider()方法选择您的位置提供商。

于 2011-04-07T09:48:19.410 回答
0

我认为使用模拟器您无法获得 GPS 坐标。如果您正在使用移动设备,请尝试在建筑物外使用 GPS。有时您无法获得建筑物内的 GPS 坐标。如果那个时候你也失败了,那么我会发布我们成功的代码。

下面的代码现在我已经测试过了,它对我有用..

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

 public class GetGPS extends Activity {

String GPSPROVIDER = LocationManager.GPS_PROVIDER;
private  static final long MIN_GEOGRAPHIC_POOLING_TIME_PERIOD = 10000;
private  static final float MIN_GEOGRAPHIC_POOLING_DISTANCE = (float)5.0;

public LocationManager gpsLocationManager;

static Context context = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    context = this;

    /*Get a listener for GPS*/
    LocationListener gpsLocationListener = null;

    gpsLocationListener = new GpsLocationListener(this);

    /*Start Location Service for GPS*/
    gpsLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    /*Register GPS listener with Location Manager*/
    gpsLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
            MIN_GEOGRAPHIC_POOLING_TIME_PERIOD,
            MIN_GEOGRAPHIC_POOLING_DISTANCE, gpsLocationListener);

    boolean isavailable = gpsLocationManager.isProviderEnabled(GPSPROVIDER);

    if(isavailable) {

        Location loc = gpsLocationManager.getLastKnownLocation("gps");

        if(loc != null) {
            double latitude = loc.getLatitude();
            double longitude = loc.getLongitude();

            Toast.makeText(GetGPS.this,"Longitude is  "+longitude + "   Latitude is   "+latitude, Toast.LENGTH_LONG).show();

        }
    }

}

public static class GpsLocationListener implements LocationListener {


    public GpsLocationListener(Context context){

    }

    public void onLocationChanged(Location loc) {

        if (loc != null) {

            double latitude = loc.getLatitude();
            double longitude = loc.getLongitude();

            Toast.makeText(context,"Longitude is  "+longitude + "   Latitude is   "+latitude, Toast.LENGTH_LONG).show();

        }

    }//End of onLocationChanged Method

    @Override
    public void onProviderDisabled(String provider) {

    }//End of onProviderDisabled Method

    @Override
    public void onProviderEnabled(String provider) {

    }//End of onProviderEnabled Method

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


    }//End of onStatusChanged Method

}//End of GpsLocationListener class
}

我通过将设备从一个地方移动到另一个地方来测试这个......

我希望它会有所帮助..

于 2011-04-07T09:55:59.780 回答