Android Google地图接入(二)

前面完成了地图的显示,现在想要获取位置数据,需要使用到另一个API:Google Play services Location API。
接收位置更新基本流程:
1. 连接LocationServices;
2. 定义位置更新回调;
3. 请求位置更新
Activity代码:

import android.location.Location;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.widget.TextView;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.UiSettings;
import com.google.android.gms.maps.model.LatLng;

public class MainActivity extends FragmentActivity {
    public final String TAG = "MainActivity";
    private TextView infoTextView;
    private GoogleMap mMap;
    private GoogleApiClient mGoogleApiClient;
    private Location mLastLocation;
    private LocationRequest mLocationRequest;// 位置请求

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        infoTextView = (TextView) findViewById(R.id.information);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(onMapReadyCallback);
        // Builds single client object that connect to LocationServices
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(connectedListener)
                .addOnConnectionFailedListener(connectionFailedListener)
                .addApi(LocationServices.API)
                .build();
    }

    @Override
    protected void onStart() {
        mGoogleApiClient.connect();// 连接Google Play服务
        super.onStart();
    }

    @Override
    protected void onPause() {
        super.onPause();
        stopLocationUpdates();// 停止位置更新
    }

    @Override
    protected void onStop() {
        mGoogleApiClient.disconnect();// 断开连接
        super.onStop();
    }

    protected OnMapReadyCallback onMapReadyCallback = new OnMapReadyCallback() {
        @Override
        public void onMapReady(GoogleMap googleMap) {
            mMap = googleMap;
            mapSetting();
        }
    };

    private void mapSetting() {
        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        mMap.setMyLocationEnabled(true);
        UiSettings uiSettings = mMap.getUiSettings();
        uiSettings.setZoomControlsEnabled(true);
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(10000);
        mLocationRequest.setFastestInterval(5000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    // 客户端连接回调
    private final ConnectionCallbacks connectedListener = new ConnectionCallbacks() {
        @Override
        public void onConnectionSuspended(int arg0) {
            Log.i(TAG, "onConnectionSuspended");
        }
        @Override
        public void onConnected(Bundle arg0) {
            // 请求最后已知的位置
            mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
            LatLng mLastLatLng = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLastLatLng, 16));
            // 启动位置更新
            startLocationUpdates();
        }
    };

    private final OnConnectionFailedListener connectionFailedListener = new OnConnectionFailedListener() {
        @Override
        public void onConnectionFailed(@NonNull ConnectionResult arg0) {
            Log.e(TAG, "onConnectionFailed");
        }
    };

    // 位置监听
    private final LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            // 精确度越小越准,单位:米
            if (location.getAccuracy() > 100) {
                return;
            }
            mLastLocation = location;
            updateUI();
        }
    };

    private void updateUI() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("Accuracy :").append(mLastLocation.getAccuracy()).append("\n")
                .append("Altitude :").append(mLastLocation.getAltitude()).append("\n")
                .append("Bearing :").append(mLastLocation.getBearing()).append("\n")
                .append("ElapsedRealtimeNanos :").append(mLastLocation.getElapsedRealtimeNanos()).append("\n")
                .append("Latitude :").append(mLastLocation.getLatitude()).append("\n")
                .append("Longitude :").append(mLastLocation.getLongitude()).append("\n")
                .append("Provider :").append(mLastLocation.getProvider()).append("\n")
                .append("Speed :").append(mLastLocation.getSpeed()).append("\n")
                .append("Time :").append(mLastLocation.getTime()).append("\n");
        infoTextView.setText(stringBuilder.toString());
    }

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

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

获取位置数据:
位置数据

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值