查找位置:Google Play 位置服务或 Android 平台位置 API

Posted

技术标签:

【中文标题】查找位置:Google Play 位置服务或 Android 平台位置 API【英文标题】:Finding Location : Google Play Location Service or Android platform location APIs 【发布时间】: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 提供程序在室内无法正常工作...它在室外正常工作... 【参考方案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 个很好的来源:

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

    回答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,我应该如何测试?室内办公室还是室外院子?

以上是关于查找位置:Google Play 位置服务或 Android 平台位置 API的主要内容,如果未能解决你的问题,请参考以下文章

是否需要 Google Play 服务才能在 Android 手机上查找当前 gps 位置?

Google Play 服务或 Android 定位服务

使用 google play 服务在 Xamarin 中获取用户位置

使用Google Play服务位置API来监听位置服务更新

Google Play 服务 - 当前位置

Google (Play) 睡眠模式下的位置服务更新间隔更改 (Android)