Skip to content

Instantly share code, notes, and snippets.

@aaronj1335
Created June 13, 2017 19:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aaronj1335/8b5d00b83ab935fc76f70f3a4db43964 to your computer and use it in GitHub Desktop.
Save aaronj1335/8b5d00b83ab935fc76f70f3a4db43964 to your computer and use it in GitHub Desktop.
package com.bontouch.testlocationbug;
import android.Manifest;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.LocationAvailability;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResult;
import com.google.android.gms.location.LocationSettingsStatusCodes;
public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private static final int REQUEST_LOCATION = 1;
public static final int REQUEST_CODE_SETTINGS = 0x02;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mLocationRequest = new LocationRequest()
.setNumUpdates(1)
.setFastestInterval(5000)
.setInterval(5000)
.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
}
@Override
protected void onStart() {
super.onStart();
checkOrRequestPermission();
}
@Override
protected void onStop() {
super.onStop();
mGoogleApiClient.disconnect();
}
private void checkOrRequestPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
mGoogleApiClient.connect();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_LOCATION) {
checkOrRequestPermission();
}
}
@Override
public void onConnected(@Nullable Bundle bundle) {
log("onConnected");
LocationServices.FusedLocationApi.setMockMode(mGoogleApiClient, true);
Location location = new Location(getApplicationContext().getPackageName());
location.setLatitude(1.0);
location.setLongitude(1.0);
location.setAccuracy(1.0f);
location.setTime(System.currentTimeMillis());
location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
LocationServices.FusedLocationApi.setMockLocation(mGoogleApiClient, location);
checkSettings();
}
private void checkSettings() {
LocationServices.SettingsApi
.checkLocationSettings(
mGoogleApiClient,
new LocationSettingsRequest.Builder()
.addLocationRequest(mLocationRequest)
.build())
.setResultCallback(new ResultCallback<LocationSettingsResult>() {
@Override
public void onResult(@NonNull LocationSettingsResult result) {
if (!mGoogleApiClient.isConnected()) {
return;
}
final Status status = result.getStatus();
switch (status.getStatusCode()) {
case LocationSettingsStatusCodes.SUCCESS:
log("Location settings are OK");
startPollingForLocation();
break;
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
log("Location settings need resolution");
try {
MainActivity.this.startIntentSenderForResult(status.getResolution().getIntentSender(), REQUEST_CODE_SETTINGS, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
log(e.toString());
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
log("Location settings: change unavailable");
break;
}
}
});
}
@SuppressWarnings("MissingPermission")
private void startPollingForLocation() {
LocationServices.FusedLocationApi.requestLocationUpdates(
mGoogleApiClient,
mLocationRequest,
new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
log(String.format("onLocationResult(%s)", locationResult));
}
@Override
public void onLocationAvailability(LocationAvailability locationAvailability) {
log(String.format("onLocationAvailability(%s)", locationAvailability));
if (locationAvailability.isLocationAvailable()) {
startPollingForLocation();
} else {
checkSettings();
}
}
},
null);
}
@Override
public void onConnectionSuspended(int i) {
log("onConnectionSuspended");
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
log("onConnectionFailed");
}
private void log(String s) {
Log.d("MainActivity", s);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment