Android Google Map学习二(接受位置更新信息)

一、接收位置更新

  当应用需要跟踪用户足迹,记录用户在不同时间的位置时,就需要周期的从fused location provider获取位置信息。这时就需要调用requestLocationUpdates()这个函数。这个函数需要在与Google Play Services连接成功后调用。
  

@Override
public void onConnected(Bundle connectionHint) {
    ...
    if (mRequestingLocationUpdates) {
        startLocationUpdates();
    }
}

protected void startLocationUpdates() {
    LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleApiClient, mLocationRequest, this);
}

  public abstract PendingResult requestLocationUpdates (GoogleApiClient client, LocationRequest request, LocationListener listener)。

  1. 参数client:GoogleAPIClient实例,参考Android Google Map学习一
  2. 参数request:位置请求对象,包含位置请求间隔时间、优先级等请求基本参数。

      创建对象代码如下:
      

protected void createLocationRequest() {
    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(10000);
    mLocationRequest.setFastestInterval(5000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
  • setInterval():设置位置请求间隔,请求间隔以毫秒为单位,这个间隔是个大致间隔,当有其他应用设置的请求间隔比这个间隔小时,此应用收到的位置更新会加快。位置更新也有可能会比设置的间隔更慢。附:为了使地图应用位置实时更新,建议设置间隔在5000ms。
  • setFastestInterval():设置最快请求时间间隔,应用设置的间隔时间会相互影响,通过这个函数这是本应用最快处理位置信息的时间间隔。如果不设置,当更新频率过快时,会影响UI的刷新。
  • setPriority():设置请求优先级,Google Play Services根据优先级的设置判断该用哪个位置服务来源。
    A. PRIORITY_BALANCED_POWER_ACCURACY:这个参数精度在100m左右,是城市级别的精度范围,一般采用wifi或电话运营商。
    B. PRIORITY_HIGH_ACCURACY:这个参数精度最高,一般是采用GPS定位。这个参数需要配合Androidmanifest.xml中定义的ACCESS_FINE_LOCATION权限使用。
    C. PRIORITY_LOW_POWER:这个精度在10km左右
    D. PRIORITY_NO_POWER:这个参数表明当必要时才接受位置更新,此应用不会主动触发更新,但可以接收其他应用触发的位置更新。
    1. 参数listener:位置更新监听者(接口),当接收到位置更新时,会触发函数onLocationChanged(Location location),从location中获取更新的位置信息。示例代码如下:
public class MainActivity extends ActionBarActivity implements
        ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
    ...
    @Override
    public void onLocationChanged(Location location) {
        mCurrentLocation = location;
        mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
        updateUI();
    }

    private void updateUI() {
        mLatitudeTextView.setText(String.valueOf(mCurrentLocation.getLatitude()));
        mLongitudeTextView.setText(String.valueOf(mCurrentLocation.getLongitude()));
        mLastUpdateTimeTextView.setText(mLastUpdateTime);
    }
}

二、停止更新

想要停止位置更新,需要调用removeLocationUpdates(),传递GoogleAPIClient对象和LocationListener对象。

@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates();
}

protected void stopLocationUpdates() {
    LocationServices.FusedLocationApi.removeLocationUpdates(
            mGoogleApiClient, this);
}

三、状态还原

  当设备配置变化时(横屏切换、语言切换等),Activity会销毁重新创建,这时如果需要保存位置状态等信息,需要在onSaveInstanceState()中设置:

public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY,
            mRequestingLocationUpdates);
    savedInstanceState.putParcelable(LOCATION_KEY, mCurrentLocation);
    savedInstanceState.putString(LAST_UPDATED_TIME_STRING_KEY, mLastUpdateTime);
    super.onSaveInstanceState(savedInstanceState);
}

当需要还原变化状态时,需要在onCreate函数中还原:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    updateValuesFromBundle(savedInstanceState);
}

private void updateValuesFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        // Update the value of mRequestingLocationUpdates from the Bundle, and
        // make sure that the Start Updates and Stop Updates buttons are
        // correctly enabled or disabled.
        if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
            mRequestingLocationUpdates = savedInstanceState.getBoolean(
                    REQUESTING_LOCATION_UPDATES_KEY);
            setButtonsEnabledState();
        }

        // Update the value of mCurrentLocation from the Bundle and update the
        // UI to show the correct latitude and longitude.
        if (savedInstanceState.keySet().contains(LOCATION_KEY)) {
            // Since LOCATION_KEY was found in the Bundle, we can be sure that
            // mCurrentLocationis not null.
            mCurrentLocation = savedInstanceState.getParcelable(LOCATION_KEY);
        }

        // Update the value of mLastUpdateTime from the Bundle and update the UI.
        if (savedInstanceState.keySet().contains(LAST_UPDATED_TIME_STRING_KEY)) {
            mLastUpdateTime = savedInstanceState.getString(
                    LAST_UPDATED_TIME_STRING_KEY);
        }
        updateUI();
    }
}

另状态的保存也可以用SharePerferences。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 应用程序中使用 Google 地图进行定位,可以使用 Google Play Services SDK 提供的 Location APIs。首先,确保你的应用程序已经在 AndroidManifest.xml 文件中声明了使用定位权限: ``` <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ``` 然后,在你的代码中使用以下步骤: 1. 检查设备上是否安装了 Google Play Services,如果没有则提示用户安装。 2. 创建 GoogleApiClient 实例并连接到 Google Play Services。 3. 实现 LocationListener 接口并注册位置更新监听器。 4. 请求位置更新。 以下是示例代码: ```java public class MapsActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { private GoogleMap mMap; private GoogleApiClient mGoogleApiClient; private LocationRequest mLocationRequest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); // 检查 Google Play Services 是否可用 int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()); if (status != ConnectionResult.SUCCESS) { Toast.makeText(getApplicationContext(), "Google Play Services Not Available", Toast.LENGTH_LONG).show(); finish(); } // 创建 GoogleApiClient 实例 mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); // 创建 LocationRequest 实例 mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(10000); // 定位更新间隔 mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); } @Override protected void onStart() { super.onStart(); mGoogleApiClient.connect(); } @Override protected void onStop() { super.onStop(); if (mGoogleApiClient.isConnected()) { mGoogleApiClient.disconnect(); } } @Override public void onConnected(Bundle bundle) { // 连接到 Google Play Services 成功 LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } @Override public void onConnectionSuspended(int i) { // 连接中断 } @Override public void onConnectionFailed(ConnectionResult connectionResult) { // 连接失败 } @Override public void onLocationChanged(Location location) { // 收到位置更新 mMap.clear(); LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); mMap.addMarker(new MarkerOptions().position(latLng).title("Current Location")); mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); mMap.animateCamera(CameraUpdateFactory.zoomTo(15)); } } ``` 注意:在使用此代码之前,需要在项目中添加 Google Play Services SDK 和 Google Maps API。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值