【问题标题】:Problem in Getting the Current Location in Android在Android中获取当前位置的问题
【发布时间】:2014-09-27 00:49:14
【问题描述】:

我想显示我当前位置的纬度和经度.. 为此,我没有在 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>

查看我得到的输出:

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

【问题讨论】:

  • 您是在模拟器上输入“gpx”数据还是在设备上启用了 GPS?
  • 我在模拟器上使用它。我也试过这个:telnet localhost 5554 然后geo fix 12 72 ..它不工作。我哪里错了?
  • 您是否也尝试使用 Eclipse ADT 的 DDMS Emulator 控件?手动修复一个点?
  • 没有。我不知道那件事。你能告诉我这件事吗?如何解决一个点?
  • 如果您安装了 Eclipse ADT 插件,请查看developer.android.com/guide/developing/debugging/ddms.html

标签: android android-layout gps android-maps


【解决方案1】:

我刚刚验证了您的代码,它适用于这些更改,您只需将 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" />    

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

不过,我已经在 Android 2.2 上对其进行了测试,

【讨论】:

  • 让我试试这个。测试后告诉你。我应该在手机上测试吗?
  • 当我将所有 tv.append 调用移至 onLocationChanged 时,它没有向我显示任何内容。 onLocationChanged 没有被调用。
  • 您也应该发送位置更新,以便从 DDMS 模拟器控制面板调用 onLocationChanged。您可以为此使用模拟器或设备(启用真正的 GPS /模拟更新)。我在 Android 2.2 模拟器上测试过。
【解决方案2】:

您在 Onlocation 中的位置已更改

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

所以只有当从当前位置发生变化时才会显示纬度和经度。用于检查您提供一些纬度和经度并从 DDMS 中的模拟器控件发送,然后运行您的程序。确保它会显示位置.

【讨论】:

  • 我如何从 DDMS 输入纬度和经度?
  • 当您单击 DDMS 时,将出现模拟器控制窗口。如果没有,则从窗口->显示视图中打开它。在其中您将找到位置控件。单击手动选项卡并输入纬度和经度,然后单击发送,然后运行您的程序
  • 是的,谢谢,它现在完成了..从模拟器控制发送没问题..如果我在手机上安装这个应用程序,我会得到我的当前位置吗?
  • 感谢您的回复..为教我如何使用 DDMS..谢谢
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    使用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——所以你可能想看看将LocationListener 传递给requestLocationUpdates() method,而不是,这将为您提供位置的异步更新。

    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 permission 提供给您的应用程序。

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

    您可能还想在 GPS 不可用时添加ACCESS_COARSE_LOCATION permission,并使用getBestProvider() method 选择您的位置提供商。

    【讨论】:

    • 感谢您的回复。但这是我用过的。看代码。
    【解决方案5】:

    我认为使用模拟器无法获取 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
    }
    

    我通过将设备从一个地方移动到另一个地方进行了测试...

    我希望它会有所帮助..

    【讨论】:

    • 查看这里的帖子。关于在模拟器中测试 GPS 应用程序firstdroid.com/2010/04/29/…
    • 你可以查看我发布的上述代码。它对我有用。因为有一个侦听器每 10 秒侦听一次以获取 GPS 坐标。
    • 你试过三角剖分stackoverflow.com/questions/3145089/… ..你能帮我实现这个吗?..给个相关的想法>?
    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 2023-03-25
    • 2011-07-15
    • 2019-12-24
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多