Android: Check if Location Services Enabled using Fused Location Provider

前端 未结 5 660
囚心锁ツ
囚心锁ツ 2021-01-31 10:59

According to the Android documentation:

The Google Location Services API, part of Google Play Services, provides a more powerful, high-level framework t

相关标签:
5条回答
  • 2021-01-31 11:18

    If use FusedLocationProviderClient, first we need check Location is enabled in device.

    private fun isLocationEnabled(): Boolean {
        val activity: Activity? = this.activity
        val lm = activity?.getSystemService(Context.LOCATION_SERVICE) as? LocationManager
        if (lm != null) {
            val enabled = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                lm.isLocationEnabled
            } else {
                lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
                        || lm.isProviderEnabled(LocationManager.GPS_PROVIDER)
            }
            Log.d(TAG, "isLocationServiceEnabled", enabled)
            return enabled
        }
        return false
    }
    

    And then, check LocationSettings.

    val request = LocationRequest.create()
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
    
    val settingRequest = LocationSettingsRequest.Builder()
            .addLocationRequest(request)
            .build()
    // check Location settings for the request
    LocationServices.getSettingsClient(context)
            .checkLocationSettings(settingRequest)
            .addOnSuccessListener {
                // OK!!
                // fusedLocationProviderClient.requestLocationUpdates
            }
            .addOnFailureListener {  exception ->
                if (exception  is ResolvableApiException) {
                    try {
                        exception.startResolutionForResult(activity, RC_LOCATION_SETTINGS)
                    } catch (ex: IntentSender.SendIntentException) {
                        // ignore
                    }
                } else {
                    // handle other errors
                    showFusedDisabledDialog()
                }
            }
    

    also, please check below link.

    https://developer.android.com/training/location/change-location-settings

    0 讨论(0)
  • 2021-01-31 11:21

    This android developer training tutorial could help - here's the basics:

    Code to run in your Activity onCreate():

     // Create an instance of GoogleAPIClient.
        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
        }
    
        mGoogleApiClient.connect();
    
        LocationRequest mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(10000);
        mLocationRequest.setFastestInterval(5000);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(mLocationRequest);
    
        PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
    
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(LocationSettingsResult locationSettingsResult) {
    
                final Status status = locationSettingsResult.getStatus();
                final LocationSettingsStates LS_state = locationSettingsResult.getLocationSettingsStates();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        // All location settings are satisfied. The client can initialize location
                        // requests here.
    
                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        // Location settings are not satisfied. But could be fixed by showing the user
                        // a dialog.
                        try {
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            status.startResolutionForResult(LocationByGPS.this, REQUEST_CHECK_SETTINGS);
    
                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        // Location settings are not satisfied. However, we have no way to fix the
                        // settings so we won't show the dialog.
    
                        break;
                }
            }
        });
    

    Override this Method:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
        switch (requestCode) {
            case REQUEST_CHECK_SETTINGS:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        // All required changes were successfully made
                        GetUserLocation();//FINALLY YOUR OWN METHOD TO GET YOUR USER LOCATION HERE
                        break;
                    case Activity.RESULT_CANCELED:
                        // The user was asked to change settings, but chose not to
    
                        break;
                    default:
                        break;
                }
                break;
        }
    }
    

    Remember to Implement these in your class:

    public class MyClass extends AppCompatActivity implements
        ActivityCompat.OnRequestPermissionsResultCallback,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener{
    
      protected static final int REQUEST_CHECK_SETTINGS = 0x1;
    
    
      /* 
         your code i.e. with the above code etc....
     */
    
     }
    

    Good explanation here in this Google developer link.

    Cheers!

    0 讨论(0)
  • 2021-01-31 11:28

    See SettingsApi: check your location request then ensure that the device's system settings are properly configured for the app's location needs.

    0 讨论(0)
  • 2021-01-31 11:31

    As now in 2020

    Latest , Best and shortest way is

        public boolean isLocationEnabled()
        {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    // This is new method provided in API 28
                        LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
                        return lm.isLocationEnabled();
                    } else {
    // This is Deprecated in API 28
                        int mode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE,
                                Settings.Secure.LOCATION_MODE_OFF);
                        return  (mode != Settings.Secure.LOCATION_MODE_OFF);
    
                    }
        }
    
    0 讨论(0)
  • 2021-01-31 11:31

    You can also check like this:

    LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
    boolean isEnabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER);
    
    0 讨论(0)
提交回复
热议问题