前面完成了地图的显示,现在想要获取位置数据,需要使用到另一个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);
}
}
获取位置数据: