0
アプリケーションがGPSとネットワーク状態をアクティブにするようにユーザーに促すようにLocationSettingsResultを実装しました。しかし、問題は、アクティビティの最初の起動時にgetStatus()はGPS /ネットワークが無効になっていても常に成功を返しますが、アクティビティがバックスタックから再開したときgetStatus()はGPS /ネットワークこれにより、ユーザにGPSを有効にするように促すダイアログが表示されます。LocationSettingsResult - getStatusが設定状態を適切に検出しない
これは、ロケーションイベントを処理するクラスです。
public static class LocationHandler {
private final int INTERVAL = 2000, FAST_INTERVAL = 500;
OnLocationFoundListener OnLocationFoundListener;
private GoogleApiClient apiClient;
private LocationRequest locationRequest;
private Activity activity;
private String response = " HI ";
public LocationHandler(Activity activity) { this.activity = activity; }
public LocationHandler(Activity activity, OnLocationFoundListener OnLocationFoundListener) {
this.activity = activity;
this.OnLocationFoundListener = OnLocationFoundListener;
}
public String findLocation() {
return response;
}
public void changeApiState(String state) {
switch (state){
case "connect":
apiClient.connect();
if (apiClient.isConnecting())
Log.d("LocationHandler", "Connecting...");
break;
case "disconnect":
apiClient.disconnect();
break;
case "reconnect":
apiClient.reconnect();
break;
}
}
public void checkPermission(){
if(ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(activity, new String[]{
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
}, Utilities.REQUEST_CODES.LOCATION_REQUEST_CODE);
}
}
private void checkLocationSettingsState(){
Log.d("LocationHandler", "Checking GPS status");
LocationSettingsRequest.Builder buildSettingsRequest = new LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest);
buildSettingsRequest.setAlwaysShow(true);
PendingResult<LocationSettingsResult> resultPendingResult =
LocationServices.SettingsApi.checkLocationSettings(
apiClient,
buildSettingsRequest.build()
);
resultPendingResult.setResultCallback(new ResultCallback<LocationSettingsResult>() {
@Override
public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
final Status status = locationSettingsResult.getStatus();
switch (status.getStatusCode()){
case LocationSettingsStatusCodes.SUCCESS:
Log.d("LocationHander", "Success");
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
try {
Log.d("LocationHandler", "Required");
status.startResolutionForResult(activity, REQUEST_CODES.CHECK_SETTING_REQUEST_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
Log.d("LocationHandler", "Settings unavailable");
break;
}
}
});
}
public void buildGoogleClient() {
Log.d("LocationHandler", "Building client");
apiClient = new GoogleApiClient.Builder(activity)
.addApi(LocationServices.API)
.addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(@Nullable Bundle bundle) {
Log.d("LocationHandler", "Connected");
checkLocationSettingsState();
// setLocationRequest();
}
@Override
public void onConnectionSuspended(int i) {
response = "Connection suspended";
}
})
.addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
response = connectionResult.toString();
}
})
.build();
}
private void setLocationRequest() {
Log.d("LocationHandler", "Requesting location");
locationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(INTERVAL)
.setFastestInterval(FAST_INTERVAL);
if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(
apiClient,
locationRequest,
new LocationListener() {
@Override
public void onLocationChanged(Location location) {
Log.d("LocationHandler", "Lat:" + location.getLatitude() + " Lng:" + location.getLongitude());
new getLocationName().execute(location.getLatitude(), location.getLongitude());
LocationServices.FusedLocationApi.removeLocationUpdates(apiClient, this);
}
}
);
}
class getLocationName extends AsyncTask<Double, Void, Void>{
@Override
protected Void doInBackground(Double... params) {
Log.d("LocationHandler", "Parsing latitude and longitude");
// params[0] = latitude, params[1] = longitude
Geocoder getLocationName = new Geocoder(activity, Locale.getDefault());
List<Address> addresses;
try {
addresses = getLocationName.getFromLocation(params[0], params[1], 1);
Address address = addresses.get(0);
Log.d("LocationHandler", address.getLocality());
response = address.getLocality();
}
catch (SocketTimeoutException e){
response = e.getMessage();
Log.d("LocationHandler", response);
}
catch (IOException e) {
response = e.getMessage() + "\nHAhahaha";
Log.d("LocationHandler", response);
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
OnLocationFoundListener.onLocationFound(response);
}
}
}
そして、このクラスは、私はそれが原因でアクティビティに設定launchModeのものとすることができるように、他から読んだ
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initComp();
locationHandler.buildGoogleClient();
startMostPopularFlipping();
loadPlacesByType("Home");
}
@Override
protected void onStart() {
super.onStart();
locationHandler.changeApiState("connect");
}
上記のクラス、そのクラスです。当初、私の活動はsingleTask
に設定されていたので、標準に変更しましたが、同じバグが発生します。