下面列出了android.content.IntentSender.SendIntentException#com.google.android.gms.location.LocationSettingsStatusCodes 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public void onResult(LocationSettingsResult result) {
final Status status = result.getStatus();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
// All location settings are satisfied -> nothing to do
callSuccessCallback();
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. Show the user a dialog to upgrade location settings
try {
// Show the dialog by calling startResolutionForResult(), and check the result
status.startResolutionForResult(mActivity, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "PendingIntent unable to execute request.", e);
callErrorCallback();
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Log.e(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog not created.");
callErrorCallback();
break;
}
}
@Override
public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
final Status status = locationSettingsResult.getStatus();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
Log.i(TAG, "All location settings are satisfied.");
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to upgrade location settings ");
try {
// Show the dialog by calling startResolutionForResult(), and check the result
// in onActivityResult().
status.startResolutionForResult(getActivity(), REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException e) {
Log.i(TAG, "PendingIntent unable to execute request.");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog not created.");
break;
}
}
/**
* Initiate location updates.
*/
private void initiateLocationUpdates() {
// Set wrapper and coordinates visible (if it wasn't already).
toggleLocationVisibilities(true);
mSettingsClient
.checkLocationSettings(mLocationSettingsRequest)
.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@SuppressLint("MissingPermission")
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
//noinspection MissingPermission
mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
updateLocationUI();
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult(BasePlatformCreate.this, REQUEST_CHECK_LOCATION_SETTINGS);
}
catch (IntentSender.SendIntentException sie) {
Toast.makeText(getApplicationContext(), getString(R.string.location_intent_error), Toast.LENGTH_SHORT).show();
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Toast.makeText(getApplicationContext(), getString(R.string.location_settings_error), Toast.LENGTH_LONG).show();
}
}
});
}
private void startLocationUpdates() {
mRequestingLocationUpdates = true;
mSettingsClient.checkLocationSettings(mLocationSettingsRequest)
.addOnSuccessListener((Activity) context, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
Log.i(TAG, "All location settings are satisfied.");
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions();
return;
}
mFusedLocationClient.requestLocationUpdates(mLocationRequest,
mLocationCallback, Looper.myLooper());
}
})
.addOnFailureListener((Activity) context, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " +
"location settings ");
try {
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult((Activity) context, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sie) {
Log.i(TAG, "PendingIntent unable to execute request.");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
String errorMessage = "Location settings are inadequate, and cannot be " +
"fixed here. Fix in Settings.";
Log.e(TAG, errorMessage);
Toast.makeText(context, errorMessage, Toast.LENGTH_LONG).show();
mRequestingLocationUpdates = false;
}
}
});
}
private void setupLocationService() {
Log.v(TAG, "Setting up location service");
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(getLocationRequest());
SettingsClient client = LocationServices.getSettingsClient(activity);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
task.addOnSuccessListener(activity, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
Log.v(TAG, "Location settings satisfied");
}
});
task.addOnFailureListener(activity, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case CommonStatusCodes.RESOLUTION_REQUIRED:
Log.w(TAG, "Location settings not satisfied, attempting resolution intent");
try {
ResolvableApiException resolvable = (ResolvableApiException) e;
resolvable.startResolutionForResult(activity, REQUEST_CODE_LOCATION_SETTINGS);
} catch (IntentSender.SendIntentException sendIntentException) {
Log.e(TAG, "Unable to start resolution intent");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Log.w(TAG, "Location settings not satisfied and can't be changed");
break;
}
}
});
}
private void startLocationUpdates() {
Log.i(TAG, "startLocationUpdates");
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(@NonNull LocationSettingsResult locationSettingsResult) {
final Status status = locationSettingsResult.getStatus();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
// 設定が有効になっているので現在位置を取得する
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, MainActivity.this);
}
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// 設定が有効になっていないのでダイアログを表示する
try {
status.startResolutionForResult(MainActivity.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;
}
}
});
}
private void createLocationRequestForResult(){
mLocationRequestBalancedPowerAccuracy = new LocationRequest();
final LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequestBalancedPowerAccuracy)
.setAlwaysShow(true);
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
@Override
public void onResult(LocationSettingsResult locationSettingsResult) {
Log.v("BLE", locationSettingsResult.getStatus().getStatusMessage());
LocationSettingsStates states = locationSettingsResult.getLocationSettingsStates();
if(states.isLocationUsable()) {
checkForLocationPermissionsAndScan();
return;
}
final Status status = locationSettingsResult.getStatus();
switch(status.getStatusCode()){
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
mLocationServicesRequestApproved = false;
try {
status.startResolutionForResult(MainActivity.this, REQUEST_LOCATION_SERVICES);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
break;
case LocationSettingsStatusCodes.SUCCESS:
mLocationServicesRequestApproved = true;
checkForLocationPermissionsAndScan();
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
showPermissionRationaleFragment(R.string.rationale_location_cancel_message, 0);
break;
}
}
});
}
@Override
public void onConnected(Bundle bundle) {
wasConnectedToPlayServices = true;
try {
if (Build.VERSION.SDK_INT >= 21) {
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
result.setResultCallback(locationSettingsResult -> {
final Status status = locationSettingsResult.getStatus();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
startFusedLocationRequest(true);
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
Utilities.stageQueue.postRunnable(() -> {
if (lookingForPeopleNearby || !sharingLocations.isEmpty()) {
AndroidUtilities.runOnUIThread(() -> getNotificationCenter().postNotificationName(NotificationCenter.needShowPlayServicesAlert, status));
}
});
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Utilities.stageQueue.postRunnable(() -> {
playServicesAvailable = false;
try {
googleApiClient.disconnect();
start();
} catch (Throwable ignore) {
}
});
break;
}
});
} else {
startFusedLocationRequest(true);
}
} catch (Throwable e) {
FileLog.e(e);
}
}
@Override
protected void onStart() {
super.onStart();
// Check if we have permission to access high accuracy fine location.
int permission = ActivityCompat.checkSelfPermission(this,
ACCESS_FINE_LOCATION);
// If permission is granted, fetch the last location.
if (permission == PERMISSION_GRANTED) {
getLastLocation();
} else {
// If permission has not been granted, request permission.
ActivityCompat.requestPermissions(this,
new String[]{ACCESS_FINE_LOCATION},
LOCATION_PERMISSION_REQUEST);
}
// Check of the location settings are compatible with our Location Request.
LocationSettingsRequest.Builder builder =
new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest);
SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
task.addOnSuccessListener(this,
new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse
locationSettingsResponse) {
// Location settings satisfy the requirements of the Location Request.
// Request location updates.
requestLocationUpdates();
}
});
task.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Extract the status code for the failure from within the Exception.
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case CommonStatusCodes.RESOLUTION_REQUIRED:
try {
// Display a user dialog to resolve the location settings
// issue.
ResolvableApiException resolvable = (ResolvableApiException) e;
resolvable.startResolutionForResult(WhereAmIActivity.this,
REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sendEx) {
Log.e(TAG, "Location Settings resolution failed.", sendEx);
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings issues can't be resolved by user.
// Request location updates anyway.
Log.d(TAG, "Location Settings can't be resolved.");
requestLocationUpdates();
break;
}
}
});
}
private void listing15_10_11_12() {
LocationRequest request =
new LocationRequest()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(5000); // Update every 5 seconds.
// Listing 15-10: Check if the current Location Settings satisfy your requirements
// Get the settings client.
SettingsClient client = LocationServices.getSettingsClient(this);
// Create a new Location Settings Request, adding our Location Requests
LocationSettingsRequest.Builder builder =
new LocationSettingsRequest.Builder().addLocationRequest(request);
// Check if the Location Settings satisfy our requirements.
Task<LocationSettingsResponse> task =
client.checkLocationSettings(builder.build());
// Listing 15-11: Create a handler for when Location Settings satisfy your requirements
task.addOnSuccessListener(this,
new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
// Location settings satisfy the requirements of the Location Request
startTrackingLocation();
}
});
// Listing 15-12: Request user changes to location settings
task.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Extract the status code for the failure from within the Exception.
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case CommonStatusCodes.RESOLUTION_REQUIRED:
// Location settings don't satisfy the requirements of the
// Location Request, but they could be resolved through user
// selection within a Dialog.
try {
// Display a user dialog to resolve the location settings issue.
ResolvableApiException resolvable = (ResolvableApiException) e;
resolvable.startResolutionForResult(LocationActivity.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sendEx) {
Log.e(TAG, "Location Settings resolution failed.", sendEx);
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings don't satisfy the requirements of the
// Location Request, however it can't be resolved with a user
// dialog.
// TODO Start monitoring location updates anyway, or abort.
break;
default: break;
}
}
});
}
@Override
protected void onStart() {
super.onStart();
// Check if we have permission to access high accuracy fine location.
int permission = ActivityCompat.checkSelfPermission(this,
ACCESS_FINE_LOCATION);
// If permission is granted, fetch the last location.
if (permission == PERMISSION_GRANTED) {
getLastLocation();
} else {
// If permission has not been granted, request permission.
ActivityCompat.requestPermissions(this,
new String[]{ACCESS_FINE_LOCATION},
LOCATION_PERMISSION_REQUEST);
}
// Check of the location settings are compatible with our Location Request.
LocationSettingsRequest.Builder builder =
new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest);
SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
task.addOnSuccessListener(this,
new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse
locationSettingsResponse) {
// Location settings satisfy the requirements of the Location Request.
// Request location updates.
requestLocationUpdates();
}
});
task.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Extract the status code for the failure from within the Exception.
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case CommonStatusCodes.RESOLUTION_REQUIRED:
try {
// Display a user dialog to resolve the location settings
// issue.
ResolvableApiException resolvable = (ResolvableApiException) e;
resolvable.startResolutionForResult(WhereAmIActivity.this,
REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sendEx) {
Log.e(TAG, "Location Settings resolution failed.", sendEx);
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings issues can't be resolved by user.
// Request location updates anyway.
Log.d(TAG, "Location Settings can't be resolved.");
requestLocationUpdates();
break;
}
}
});
}
@Override
protected void onStart() {
super.onStart();
// Check if we have permission to access high accuracy fine location.
int permission = ActivityCompat.checkSelfPermission(this,
ACCESS_FINE_LOCATION);
// If permission is granted, fetch the last location.
if (permission == PERMISSION_GRANTED) {
getLastLocation();
} else {
// If permission has not been granted, request permission.
ActivityCompat.requestPermissions(this,
new String[]{ACCESS_FINE_LOCATION},
LOCATION_PERMISSION_REQUEST);
}
// Check of the location settings are compatible with our Location Request.
LocationSettingsRequest.Builder builder =
new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest);
SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
task.addOnSuccessListener(this,
new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse
locationSettingsResponse) {
// Location settings satisfy the requirements of the Location Request.
// Request location updates.
requestLocationUpdates();
}
});
task.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Extract the status code for the failure from within the Exception.
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case CommonStatusCodes.RESOLUTION_REQUIRED:
try {
// Display a user dialog to resolve the location settings
// issue.
ResolvableApiException resolvable = (ResolvableApiException) e;
resolvable.startResolutionForResult(WhereAmIActivity.this,
REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sendEx) {
Log.e(TAG, "Location Settings resolution failed.", sendEx);
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings issues can't be resolved by user.
// Request location updates anyway.
Log.d(TAG, "Location Settings can't be resolved.");
requestLocationUpdates();
break;
}
}
});
}
@Override
protected void onStart() {
super.onStart();
// Check if we have permission to access high accuracy fine location.
int permission = ActivityCompat.checkSelfPermission(this,
ACCESS_FINE_LOCATION);
// If permission is granted, fetch the last location.
if (permission == PERMISSION_GRANTED) {
getLastLocation();
} else {
// If permission has not been granted, request permission.
ActivityCompat.requestPermissions(this,
new String[]{ACCESS_FINE_LOCATION},
LOCATION_PERMISSION_REQUEST);
}
// Check of the location settings are compatible with our Location Request.
LocationSettingsRequest.Builder builder =
new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest);
SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
task.addOnSuccessListener(this,
new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse
locationSettingsResponse) {
// Location settings satisfy the requirements of the Location Request.
// Request location updates.
requestLocationUpdates();
}
});
task.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Extract the status code for the failure from within the Exception.
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case CommonStatusCodes.RESOLUTION_REQUIRED:
try {
// Display a user dialog to resolve the location settings
// issue.
ResolvableApiException resolvable = (ResolvableApiException) e;
resolvable.startResolutionForResult(WhereAmIActivity.this,
REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sendEx) {
Log.e(TAG, "Location Settings resolution failed.", sendEx);
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings issues can't be resolved by user.
// Request location updates anyway.
Log.d(TAG, "Location Settings can't be resolved.");
requestLocationUpdates();
break;
}
}
});
}
@Override
protected void onGoogleApiClientReady(GoogleApiClient apiClient, SingleEmitter<Boolean> emitter) {
emitterWeakRef = new WeakReference<>(emitter);
setupLocationPendingResult(
LocationServices.SettingsApi.checkLocationSettings(apiClient, locationSettingsRequest),
result -> {
Status status = result.getStatus();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
// All location settings are satisfied. The client can initialize location
// requests here.
emitter.onSuccess(true);
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the user
// a dialog.
if (context != null) {
String observableId = UUID.randomUUID().toString();
observableMap.put(observableId, new WeakReference<>(SettingsCheckHandleSingleOnSubscribe.this));
Intent intent = new Intent(context, LocationSettingsActivity.class);
intent.putExtra(LocationSettingsActivity.ARG_STATUS, status);
intent.putExtra(LocationSettingsActivity.ARG_ID, observableId);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
} else {
emitter.onSuccess(false);
}
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.
emitter.onSuccess(false);
break;
default:
emitter.onError(new StatusException(result));
break;
}
}
);
}
/**
* Requests location updates from the FusedLocationApi. Note: we don't call this unless location
* runtime permission has been granted.
*/
private void startLocationUpdates() {
// Begin by checking if the device has the necessary location settings.
mSettingsClient.checkLocationSettings(mLocationSettingsRequest)
.addOnSuccessListener(getAppCompatActivity(), new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
Log.i(TAG, "All location settings are satisfied.");
//noinspection MissingPermission
if (checkPermissions()) {
mMap.setMyLocationEnabled(true);
mFusedLocationClient.requestLocationUpdates(mLocationRequest,
mLocationCallback, Looper.myLooper());
}
}
})
.addOnFailureListener(getAppCompatActivity(), new OnFailureListener() {
@Override
public void onFailure(@android.support.annotation.NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " +
"location settings ");
try {
// Show the dialog by calling startResolutionForResult(), and check the
// result in onActivityResult().
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult(getActivity(), REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sie) {
Log.i(TAG, "PendingIntent unable to execute request.");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
String errorMessage = "Location settings are inadequate, and cannot be " +
"fixed here. Fix in Settings.";
Log.e(TAG, errorMessage);
displayError(errorMessage);
}
}
});
}
@Override
public void call(AsyncEmitter<Void> locationAsyncEmitter) {
GoogleApiClient.OnConnectionFailedListener onConnectionFailedListener = connectionResult ->
locationAsyncEmitter.onError(new LocationUnavailableException("Failed to connect to Google Play Services!"));
ResultCallback<LocationSettingsResult> pendingResultCallback = locationSettingsResult -> {
Status status = locationSettingsResult.getStatus();
if (status.getStatusCode() == LocationSettingsStatusCodes.SUCCESS) {
locationAsyncEmitter.onCompleted();
} else {
locationAsyncEmitter.onError(new LocationUnavailableException("Location services not enabled!"));
}
};
GoogleApiClient.ConnectionCallbacks connectionCallbacks = new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(@Nullable Bundle bundle) {
try {
LocationRequest request = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(request)
.setAlwaysShow(true);
PendingResult<LocationSettingsResult> result =
LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build());
result.setResultCallback(pendingResultCallback);
} catch (SecurityException e) {
locationAsyncEmitter.onError(new LocationUnavailableException("Location permission not available?"));
}
}
@Override
public void onConnectionSuspended(int i) {
locationAsyncEmitter.onError(new LocationUnavailableException("Connection lost to Google Play Services"));
}
};
googleApiClient.registerConnectionCallbacks(connectionCallbacks);
googleApiClient.registerConnectionFailedListener(onConnectionFailedListener);
googleApiClient.connect();
locationAsyncEmitter.setCancellation(() -> {
googleApiClient.unregisterConnectionCallbacks(connectionCallbacks);
googleApiClient.unregisterConnectionFailedListener(onConnectionFailedListener);
});
}
private void setGoogleClient(){
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setInterval(30 * 1000);
mLocationRequest.setFastestInterval(5 * 1000);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest);
//**************************
builder.setAlwaysShow(true); //this is the key ingredient
//**************************
Task<LocationSettingsResponse> result =
LocationServices.getSettingsClient(context).checkLocationSettings( builder.build());
result.addOnFailureListener((Activity) context, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
if (statusCode
== LocationSettingsStatusCodes
.RESOLUTION_REQUIRED) {
// Location settings are not satisfied, but this can
// be fixed by showing the user a dialog
try {
// Show the dialog by calling
// startResolutionForResult(), and check the
// result in onActivityResult()
ResolvableApiException resolvable =
(ResolvableApiException) e;
resolvable.startResolutionForResult
((Activity) context,
REQUEST_CODE);
} catch (IntentSender.SendIntentException sendEx) {
// Ignore the error
}
}
}
});
result.addOnSuccessListener((Activity) context, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
startLocationUpdates();
}
});
}
private void continueAcquiringLocations() {
// Start location services
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(POLLING_FREQ);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_FREQ);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest);
// Used if needed to turn on settings related to location services
SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
// All location settings are satisfied. The client can initialize location requests here.
if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
mLocationCallback = getLocationCallback();
mLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, null);
// Schedule a runnable to stop location updates after a period of time
Executors.newScheduledThreadPool(1).schedule(new Runnable() {
@Override
public void run() {
mLocationClient.removeLocationUpdates(mLocationCallback);
}
}, MEASURE_TIME, TimeUnit.MILLISECONDS);
}
}
});
task.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case CommonStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied, but this can be fixed
// by showing the user a dialog.
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
ResolvableApiException resolvable = (ResolvableApiException) e;
resolvable.startResolutionForResult(LocationGetLocationActivity.this,
REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sendEx) {
// 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;
}
}
});
}
/**
* Requests location updates from the FusedLocationApi. Note: we don't call this unless location
* runtime permission has been granted.
*/
private void startLocationUpdates() {
// Begin by checking if the device has the necessary location settings.
mSettingsClient.checkLocationSettings(mLocationSettingsRequest)
.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
Log.i(TAG, "All location settings are satisfied.");
//noinspection MissingPermission
mFusedLocationClient.requestLocationUpdates(mLocationRequest,
mLocationCallback, Looper.myLooper());
updateUI();
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
int statusCode = ((ApiException) e).getStatusCode();
switch (statusCode) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " +
"location settings ");
try {
// Show the dialog by calling startResolutionForResult(), and check the
// result in onActivityResult().
ResolvableApiException rae = (ResolvableApiException) e;
rae.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sie) {
Log.i(TAG, "PendingIntent unable to execute request.");
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
String errorMessage = "Location settings are inadequate, and cannot be " +
"fixed here. Fix in Settings.";
Log.e(TAG, errorMessage);
Toast.makeText(MainActivity.this, errorMessage, Toast.LENGTH_LONG).show();
mRequestingLocationUpdates = false;
}
updateUI();
}
});
}