【问题标题】:Finding Location : Google Play Location Service or Android platform location APIs查找位置:Google Play 位置服务或 Android 平台位置 API
【发布时间】:2014-02-19 06:06:51
【问题描述】:

我正在尝试为我的新导航应用获取用户位置。 我想经常检查用户的位置,它必须是准确的。 我使用示例中的以下代码来获取位置。

public class MainActivity extends Activity implements LocationListener {
private LocationManager locationManager;
private String provider;
private TextView a;
private TextView b;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    a = (TextView) findViewById(R.id.a);
    b = (TextView) findViewById(R.id.b);

    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 {
        a.setText("Location not available");
        b.setText("Location not available");
    }
}

@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(provider,0, 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();
    a.setText(String.valueOf(lat));
    b.setText(String.valueOf(lng));
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}

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

但是当我移动时,位置坐标并没有更新,我总是得到一个恒定的值...... 有没有更好的方法来获取位置?根据 android 文档,我可以为此使用 Google Play 位置服务或 Android 平台位置 API。 我检查了两者的示例代码,它实现了 LocationListener 接口来获取用户位置。那么它们之间的实际区别是什么?

【问题讨论】:

  • 设置标准.setAccuracy(Criteria.ACCURACY_COARSE);并尝试
  • Gps 提供程序在室内无法正常工作...它在室外正常工作...

标签: android geolocation gps location


【解决方案1】:

绝对使用新的 google play 位置服务。他们在室内的工作比旧的位置经理好得多。我创建了一个使用新的 google play 位置服务并定期在后台运行的示例。看看吧:

https://github.com/nickfox/GpsTracker/tree/master/phoneClients/android

【讨论】:

  • 请记住,如果您使用 Google Location,您的应用现在依赖于 Google Play 服务,该服务是 google 拥有的封闭源代码。因此,您的应用无法在 AOSP Android 设备上运行。
  • 嘿伙计,你可以问我关于你在 GitHub 上的项目的问题吗?它只是在您打开应用程序的那一刻发送,甚至在不打开应用程序的情况下,当它开始在单元格中启动时也会发送位置?
  • 谷歌播放位置 API 需要网络连接吗?
【解决方案2】:

当我使用它时,我发现了 2 个很好的来源:

  1. 博文:Android Location Fused Provider。它包含一个关于使用 FusedLocationProviderApi 在 Android 中获取位置的完整教程。

  2. 回答Android LocationClient class is deprecated but used in documentation问题。

基本上两者都谈到了 Google I/O 会议中提到的类似步骤,其中一个答案中提到了链接:

  • 首先,获取GoogleClientApi 实例,例如:

    GoogleClientApi googleApiClient = new GoogleApiClient.Builder(locationActivity)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    
  • 然后像这样调用.connect():

    googleApiClient.connect();
    
  • 然后在回调onConnected中,获取最后的位置,甚至可以根据需要请求位置更新,例如:

    LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
    

    如果您想请求位置更新,则可以使用requestLocationUpdates 呼叫。

希望对你有帮助。

【讨论】:

  • 如果定期更新 GPS 位置怎么办?如果我将设置 setInterval 设置为 2000 ms,我应该如何测试?室内办公室还是室外院子?
猜你喜欢
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多