1

我以前使用过 LocationSettingsRequest,它的工作方式与预期的一样。但是当我将我的播放服务更新到 11.2 版本时。这对我来说似乎很混乱。GoogleApiClient首先,这个升级不是他们提供的GeoDataClient,而是不打算使用的,但是如果我们仍然必须使用它来启用设备定位PlaceDetectionClient,则会留下什么。GoogleApiClient想,一定有一些解决方法,但我还是没有找到。我尝试的代码段如下所示,它不起作用。

package com.abhishek.testplacesapi;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import com.abhishek.testplacesapi.utils.Utilities;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationRequest;
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;
import com.google.android.gms.location.places.GeoDataClient;
import com.google.android.gms.location.places.PlaceDetectionClient;
import com.google.android.gms.location.places.PlaceLikelihood;
import com.google.android.gms.location.places.PlaceLikelihoodBufferResponse;
import com.google.android.gms.location.places.Places;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;

public class MainActivity extends AppCompatActivity {

    protected GeoDataClient mGeoDataClient;
    protected PlaceDetectionClient mPlaceDetectionClient;
    // The entry point to the Fused Location Provider.
    private FusedLocationProviderClient mFusedLocationProviderClient;

    private Context mContext;
    protected static final String TAG = "MainActivity";

    private boolean mLocationPermissionGranted;

    // The geographical location where the device is currently located. That is, the last-known
    // location retrieved by the Fused Location Provider.
    private Location mLastKnownLocation;

    /**
     * Constant used in the location settings dialog.
     */
    protected static final int REQUEST_CHECK_SETTINGS = 0x1;

    // Used for selecting the current place.
    private static final int M_MAX_ENTRIES = 5;
    private String[] mLikelyPlaceNames;
    private String[] mLikelyPlaceAddresses;
    private String[] mLikelyPlaceAttributions;
    private LatLng[] mLikelyPlaceLatLngs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
        //Construct a GeoDataClient
        mGeoDataClient = Places.getGeoDataClient(this, null);

        //Construct a PlaceDetectionClient api
        mPlaceDetectionClient = Places.getPlaceDetectionClient(this, null);

        // Construct a FusedLocationProviderClient.
        mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);

        //Google Api Client

        googleApiClient = new GoogleApiClient
                .Builder(mContext)
                .addApi(LocationServices.API)
                .build();
        googleApiClient.connect();

        //Request Gps Enable
        requestGpsEnable();

    }

    GoogleApiClient googleApiClient;

    private void requestGpsEnable() {


        //Location request
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        //Location Settings Request
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest);
        builder.setAlwaysShow(true);

        PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(googleApiClient,
                        builder.build());
        Log.i(TAG, ""+result);
        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @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.");
                        if (Build.VERSION.SDK_INT >= 23) {
                            checkLocationRequest();
                        } else {
                            mLocationPermissionGranted = true;
                            getCurrentLocationAddress();
                        }
                        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(MainActivity.this,
                                    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;
                }
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            // Check for the integer request code originally supplied to startResolutionForResult().
            case REQUEST_CHECK_SETTINGS:
                switch (resultCode) {
                    case Activity.RESULT_OK:
                        Log.i(TAG, "User agreed to make required location settings changes.");
                        //startLocationUpdates();
                        if (Build.VERSION.SDK_INT >= 23) {
                            checkLocationRequest();
                        } else {
                            getCurrentLocationAddress();
                        }
                        break;
                    case Activity.RESULT_CANCELED:
                        Log.i(TAG, "User chose not to make required location settings changes.");
                        break;
                }
                break;
        }
    }

    private static final int LOC_REQ_CODE = 102;

    private void checkLocationRequest() {
        int locationPermissionCheck = ActivityCompat.checkSelfPermission(mContext, Manifest
                .permission.ACCESS_FINE_LOCATION);

        if (locationPermissionCheck != PackageManager.PERMISSION_GRANTED) {
            //Permission not granted
            mLocationPermissionGranted = false;
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission
                    .ACCESS_FINE_LOCATION}, LOC_REQ_CODE);
        } else {
            //Permission granted
            mLocationPermissionGranted = true;
            getCurrentLocationAddress();
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        mLocationPermissionGranted = false;
        switch (requestCode) {
            case LOC_REQ_CODE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager
                        .PERMISSION_GRANTED) {
                    mLocationPermissionGranted = true;
                    getCurrentLocationAddress();
                } else {
                    mLocationPermissionGranted = false;
                    checkLocationRequest();
                    /*requestGpsEnable();*/
                }
                break;
        }
    }

    private void getCurrentLocationAddress() {
        try{
            Task<PlaceLikelihoodBufferResponse> placeResult = mPlaceDetectionClient.getCurrentPlace(null);

            placeResult.addOnCompleteListener(new OnCompleteListener<PlaceLikelihoodBufferResponse>() {
                @Override
                public void onComplete(@NonNull Task<PlaceLikelihoodBufferResponse> task) {
                    PlaceLikelihoodBufferResponse likelyPlaces = task.getResult();

                    for (PlaceLikelihood placeLikelihood : likelyPlaces) {
                        Log.i("TAG", String.format("Place '%s' has address '%s' likelihood: %g",
                                placeLikelihood.getPlace().getName(),
                                placeLikelihood.getPlace().getAddress(),
                                placeLikelihood.getLikelihood()));
                    }
                    likelyPlaces.release();
                }
            });
        }catch(SecurityException ex){

        }

        /*getCurrentDeviceLocation();*/
        /*showCurrentPlace();*/
    }

    /**
     * Gets the current location of the device.
     */

    private void getCurrentDeviceLocation() {
        try {
            if (mLocationPermissionGranted) {
                Task<Location> locationTask = mFusedLocationProviderClient.getLastLocation();
                locationTask.addOnCompleteListener(this, new OnCompleteListener<Location>() {
                    @Override
                    public void onComplete(@NonNull Task<Location> task) {
                        if (task.isSuccessful()) {
                            mLastKnownLocation = task.getResult();
                            Utilities.printLog("" + mLastKnownLocation.getProvider());
                            Utilities.printLog("" + mLastKnownLocation.getLatitude());
                            Utilities.printLog("" + mLastKnownLocation.getLongitude());
                            Utilities.printLog("");
                        } else {

                        }
                    }
                });

            } else {
                checkLocationRequest();
            }
        } catch (SecurityException ex) {
            Log.e("Exception: %s", ex.getMessage());
        }
    }

    /**
     * Show current place
     */

    private void showCurrentPlace() {
        try {
            if (mLocationPermissionGranted) {
                Task<PlaceLikelihoodBufferResponse> placeResult = mPlaceDetectionClient
                        .getCurrentPlace(null);
                placeResult.addOnCompleteListener(this, new
                        OnCompleteListener<PlaceLikelihoodBufferResponse>() {
                            @Override
                            public void onComplete(@NonNull Task<PlaceLikelihoodBufferResponse>
                                                           task) {
                                if (task.isSuccessful() && task.getResult() != null) {
                                    PlaceLikelihoodBufferResponse likelyPlaces = task.getResult();
                                    // Set the count, handling cases where less than 5 entries are
                                    // returned.
                                    int count;
                                    count = likelyPlaces.getCount();
                                    /*if (likelyPlaces.getCount() < M_MAX_ENTRIES) {
                                        count = likelyPlaces.getCount();
                                    } else {
                                        count = M_MAX_ENTRIES;
                                    }*/

                                    int i = 0;
                                    mLikelyPlaceNames = new String[count];
                                    mLikelyPlaceAddresses = new String[count];
                                    mLikelyPlaceAttributions = new String[count];
                                    mLikelyPlaceLatLngs = new LatLng[count];
                                    double prevLikelihood = -0.0;
                                    for (PlaceLikelihood placeLikelihood : likelyPlaces) {
                                        // Build a list of likely places to show the user.
                                        mLikelyPlaceNames[i] = (String) placeLikelihood.getPlace()
                                                .getName();
                                        mLikelyPlaceAddresses[i] = (String) placeLikelihood.getPlace()
                                                .getAddress();
                                        mLikelyPlaceAttributions[i] = (String) placeLikelihood
                                                .getPlace()
                                                .getAttributions();
                                        mLikelyPlaceLatLngs[i] = placeLikelihood.getPlace().getLatLng();
                                        i++;
                                        if (i > (count - 1)) {
                                            break;
                                        }
                                    }

                                    // Release the place likelihood buffer, to avoid memory leaks.
                                    likelyPlaces.release();

                                    // Show a dialog offering the user the list of likely places, and
                                    // add a
                                    // marker at the selected place.
                                    /*openPlacesDialog();*/

                                } else {
                                    Log.e(TAG, "Exception: %s", task.getException());
                                }
                            }
                        });
            } else {
                checkLocationRequest();
            }
        } catch (SecurityException ex) {
            Log.e("Exception: %s", ex.getMessage());
        }
    }

}

任何帮助将不胜感激。感谢您给我们宝贵的时间。干杯!!

4

0 回答 0