在我想要开发的Android应用程序中,我希望用户可以找到他们的位置。要做到这一点,我在MainActivity中有这个代码,但在设备上(当我运行它时)它找不到经度和地址。为什么?
public class MainActivity extends Activity implements LocationListener {
private TextView latituteField;
private TextView longitudeField;
private TextView addressField; //Add a new TextView to your activity_main to display the address
private LocationManager locationManager;
private String provider;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
latituteField = (TextView) findViewById(R.id.TextView02);
longitudeField = (TextView) findViewById(R.id.TextView04);
addressField = (TextView) findViewById(R.id.TextView05); //Make sure you add this to activity_main
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
System.out.println("Provider " + provider + " has been selected.");
onLocationChanged(location);
} else {
latituteField.setText("Location not available");
longitudeField.setText("Location not available");
}
}
@Override
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
double lat = location.getLatitude();
double lng = location.getLongitude();
Geocoder geoCoder = new Geocoder(this, Locale.getDefault());
StringBuilder builder = new StringBuilder();
try {
List<Address> address = geoCoder.getFromLocation(lat, lng, 1);
int maxLines = address.get(0).getMaxAddressLineIndex();
for (int i=0; i<maxLines; i++) {
String addressStr = address.get(0).getAddressLine(i);
builder.append(addressStr);
builder.append(" ");
}
String fnialAddress = builder.toString(); //This is the complete address.
latituteField.setText(String.valueOf(lat));
longitudeField.setText(String.valueOf(lng));
addressField.setText(fnialAddress); //This will display the final address.
} catch (IOException e) {}
catch (NullPointerException e) {}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(this, "Enabled new provider " + provider,
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(this, "Disabled provider " + provider,
Toast.LENGTH_SHORT).show();
}
}
答案 0 :(得分:1)
注意:这是一个老答案,无法解决特定问题。但是,这是有价值的信息,所以我不删除它。
闪烁的GPS图标是个好兆头。这意味着您的应用程序正在向操作系统询问位置,操作系统会尝试获取它。
闪烁表示操作系统未通过GPS完成获取位置。如果这个问题持续存在,例如超过1或2分钟,它可能有以下原因:
答案 1 :(得分:0)
我的猜测是没有启用最佳提供商。 尝试调用getBestProvider(criteria,true) 还有Log.d提供者,您可以使用isProviderEnabled(提供者)来查看提供者是否已启用。
答案 2 :(得分:0)
我编译了你的例子并在Galaxy S2上测试了它。以下是我的发现:
您的示例中包含两种获取位置的不同方法的代码。一种方法是使用LocationManager.getLastKnownLocation(...)
直接获取位置,另一种方法是实现LocationListener接口并注册位置更新,以便稍后获得有关新位置更新的通知。
前期信息:我的第二种方法工作正常,但我没有使用getLastKnownLocation方法可靠地工作。
位置提取不起作用,因为提供程序返回"network"
。虽然GPS打开,但会发生这种情况随后的影响是,因为我关闭了网络位置提供程序,getLastKnowLocation方法返回null,如下所示:“如果提供程序当前已禁用,则返回null。” (来自getLastKnownLocation)
您可以通过更改
来解决此问题provider = locationManager.getBestProvider(criteria, false);
到
provider = locationManager.getBestProvider(criteria, true);
这将为您提供GPS提供商(如果可用)(已打开)。但是,getLastKnownLocation(...)
方法仍然为我返回null,尽管选择了正确的提供程序(gps)并且提供程序可用。这意味着getLastKnownLocation方法的文档在返回null时缺少有关另一种情况的信息。这似乎是因为没有为此提供程序保存上次已知的位置。您无法知道启动应用程序时是否是这种情况,因此您不能依赖此方法在应用程序启动时返回非空值。
这是一个好消息:现在我们得到了正确的位置提供商,通过第二种方法(注册未来位置更新通知)的位置更新通过gps提供程序按预期工作。更新即将开始,我的测试手机上的文本区域中会显示和更新位置。