Android check permission for LocationManager

后端 未结 6 805
我寻月下人不归
我寻月下人不归 2020-11-28 01:35

I\'m trying to get the GPS coordinates to display when I click a button in my activity layout. The following is the method that gets called when I click the button:

6条回答
  •  一整个雨季
    2020-11-28 02:01

    With Android API level (23), we are required to check for permissions. https://developer.android.com/training/permissions/requesting.html

    I had your same problem, but the following worked for me and I am able to retrieve Location data successfully:

    (1) Ensure you have your permissions listed in the Manifest:

    
    
    

    (2) Ensure you request permissions from the user:

    if ( ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) {
    
                ActivityCompat.requestPermissions( this, new String[] {  android.Manifest.permission.ACCESS_COARSE_LOCATION  },
                                                    LocationService.MY_PERMISSION_ACCESS_COURSE_LOCATION );
            }
    

    (3) Ensure you use ContextCompat as this has compatibility with older API levels.

    (4) In your location service, or class that initializes your LocationManager and gets the last known location, we need to check the permissions:

    if ( Build.VERSION.SDK_INT >= 23 &&
                 ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
                 ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return  ;
            }
    

    (5) This approach only worked for me after I included @TargetApi(23) at the top of my initLocationService method.

    (6) I also added this to my gradle build:

    compile 'com.android.support:support-v4:23.0.1'
    

    Here is my LocationService for reference:

    public class LocationService implements LocationListener  {
    
        //The minimum distance to change updates in meters
        private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; // 10 meters
    
        //The minimum time between updates in milliseconds
        private static final long MIN_TIME_BW_UPDATES = 0;//1000 * 60 * 1; // 1 minute
    
        private final static boolean forceNetwork = false;
    
        private static LocationService instance = null;
    
        private LocationManager locationManager;
        public Location location;
        public double longitude;
        public double latitude; 
    
    
        /**
         * Singleton implementation
         * @return
         */
        public static LocationService getLocationManager(Context context)     {
            if (instance == null) {
                instance = new LocationService(context);
            }
            return instance;
        }
    
        /**
         * Local constructor
         */
        private LocationService( Context context )     {
    
            initLocationService(context); 
            LogService.log("LocationService created");
        }
    
    
    
        /**
         * Sets up location service after permissions is granted
         */
        @TargetApi(23)
        private void initLocationService(Context context) {
    
    
            if ( Build.VERSION.SDK_INT >= 23 &&
                 ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED &&
                 ContextCompat.checkSelfPermission( context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return  ;
            }
    
            try   {
                this.longitude = 0.0;
                this.latitude = 0.0;
                this.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    
                // Get GPS and network status
                this.isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                this.isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
                if (forceNetwork) isGPSEnabled = false;
    
                if (!isNetworkEnabled && !isGPSEnabled)    {
                    // cannot get location
                    this.locationServiceAvailable = false;
                }
                //else
                {
                    this.locationServiceAvailable = true;
    
                    if (isNetworkEnabled) {
                        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        if (locationManager != null)   {
                            location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                            updateCoordinates();
                        }
                    }//end if
    
                    if (isGPSEnabled)  {
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
    
                        if (locationManager != null)  {
                            location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            updateCoordinates();
                        }
                    }
                }
            } catch (Exception ex)  {
                LogService.log( "Error creating location service: " + ex.getMessage() );
    
            }
        }       
    
    
        @Override
        public void onLocationChanged(Location location)     {
            // do stuff here with location object 
        }
    }
    

    I tested with an Android Lollipop device so far only. Hope this works for you.

提交回复
热议问题