Android GoogleMap定位集成

作者: 蒽香之气 | 来源:发表于2017-03-09 10:34 被阅读2765次

    之前项目中需要集成GoogleMap定位,真是走了不少弯路,才弄懂。GoogleMap地图详细集成步骤如下:
    1.首先引入依赖包

    Paste_Image.png Paste_Image.png Paste_Image.png

    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中添加如下:

    Paste_Image.png Paste_Image.png

    使用时手机必须需要翻墙,安装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) {
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:Android GoogleMap定位集成

        本文链接:https://www.haomeiwen.com/subject/slobgttx.html