Android - 获取位置的最简单方法

Android - Easiest way to get location

再见!我有一个 Activity 需要当前位置,以便用户可以看到哪些物体离他很近。

好吧,我将疯狂使用 GoogleApiClient、FusedLocation、回调等等,我得到的唯一结果是 getLastLocation returns null.

我的 Activity 实现了 GoogleApiClient.ConnectionCallbacksGoogleApiClient.OnConnectionFailedListener

OnCreate中我调用getLocation()是这样的:

private void getLocation(){
    locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(60*1000);
    locationRequest.setFastestInterval(10*1000);
    mFusedLocationApi = LocationServices.FusedLocationApi;
    gApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    if (gApiClient != null) {
        gApiClient.connect();
    }
}

我也有这个:

@Override
protected void onStart() {
    super.onStart();
    if (gApiClient != null) {
        gApiClient.connect();
    }
}

@Override
protected void onStop() {
    gApiClient.disconnect();
    super.onStop();
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.w("ADVSEARCH","Error on connection failed");
}

@Override
public void onConnectionSuspended(int i) {
    Log.w("ADVSEARCH","Error on connection suspended");
}

@Override
public void onConnected(Bundle bundle) {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

        //lastlocation = LocationServices.FusedLocationApi.getLastLocation(gApiClient);


        mFusedLocationApi.requestLocationUpdates(gApiClient, locationRequest, new com.google.android.gms.location.LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                lastlocation = location;
            }
        });
    }
    lastlocation = LocationServices.FusedLocationApi.getLastLocation(gApiClient);
}

是的,我在 OnCreate 中检查权限。最低 API 16,目标 API 25。 每次我第一次打开应用程序时,它都会崩溃,因为我在空对象上使用 distanceTo。我错过了什么?越搜越糊涂

我认为这可能是不同的事情,例如您没有在 Manifest 文件中设置所有内容,或者您​​在运行时没有权限(您需要在应用程序首次启动时允许这样做,或者您在应用程序设置中手动设置)。试试这个...

build.gradle

implementation 'com.google.android.gms:play-services-location:11.6.0'

在你的Activity.java

private static final int PERMISSION_REQUEST_FINE_LOCATION = 1;

private void getLocationRequest() {
    FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(this);
    if (!checkPermission()) {
        getLocationPermissions();
        return;
    }
    client.getLastLocation()
            .addOnSuccessListener(this, new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    // Got last known location. In some rare situations this can be null.
                    if (location != null) {
                        // Logic to handle location object
                        Log.e("TAG", "location = " + location);
                    } else {
                        Log.e("TAG", "not successful");
                    }
                }
            });
}

private boolean checkPermission() {
    return isGranted(ActivityCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION)) &&
            isGranted(ActivityCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION));
}

@TargetApi(Build.VERSION_CODES.M)
private void getLocationPermissions() {
    requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION},
            PERMISSION_REQUEST_FINE_LOCATION);
}

@Override
public void onRequestPermissionsResult(int code, @Nullable String permissions[], @Nullable int[] results) {
    switch (code) {
        case PERMISSION_REQUEST_FINE_LOCATION:
            if (isPermissionGranted(results)) {
                getLocationRequest();
            }
    }
}

private boolean isPermissionGranted(int[] results) {
    return results != null && results.length > 0 && isGranted(results[0]);
}

private boolean isGranted(int permission) {
    return permission == PackageManager.PERMISSION_GRANTED;
}

这会询问您是否尚未设置权限,并在对话结果肯定后再次调用 getLocationRequest

然后检查你的 AndroidManifest.xml

中是否有这个
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-feature android:name="android.hardware.location.gps" />
<uses-feature android:name="android.hardware.location.network" />

当然,您必须满足您的需求(精细或粗糙的位置等)。

希望这能让你走上正轨 ;)