我正试图通过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。不能解决问题。
答案 0 :(得分:19)
位置更新实际上是异步。这意味着API不会让您的调用线程等到新位置可用;相反,您使用特定方法(回调)注册一个观察者对象,只要计算新位置就会调用该方法。
在Android LocationManager API中,观察者是LocationListener个对象,位置更新的主要回调是onLocationChanged()
这是一个试图解释这一点的图表(希望这有助于而不是让你感到困惑!)
所以从您当前的代码:
然后启动应用程序并观察logcat中发生的情况。在初始请求之后,您将看到状态更改和位置更新不会立即显示,从而解释了textview始终显示的原因(0.0,0.0)。
更多:http://developer.android.com/guide/topics/location/obtaining-user-location.html
答案 1 :(得分:3)
在onCreate()返回之前,无法触发您的位置更新回调。如果将lat / long变量初始化为虚拟值,您可能会看到正在打印这些值。
在onLocationChanged中添加一些日志记录,以便您可以看到它被触发,然后阅读一下android应用程序如何处理回调和更新UI。
还要确保您的应用程序在其清单中具有适当的权限。
答案 2 :(得分: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"
如果您使用的是仿真器 - 在DDMS透视图中,请在“仿真器控制”选项卡中查找位置控件。然后使用“手动”选项卡设置“经度”和“纬度”,然后单击“发送” - 在程序运行时执行此操作,您将看到对onLocationchanged的调用。登录onLocationChanged是个好主意。
BTW,requestLocationUpdates中的参数设置为“... 0,0 ......” - 它会耗尽你的电池 - 我看到手机在6-8小时内死机 - 将其改为“...... 30000,100 ...“ - millisec中的第一个参数,另一个是以米为单位。答案 3 :(得分:0)
当你在模拟器上检查它时,它将给出0.0。你必须将位置传递给模拟器。 你可以从C:\ android-sdk_r06 \ android-sdk-windows \ tools \ ddms.bat文件中传递它。
在ddms中有一个名为模拟器控件的选项卡。从那里你可以将位置传递给模拟器。 试试这个。希望它能奏效。答案 4 :(得分:-3)
如何创建应用?
按行动获取当前位置坐标(获取位置) 纬度/经度
将位置发布到要在地图上显示的网络服务器。(提交) 清除按钮以清除旧位置(清除位置)或打开(提交)它变得清晰(0.0.0.0)
Getting the current GPS location on Android http://developer.android.com/guide/topics/location/obtaining-user-location.html