Created
June 13, 2017 19:28
-
-
Save aaronj1335/8b5d00b83ab935fc76f70f3a4db43964 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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