之前项目中需要集成GoogleMap定位,真是走了不少弯路,才弄懂。GoogleMap地图详细集成步骤如下:
1.首先引入依赖包
2.在创建项目时选择Google Maps Activity
Paste_Image.png要注意google_maps_api中对应的证书指纹和包名会在申请key时用到
Paste_Image.png Paste_Image.png运行时可能会遇到一些问题,详细可参看http://blog.csdn.net/sahadev_/article/details/50314141
在app的build gradle中添加如下:
使用时手机必须需要翻墙,安装Google play 商店、Google play service、Google play 框架,而且都必须是最新版本,这样才能够显示地图,但是还没有实现定位。
3.开始定位,详细代码如下:
/**
* GPS定位
*/
public class GPSFragment extends Fragment implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, OnMapReadyCallback,
LocationListener {
public static final int UPDATE_INTERVAL = 5000;
public static final int FASTEST_UPDATE_INTNERVAL = 2000;
public static final int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
private LocationRequest locationRequest;
private GoogleMap mMap;
private GoogleApiClient mGoogleApiClient;
Location myLocation;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_g, container, false);
if (mMap == null) {
SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
locationRequest = LocationRequest.create().setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY).setInterval(UPDATE_INTERVAL).setFastestInterval(FASTEST_UPDATE_INTNERVAL);
LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
if (!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
Toast.makeText(getActivity(), "Please enable GPS!", Toast.LENGTH_LONG).show();
Intent intent = new Intent(Settings.ACTION_LOCALE_SETTINGS);
startActivity(intent);
}
return v;
}
public void connect() {
if (mGoogleApiClient != null) {
mGoogleApiClient.connect();
}
}
@Override
public void onStart() {
super.onStart();
mGoogleApiClient.connect();
}
@Override
public void onStop() {
super.onStop();
mGoogleApiClient.disconnect();
}
@Override
public void onMapReady(GoogleMap googleMap) {
Log.e("onMapReady", "");
mMap = googleMap;
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
@Override
public void onConnected(Bundle bundle) {
Log.e("", "onConnected");
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
myLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (myLocation != null) {
Log.e("", "myLocation:" + myLocation);
updateToNewLocation(myLocation);
}
startLocation();
}
// 更新位置
private void updateToNewLocation(Location location) {
Log.e("updateToNewLocation", "");
if (location != null) {
double latitude = location.getLatitude();
double longitude = location.getLongitude();
Toast.makeText(getActivity(), "latitude:" + latitude + "\nlongitude:" + longitude, Toast.LENGTH_SHORT).show();
if (mMap != null) {
mMap.clear();
mMap.addMarker(new MarkerOptions().position(new LatLng(location.getLatitude(), location.getLongitude())).title("You are here"));
}
} else {
Toast.makeText(getActivity(), "Unable to get geographic information", Toast.LENGTH_SHORT).show();
}
}
//开始定位
public void startLocation() {
Log.e("", "startLocation mGoogleApiClient.isConnected():" + mGoogleApiClient.isConnected());
if (mGoogleApiClient.isConnected()) {
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient, locationRequest, this);
}
}
@Override
public void onConnectionSuspended(int i) {
}
//定位成功会回调onLocationChanged()
@Override
public void onLocationChanged(Location amapLocation) {
Log.e("", "onLocationChanged");
if (amapLocation != null) {
Log.e("", "onLocationChanged 定位成功,getLatitude:" + amapLocation.getLatitude() + ",getLongitude:" + amapLocation.getLongitude());
updateToNewLocation(amapLocation);
} else {
Log.e("", "定位失败.....");
}
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
if (connectionResult.hasResolution()) {
try {
connectionResult.startResolutionForResult(getActivity(), CONNECTION_FAILURE_RESOLUTION_REQUEST);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
} else {
new AlertDialog.Builder(getActivity()).setMessage("Connection failed.Error code:" + connectionResult.getErrorCode()).show();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CONNECTION_FAILURE_RESOLUTION_REQUEST) {
}
}
}
网友评论