mashmallow的Android运行时位置权限使应用程序崩溃

时间:2017-03-07 16:13:02

标签: android google-maps location android-6.0-marshmallow runtime-permissions

我正在做一个基于地图的应用程序,需要位置权限。它工作正常但问题是,当权限对话框打开时,对于Marshmallow运行时权限,然后App崩溃

这里有完整的代码:

  public class MapsActivity extends Fragment implements OnMapReadyCallback,
            GoogleApiClient.ConnectionCallbacks,
            GoogleApiClient.OnConnectionFailedListener,
            LocationListener, SensorEventListener, GoogleMap.OnMarkerClickListener {

        private GoogleMap mMap;

        GoogleApiClient mGoogleApiClient;
        Location mLastLocation;
        Marker mCurrLocationMarker;
        LocationRequest mLocationRequest;
        private ClusterManager<MyItem> mClusterManager;

       /* @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_maps);
            // Obtain the SupportMapFragment and get notified when the map is ready to be used.
            SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);
        }*/


        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.activity_maps,container,false);


            try {

                if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    checkLocationPermission();
                }
            }catch (Exception e){
                e.printStackTrace();

            }


            SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map));
            mapFragment.getMapAsync(this);
            //getAllMarkerData();
            return view;
        }

        /**
         * Manipulates the map once available.
         * This callback is triggered when the map is ready to be used.
         * This is where we can add markers or lines, add listeners or move the camera. In this case,
         * we just add a marker near Sydney, Australia.
         * If Google Play services is not installed on the device, the user will be prompted to install
         * it inside the SupportMapFragment. This method will only be triggered once the user has
         * installed Google Play services and returned to the app.
         */
        @Override
        public void onMapReady(GoogleMap googleMap) {
            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));
            mMap = googleMap;
            // mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
            if (ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                buildGoogleApiClient();
                mMap.setMyLocationEnabled(true);
                return;
            }else {
                buildGoogleApiClient();
                mMap.setMyLocationEnabled(true);
            }
            setUpClusterer();
            //mClusterManager = new ClusterManager<MyItem>(this, mMap);
            //addItems();
        }
        private void setUpClusterer() {
            // Position the map.
            // mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186, -0.126446), 10));
            // Initialize the manager with the context and the map.
            // (Activity extends context, so we can pass 'this' in the constructor.)
            mClusterManager = new ClusterManager<MyItem>(getActivity(), mMap);
            // Point the map's listeners at the listeners implemented by the cluster
            // manager.
            mMap.setOnCameraIdleListener(mClusterManager);
            mMap.setOnMarkerClickListener(mClusterManager);
            // Add cluster items (markers) to the cluster manager.
            getAllMarkerData();
        }
        private void addItems() {
            // Set some lat/lng coordinates to start with.
            double lat = 51.5145160;
            double lng = -0.1270060;
            // Add ten cluster items in close proximity, for purposes of this example.
            for (int i = 0; i < 10; i++) {
                double offset = i / 60d;
                lat = lat + offset;
                lng = lng + offset;
                MyItem offsetItem = new MyItem(lat, lng);
                mClusterManager.addItem(offsetItem);
            }
        }
        protected synchronized void buildGoogleApiClient() {
            mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
            mGoogleApiClient.connect();
        }
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {
        }
        @Override
        public void onConnected(@Nullable Bundle bundle) {
            mLocationRequest = new LocationRequest();
            mLocationRequest.setInterval(1000);
            mLocationRequest.setFastestInterval(1000);
            mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);


 if (ContextCompat.checkSelfPermission(getActivity(),
                    android.Manifest.permission.ACCESS_FINE_LOCATION)
                    == PackageManager.PERMISSION_GRANTED) {
                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
            }
        }
        @Override
        public void onConnectionSuspended(int i) {
        }
        @Override
        public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        }
        @Override
        public void onLocationChanged(Location location) {
            mLastLocation = location;
            if (mCurrLocationMarker != null) {
                mCurrLocationMarker.remove();
            }
            //Place current location marker
            LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.position(latLng);
            markerOptions.title("Current Position");
            markerOptions.icon(BitmapDescriptorFactory.
defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));
            mCurrLocationMarker = mMap.addMarker(markerOptions);
            //move map camera
            mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
            mMap.animateCamera(CameraUpdateFactory.zoomTo(11));
            //stop location updates
            if (mGoogleApiClient != null) {
                LocationServices.FusedLocationApi.
removeLocationUpdates(mGoogleApiClient, this);
            }
        }
        @Override
        public boolean onMarkerClick(Marker marker) {
            return false;
        }
        public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
        public boolean checkLocationPermission(){
            if (ContextCompat.checkSelfPermission(getActivity(),
                    android.Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {
                // Asking user if explanation is needed
                if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),

                        android.Manifest.permission.ACCESS_FINE_LOCATION))
 {

                    ActivityCompat.requestPermissions(getActivity(),
                            new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                            MY_PERMISSIONS_REQUEST_LOCATION);
                } else {
                    // No explanation needed, we can request the permission.
                    ActivityCompat.requestPermissions(getActivity(),
                            new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                            MY_PERMISSIONS_REQUEST_LOCATION);
                }
                return false;
            } else {
                return true;
            }
        }
        @Override
        public void onRequestPermissionsResult(int requestCode,
                                               String permissions[], int[] grantResults) {
            switch (requestCode) {
                case MY_PERMISSIONS_REQUEST_LOCATION: {
                    // If request is cancelled, the result arrays are empty.
                    if (grantResults.length > 0
                            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        // permission was granted. Do the
                        // contacts-related task you need to do.
                        if (ContextCompat.checkSelfPermission(getActivity(),
                                android.Manifest.permission.ACCESS_FINE_LOCATION)
                                == PackageManager.PERMISSION_GRANTED) {
                            if (mGoogleApiClient == null) {
                                buildGoogleApiClient();
                            }
                            mMap.setMyLocationEnabled(true);
                        }
                    } else {
                        // Permission denied, Disable the functionality that depends on this permission.
                        Toast.makeText(getActivity(), "permission denied", Toast.LENGTH_LONG).show();
                    }
                    return;
                }
                // other 'case' lines to check for other permissions this app might request.
                // You can add here other case statements according to your requirement.
            }
        }

        private void getAllMarkerData() {

            final ApplicationConfig service = AppClient.getApiService();
            Call<ArrayList<AllDataContent>> list = service.getAllDatas();

            list.enqueue(new Callback<ArrayList<AllDataContent>>() {
                @Override
                public void onResponse(Call<ArrayList<AllDataContent>> call, Response<ArrayList<AllDataContent>> response) {

                    if (response.isSuccessful()){
                        Toast.makeText(getActivity(),response.body().toString(), Toast.LENGTH_SHORT).show();


                        ArrayList<AllDataContent> arrayListAllDataContent = response.body();

                        for (int i = 0; i <arrayListAllDataContent.size() ; i++) {


                                arrayListAllDataContent.get(i).getLatitude();
                                arrayListAllDataContent.get(i).getLongitude();




                               Double lattitude = Double.parseDouble( arrayListAllDataContent.get(i).getLatitude());
                               Double longitude = Double.parseDouble( arrayListAllDataContent.get(i).getLongitude());

                               MyItem offsetItem = new MyItem(lattitude, longitude);
                               mClusterManager.addItem(offsetItem);

                               LatLng hospitalMarker = new LatLng(lattitude, longitude);



                           Drawable TRANSPARENT_DRAWABLE = new ColorDrawable(Color.TRANSPARENT);



                            mCurrLocationMarker = mMap.addMarker(new MarkerOptions()
                                    .position(hospitalMarker)
                                    .title(arrayListAllDataContent.get(i).getOperatorName())
                                    .snippet(arrayListAllDataContent.get(i).getAddress())
                                    .alpha(0.8f));
                                    //.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
                            mCurrLocationMarker.setTag(arrayListAllDataContent.get(i).getId());


                        }




                    }else {
                        Toast.makeText(getActivity(),"un suceess", Toast.LENGTH_SHORT).show();
                    }



                }

                @Override
                public void onFailure(Call<ArrayList<AllDataContent>> call, Throwable t) {

                    Toast.makeText(getActivity(),"error", Toast.LENGTH_SHORT).show();

                }
            });

        }

0 个答案:

没有答案