我想知道是否可以在不使用LocationListener的情况下获取用户位置。
我问的原因是我的locationListener事件没有被调用。
public class LocationActivity extends Activity implements LocationListener{
private LocationManager m_locationManager;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout content = new LinearLayout(this);
content.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
content.setOrientation(LinearLayout.VERTICAL);
content.setBackgroundColor(Color.TRANSPARENT);
TextView infoLabel = new TextView(this);
infoLabel.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
infoLabel.setTextSize(20.0f);
infoLabel.setText("Initializing...");
content.addView(infoLabel);
try{
m_locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
String provider = null;
if ( m_locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
provider = LocationManager.GPS_PROVIDER ;
Log.d("Unity", "Using GPS");
m_locationManager.requestLocationUpdates(provider, 0, 0, this);
} else if(m_locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
provider = LocationManager.NETWORK_PROVIDER;
Log.d("Unity", "Using Netword");
m_locationManager.requestLocationUpdates(provider, 0, 0, this);
} else {
Log.d("Unity", "Provider Not available");
}
}catch(Exception ex){
Log.d("Unity", "locatons error " + ex.getMessage());
}
setContentView(content);
}
public void onLocationChanged(Location location) {
Log.d("Unity", "UserLocation Lat:" + location.getLatitude() + " Long:" + location.getLongitude());
}
public void onStatusChanged(String provider, int status, Bundle extras) {Log.d("Unity", "onStatusChanged");}
public void onProviderEnabled(String provider) {Log.d("Unity", "onProviderEnabled");}
public void onProviderDisabled(String provider) {Log.d("Unity", "onProviderDisabled");}
}
有关详细信息,请参阅此帖子:
Android: Can't create handler inside thread that has not called Looper.prepare()
修改以反映mmeyer评论
答案 0 :(得分:1)
首先,当您选择具有LocationManager.getLastKnownLocation(provider)
的提供商时,您可以检查上一个已知位置,看看它是否为空且不太旧。
除此之外,您的代码看起来足够了。我怀疑问题可能是你对requestLocationUpdates的调用中的第3个参数说,如果位置变化超过100米,则仅发送更新。对于你在调试和观看logcat中运行的大多数情况,每秒移动一百米似乎不太可能。
来自API文档:
可以使用minTime和来控制通知的频率 minDistance参数。如果minTime大于0,则 LocationManager可能会休息minTime毫秒 位置更新之间以节省电力。 如果minDistance更大 如果设备移动,则只会广播位置,而不是0 mindistance米。要尽可能频繁地获取通知, 将两个参数都设置为0。