“位置不可用”?

时间:2013-08-14 23:11:00

标签: android-studio latitude-longitude

在我想要开发的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();
}

}

3 个答案:

答案 0 :(得分:1)

注意:这是一个老答案,无法解决特定问题。但是,这是有价值的信息,所以我不删除它。

闪烁的GPS图标是个好兆头。这意味着您的应用程序正在向操作系统询问位置,操作系统会尝试获取它。

闪烁表示操作系统未通过GPS完成获取位置。如果这个问题持续存在,例如超过1或2分钟,它可能有以下原因:

  • 您没有收到GPS信号(例如,因为您所在的建筑物墙壁太厚)。
  • 您没有与互联网的数据连接(在某些版本的手机和/或Android上,GPS无法在没有数据连接的情况下工作。听起来很愚蠢,但这是真的。我是这类手机的自豪拥有者。 )
  • 还有一些其他错误导致您的GPS处于不再生成位置更新的状态。这有时发生在我身上,我不知道更多的背景信息。重新启动手机后,它一直有效。

答案 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提供程序按预期工作。更新即将开始,我的测试手机上的文本区域中会显示和更新位置。