4

我正在尝试通过 GPS 功能获取用户的当前位置,

写了一个简单的类来实现LocationListener

public class LocationManagerHelper implements LocationListener {

    private static double latitude;
    private static double longitude;

    @Override
    public void onLocationChanged(Location loc) {
        latitude = loc.getLatitude();
        longitude = loc.getLongitude();
    }

    @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;
    }

}

并通过一个简单的操作,我正在访问这些经度和纬度值

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /** create a TextView and write Hello World! */
    TextView tv = new TextView(this);

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

    LocationListener mlocListener = new LocationManagerHelper();

    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
            mlocListener);

    if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            tv.append("Latitude:- " + LocationManagerHelper.getLatitude()
                    + '\n');
            tv.append("Longitude:- " + LocationManagerHelper.getLongitude()
                    + '\n');
    } else {
        tv.setText("GPS is not turned on...");
    }

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

但它总是返回 0.0 作为结果。无法找出问题所在。

4

5 回答 5

19

位置更新实际上是异步的。这意味着 API 不会让您的调用线程等待新位置可用;相反,您使用特定方法(回调)注册一个观察者对象,每当计算新位置时都会调用该方法。

Android LocationManager API中,观察者是一个LocationListener对象,位置更新的主要回调是onLocationChanged()

这是一个试图解释这一点的图表(希望这对您有所帮助而不是让您感到困惑!)

序列图

所以从你当前的代码:

  • 将 mlocListener 声明为 Activity 子类的成员
  • 在 LocationListener 实现中添加日志输出(Logcat 行)
  • 保持其余代码不变。
  • 如果尚未这样做,请在清单中添加正确的权限( GPS 需要FINE_LOCATION )。
  • 尝试将手机连接到互联网并靠近窗户,以便获得相当快的 GPS 定位(大约 30 秒)。

然后启动应用程序并观察 logcat 中发生的情况。您将看到在初始请求之后状态更改和位置更新不是立即的,从而解释了为什么您的 textview 总是显示 (0.0,0.0)。

更多:http: //developer.android.com/guide/topics/location/obtaining-user-location.html

于 2011-02-05T09:24:10.393 回答
3

在 onCreate() 返回之前,您的位置更新回调不能被触发。如果您将 lat/long 变量初始化为虚拟值,您可能会看到您正在打印这些值。

在您的 onLocationChanged 中添加一些日志,以便您可以看到它正在被触发,然后阅读一些关于 android 应用程序如何在回调和更新 UI 方面的工作。

还要确保您的应用程序在其清单中具有适当的权限。

于 2011-02-05T06:06:11.873 回答
2

获得 mLocListener 后 - 设置 Criteria 如下所示

String mlocProvider;
Criteria hdCrit = new Criteria();
hdCrit.setAccuracy(Criteria.ACCURACY_COARSE);
mlocProvider = mlocManager.getBestProvider(hdCrit, true);

然后使用 getLastKnownLocation

tv.append("\n\nLocations (starting with last known):");
Location currentLocation = mlocManager.getLastKnownLocation(mlocProvider);

确保你的清单中有这些
uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"

如果您使用的是 Emulator - 在 DDMS Perspective 中,请在 Emulator Control 选项卡中查找 Location Controls。然后使用手动选项卡设置经度和纬度并单击发送 - 当您的程序运行时执行此操作,您会看到对 onLocationchanged 的​​调用。登录 onLocationChanged 是个好主意。

顺便说一句,requestLocationUpdates 中的参数设置为“... 0,0 ...” - 它会耗尽你的电池 - 我已经看到手机在 6 - 8 小时内死机 - 将其更改为“... 30000, 100 ...” - 第一个参数以毫秒为单位,另一个以米为单位。

于 2011-02-05T06:55:09.647 回答
0

当你在模拟器上检查它时,它会给出 0.0。您必须将位置传递给模拟器。您可以从 C:\android-sdk_r06\android-sdk-windows\tools\ddms.bat 文件中传递它。

在 ddms 中有一个名为 emulator controls 的选项卡。从那里您可以将位置传递给模拟器。试试这个。希望它会奏效。

于 2011-02-05T06:06:28.483 回答
-3

如何创建应用程序?

通过动作获取当前位置坐标(获取位置)纬度/经度

将位置发布到要在地图上显示的网络服务器。(提交)清除按钮以清除旧位置(清除位置)或在(提交)它变得清晰(0.0.0.0)

在 Android http://developer.android.com/guide/topics/location/obtaining-user-location.html上获取当前 GPS 位置

于 2012-06-15T15:24:16.270 回答