How to ask user to enable GPS at the launch of application?

前端 未结 5 775
我在风中等你
我在风中等你 2020-12-31 10:49
private void turnGPSOn(){
String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

if(!provider.contains(\"gps         


        
相关标签:
5条回答
  • 2020-12-31 10:53

    If you want something as shown in below image, follow along.

    1. Add the following dependencies in your app build.gradle

        implementation 'com.google.android.gms:play-services-location:16.0.0'
      
    2. Create the type of location request you want, we want high accuracy for GPS

        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                      .addLocationRequest(locationRequest);
      
    3. Now we need to check current state of GPS. For this, we have to use LocationServices.getSettingsClient(getActivity()).checkLocationSettings(builder.build()) This will return a Task which needs to handled asynchronously. In RESOLUTION_REQUIRED case, we ask user to give permissions, this is where we show the user prompt to enable GPS.

      Task<LocationSettingsResponse> result =
                      LocationServices.getSettingsClient(getActivity()).checkLocationSettings(builder.build());
      
      
      
      result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
                  @Override
                  public void onComplete(@NonNull Task<LocationSettingsResponse> task) {
                      try {
                          LocationSettingsResponse response = task.getResult(ApiException.class);
                          // All location settings are satisfied. The client can initialize location
                          // requests here.
                      } catch (ApiException exception) {
                          switch (exception.getStatusCode()) {
                              case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                                  // Location settings are not satisfied. But could be fixed by showing the
                                  // user a dialog.
                                  try {
                                      // Cast to a resolvable exception.
                                      ResolvableApiException resolvable = (ResolvableApiException) exception;
                                      // Show the dialog by calling startResolutionForResult(),
                                      // and check the result in onActivityResult().
                                      resolvable.startResolutionForResult(
                                              getActivity(),
                                              LocationRequest.PRIORITY_HIGH_ACCURACY);
                                  } catch (IntentSender.SendIntentException e) {
                                      // Ignore the error.
                                  } catch (ClassCastException e) {
                                      // Ignore, should be an impossible 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;
                          }
                      }
                  }
              });
      
    4. Now that we have asked user to turn on GPS, we need to check whether user allowed it or ignored it. For this, override onActivityResult. Please note that, if you're implementing above code in a fragment, result will be received in the enclosing Activity. So override onActivityResult in the Activity class.

      @Override
      public void onActivityResult(int requestCode, int resultCode, Intent data) {
      switch (requestCode) {
          case LocationRequest.PRIORITY_HIGH_ACCURACY:
              switch (resultCode) {
                  case Activity.RESULT_OK:
                      // All required changes were successfully made
                      Log.i(TAG, "onActivityResult: GPS Enabled by user");
                      break;
                  case Activity.RESULT_CANCELED:
                      // The user was asked to change settings, but chose not to
                      Log.i(TAG, "onActivityResult: User rejected GPS request");
                      break;
                  default:
                      break;
              }
              break;
          } 
      }
      

    From Android Documentation

    0 讨论(0)
  • 2020-12-31 10:56

    Image of GPS permission like Google Maps

    If you want to ask permission like shown in the above link, you can refer to my answer: https://stackoverflow.com/a/64757407/10618364

    Code is written with GoogleApi and SettingsClient API, not with deprecated GoogleClientApi and SettingsApi.

    It is also compatible with Android 11. ;)

    0 讨论(0)
  • 2020-12-31 10:57

    This is the kotlin implementation of @Ananth answer

    private fun showLocationPrompt() {
            val locationRequest = LocationRequest.create()
            locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
            val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)
    
            val result: Task<LocationSettingsResponse> = LocationServices.getSettingsClient(activity).checkLocationSettings(builder.build())
    
            result.addOnCompleteListener { task ->
                try {
                    val response = task.getResult(ApiException::class.java)
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                } catch (exception: ApiException) {
                    when (exception.statusCode) {
                        LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> {
                            try {
                                // Cast to a resolvable exception.
                                val resolvable: ResolvableApiException = exception as ResolvableApiException
                                // Show the dialog by calling startResolutionForResult(),
                                // and check the result in onActivityResult().
                                resolvable.startResolutionForResult(
                                    activity, LocationRequest.PRIORITY_HIGH_ACCURACY
                                )
                            } catch (e: IntentSender.SendIntentException) {
                                // Ignore the error.
                            } catch (e: ClassCastException) {
                                // Ignore, should be an impossible error.
                            }
                        }
                        LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> {
                            // Location settings are not satisfied. But could be fixed by showing the
                            // user a dialog.
    
                            // Location settings are not satisfied. However, we have no way to fix the
                            // settings so we won't show the dialog.
                        }
                    }
                }
            }
        }
    
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
            super.onActivityResult(requestCode, resultCode, data)
            when (requestCode) {
                LocationRequest.PRIORITY_HIGH_ACCURACY -> {
                    if (resultCode == Activity.RESULT_OK) {
                        Log.e("Status: ","On")
                    } else {
                        Log.e("Status: ","Off")
                    }
                }
            }
        }
    
    0 讨论(0)
  • 2020-12-31 10:57

    use SettingsApi if you not want to force user to go settings page to enable gps. here the link of how to use SettingsApi SettingsApi

    0 讨论(0)
  • 2020-12-31 11:09
    public void showSettingAlert()
        {
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
            alertDialog.setTitle("GPS setting!");
            alertDialog.setMessage("GPS is not enabled, Do you want to go to settings menu? ");
            alertDialog.setPositiveButton("Setting", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    context.startActivity(intent);
                }
            });
            alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            alertDialog.show();
        }
    
    0 讨论(0)
提交回复
热议问题