FusedLocationApi.getLastLocation 始终为空,即使 onCreated()

Posted

技术标签:

【中文标题】FusedLocationApi.getLastLocation 始终为空,即使 onCreated()【英文标题】:FusedLocationApi.getLastLocation is always null, even onCreated() 【发布时间】:2018-01-23 19:04:20 【问题描述】:

我问的是是否成功获得 FINECOARSE 权限。然后构建GoogleAPIClient 并创建LocationRequest 但随后FusedLocationApi.getLastLocation 它继续返回null。我知道在询问位置之前应该建立连接。因为建立连接的onStart() 是在retrieveLocation() 方法之后调用的,所以我在构建GoogleApiClient. onConnected 方法后立即调用mLocationApiClient.connect(),当我检查mLLocationApiClient.isConnected() 时,它显示为“真”。然后当我尝试使用FusedLocationApi 检索LastLocation 时,它总是返回null。我感到困惑,因为我已经检查了多次并且有连接但没有检索到位置。我哪里错了?

主活动:

@EActivity(R.layout.activity_main)
public class MainActivity
        extends AppCompatActivity
        implements GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, LocationListener 

        private static final int MY_PERMISSION_REQUEST_CODE = 7171;
        private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 7172;
        private static int UPDATE_INTERVAL = 5000; // seconds
        private static int FATEST_INTERVAL = 3000; // seconds
        private static int DISPLACEMENT = 10; // meters

        private LocationRequest mLocatiionRequest;
        private GoogleApiClient mGoogleApiClient;
        private Location mLastLocation;

    @AfterViews
    void retrieveLocation() 
        int fineLocationPermission = 
checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
        int coarseLocationPermission = 
checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION);

        if (fineLocationPermission != PackageManager.PERMISSION_GRANTED
            && coarseLocationPermission != PackageManager.PERMISSION_GRANTED) 
        this.requestPermissions(
                new String[]Manifest.permission.ACCESS_FINE_LOCATION,
                             Manifest.permission.ACCESS_COARSE_LOCATION,
                MY_PERMISSION_REQUEST_CODE
        );
     else 
        if (this.isPlayServiceAvailable()) 
            this.buildGoogleApiClient();
            this.createLocationRequest();

            this.mLastLocation = LocationServices.FusedLocationApi.getLastLocation(this.mGoogleApiClient);

            String message = "";
            if (this.mLastLocation != null)
                message = "Lat: " + this.mLastLocation.getLatitude() + ", Lon: " + this.mLastLocation.getLongitude();
            else
                message = "Didn't manage to get location.";

            Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
        
    


@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 
    switch (requestCode) 
        case MY_PERMISSION_REQUEST_CODE:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
                if (this.isPlayServiceAvailable())
                    this.buildGoogleApiClient();
            
            break;
    


@Override
public void onConnected(@Nullable Bundle bundle) 
    this.retrieveLocation();


@Override
public void onConnectionSuspended(int i) 
    this.mGoogleApiClient.connect();


@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) 


@Override
public void onLocationChanged(Location location) 
    this.mLastLocation = location;


@Override
protected void onStart() 
    super.onStart();

    if (this.mGoogleApiClient != null)
        this.mGoogleApiClient.connect();


@Override
protected void onStop() 
    LocationServices.FusedLocationApi.removeLocationUpdates(this.mGoogleApiClient, this);
    if (this.mGoogleApiClient != null)
        this.mGoogleApiClient.disconnect();
    super.onStop();


private boolean isPlayServiceAvailable() 
    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (resultCode != ConnectionResult.SUCCESS) 
        if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) 
            GooglePlayServicesUtil.getErrorDialog(resultCode, this, PLAY_SERVICES_RESOLUTION_REQUEST).show();
         else 
            Toast.makeText(getApplicationContext(), "The device is not supported", Toast.LENGTH_LONG).show();
            finish();
        
        return false;
    
    return true;


private void buildGoogleApiClient() 
    if (this.mGoogleApiClient == null) // avoid recreating client when it is already connected
        this.mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

    if (!this.mGoogleApiClient.isConnected()) // avoid unwanted hitting of onConnect callback
        this.mGoogleApiClient.connect();


private void createLocationRequest() 
    this.mLocatiionRequest = new LocationRequest();
    this.mLocatiionRequest.setInterval(this.UPDATE_INTERVAL);
    this.mLocatiionRequest.setFastestInterval(this.FATEST_INTERVAL);
    this.mLocatiionRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    this.mLocatiionRequest.setSmallestDisplacement(this.DISPLACEMENT);


private void startLocationUpdates() 
    int fineLocationPermission = checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
    int coarseLocationPermission = checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION);

    if (fineLocationPermission != PackageManager.PERMISSION_GRANTED && coarseLocationPermission != PackageManager.PERMISSION_GRANTED)
    
        return;
    
    LocationServices.FusedLocationApi.requestLocationUpdates(this.mGoogleApiClient, this.mLocatiionRequest, this);


private void stopLocationUpdates() 
    LocationServices.FusedLocationApi.removeLocationUpdates(this.mGoogleApiClient, this);

Build.graddle:

apply plugin: 'com.android.application'
apply plugin: 'android-apt'

def AAVersion = '4.3.1'

apt 
    arguments 
        androidManifestFile variant.outputs[0]?.processResources?.manifestFile
        resourcePackageName 'com.mosy.kalin.mosy'
    


android 
    compileSdkVersion 26
    buildToolsVersion "26.0.0"
    defaultConfig 
        applicationId "mosy.mosyandroid"
        minSdkVersion 26
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner 
"android.support.test.runner.AndroidJUnitRunner"
    
    buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 
'proguard-rules.pro'
        
    


dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', 
    
        exclude group: 'com.android.support', module: 'support-annotations'
    )
    apt "org.androidannotations:androidannotations:$AAVersion"
    compile "org.androidannotations:androidannotations-api:$AAVersion"

    compile 'com.android.support:appcompat-v7:26.0.0-beta2'
    compile 'com.android.support:design:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.android.support:support-v4:26.0.0-beta2'
    compile 'com.squareup.okhttp3:okhttp:3.8.1'
    compile 'com.google.android.gms:play-services-location:11.0.4'
    testCompile 'junit:junit:4.12'

【问题讨论】:

仅仅因为您连接到 Play 服务并不一定意味着有一个位置。 getLastLocation() 是一个很好的优化,但您需要准备好让它返回 null,同时 Play Services 正在确定设备的位置。 太棒了。我保证,我会处理 LastLocation 为空的情况。但是,如果我无法检索 LastLocation 不为空的情况,我应该如何测试它。我如何确定 Google Play 服务是否能够确定设备的位置(正如您所提到的)。 “但是,如果我无法检索 LastLocation 不为空的情况,我应该如何测试它”——您注册位置更新,并使用您收到的第一个更新。 我在设置 Play 服务时是否有遗漏某些内容?我不能以某种方式强制接收位置吗? “我不能以某种方式强制接收位置吗?” ——嗯,不。毕竟,移动设备是由电池供电的。持续监控位置会耗尽电池电量。因此,移动设备不这样做。他们只会偶尔监控位置,或者应用程序是否专门请求位置更新。在 Android 8.0+ 上,即使应用程序请求位置更新,如果这些应用程序都在后台,设备检查的频率也会降低。因此,请求位置更新,并在有更新时做出反应。 【参考方案1】:

2 原因

    getLastLocation() 并不总是给出位置。您还必须编写位置更新 在某些设备中,有时 google play 服务无法连接

因此,为避免这种情况,您还必须从 GPS 获取位置,请考虑以下代码

在你的构建 gradle 中添加这个依赖项

compile 'com.google.android.gms:play-services-location:10.2.1'
compile 'cn.pedant.sweetalert:library:1.3'

添加这个类来获取位置 -- LocationResolver.java

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.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;


import cn.pedant.SweetAlert.SweetAlertDialog;

import static android.content.Context.LOCATION_SERVICE;



public class LocationResolver implements GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener, LocationListener, android.location.LocationListener 

    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 ; // 1 minute

    //Location Request code
    private final int REQUEST_LOCATION = 2;
    //Google Api Client
    private GoogleApiClient mGoogleApiClient;

    //Location request for google fused location Api
    private LocationRequest mLocationRequest;

    //Location manager for location services
    private LocationManager mLocationManager;

    private OnLocationResolved mOnLocationResolved;

    private Activity mActivity;

    //Location permission Dialog
    private SweetAlertDialog mDialog;

    public LocationResolver(Activity activity)
        mActivity=activity;
        buildGoogleApiClient();
        mLocationManager = (LocationManager) activity.getSystemService(LOCATION_SERVICE);
        createLocationRequest();
    

    public void resolveLocation(Activity activity, OnLocationResolved onLocationResolved)
        this.mOnLocationResolved = onLocationResolved;
        this.mActivity=activity;

        if (isEveryThingEnabled())
            startLocationPooling();
        
    

    public interface OnLocationResolved
        void onLocationResolved(Location location);
    


    /*
  * Checking every criteria are enabled for getting location from device
  * */
    public boolean isEveryThingEnabled() 
        if (!isLocationPermissionEnabled()) 
            showPermissionRequestDialog();
            return false;
         else if (!isLocationEnabled(mActivity)) 
            showLocationSettingsDialog();
            return false;
         else if (!isConnected()) 
            showWifiSettingsDialog(mActivity);
            return false;
        

        return true;
    


    /*
   * This function checks if location permissions are granted or not
   * */
    public boolean isLocationPermissionEnabled() 

        return !(Build.VERSION.SDK_INT >= 23 &&
                ContextCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                ContextCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED);
    


    /*
    * Previous location permissions were denied , this function opens app settings page
    * So user can enable permission manually
    * */
    private void startAppDetailsActivity() 

        final Intent i = new Intent();
        i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        i.addCategory(Intent.CATEGORY_DEFAULT);
        i.setData(Uri.parse("package:" + mActivity.getPackageName()));

        mActivity.startActivity(i);
    



    private void showLocationSettingsDialog() 
        SweetAlertDialog builder = new SweetAlertDialog(mActivity, SweetAlertDialog.WARNING_TYPE);
        builder.setTitleText("Need Location");
        builder.setContentText("In order for the app to work seamlessly.Please  enable Location Service.");
        builder.setConfirmText("Enable");
        builder.setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() 
            @Override
            public void onClick(SweetAlertDialog dialog) 
                dialog.cancel();
                startLocationSettings();
            
        );
        builder.setCancelText("Cancel");
        builder.setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() 
            @Override
            public void onClick(SweetAlertDialog dialog) 
                dialog.cancel();

            
        );

        builder.show();
    

    private void startLocationSettings() 
        mActivity.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
    

    /*
    * location permissions were denied with "do not show"  unchecked.. this function shows a dialog describing why this app
    * need location permission.
    * */
    private void showPermissionRequestDialog() 
        if (mDialog != null)
            mDialog.cancel();
        mDialog = new SweetAlertDialog(mActivity, SweetAlertDialog.NORMAL_TYPE);
        mDialog.setTitleText("You need location permission");
        mDialog.setContentText("Enable location permission");
        mDialog.setConfirmText("grant");
        mDialog.setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() 
            @Override
            public void onClick(SweetAlertDialog dialog) 
                dialog.cancel();
                ActivityCompat.requestPermissions(mActivity,
                        new String[]Manifest.permission.ACCESS_FINE_LOCATION,
                        REQUEST_LOCATION);
            
        );
        mDialog.setCancelText("Cancel");
        mDialog.setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() 
            @Override
            public void onClick(SweetAlertDialog dialog) 
                dialog.cancel();
            
        );
        mDialog.show();
    

    /*
    *
    *
    *  Previously Permission Request was cancelled with 'Dont Ask Again',
    *  Redirect to Settings after showing Information about why you need the permission
    *
    * */
    private void showPermissionDeniedDialog() 

        if (mDialog != null)
            mDialog.cancel();
        mDialog = new SweetAlertDialog(mActivity, SweetAlertDialog.NORMAL_TYPE);
        mDialog.setTitleText("Need Location Permission");


        mDialog.setContentText("Enable location permission");
        mDialog.setConfirmText("grant");
        mDialog.setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() 
            @Override
            public void onClick(SweetAlertDialog dialog) 
                dialog.cancel();
                startAppDetailsActivity();
            
        );
        mDialog.setCancelText("Cancel");
        mDialog.setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() 
            @Override
            public void onClick(SweetAlertDialog dialog) 
                dialog.cancel();

            
        );

        mDialog.show();
    


    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) 
        switch (requestCode) 
            case REQUEST_LOCATION: 
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
                    startLocationPooling();
                 else 
                    if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity,
                            Manifest.permission.ACCESS_FINE_LOCATION) && ActivityCompat.shouldShowRequestPermissionRationale(mActivity,
                            Manifest.permission.ACCESS_COARSE_LOCATION)) 
                        showPermissionRequestDialog();

                     else 
                        showPermissionDeniedDialog();

                    
                
            
        


    

    /*
    * Starting location pooling
    * */
    public void startLocationPooling() 


        if (ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
            //
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.

            return;

        
        Location location = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
        if (location != null) 
            mOnLocationResolved.onLocationResolved(location);
         else 
            if (mGoogleApiClient.isConnected())//if googleClient can get location from device the go for location update
                startLocationUpdates();
            else getLocation(); //Google Client cannot connected to its server. so we are fetching location directly from device
        

    

    private synchronized void buildGoogleApiClient() 
        mGoogleApiClient = new GoogleApiClient.Builder(mActivity)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    



    public void onDestroy() 

        mGoogleApiClient.disconnect();
    

    public void onStop() 
        if (mDialog != null) 
            mDialog.cancel();
        
        stopLocationUpdates();
        mGoogleApiClient.disconnect();
    

    public void onStart() 

        mGoogleApiClient.connect();
    

    @Override
    public void onConnected(Bundle bundle) 

        // startLocationPooling();

    

    /*
   * checks whether the device connected or not*/
    public boolean isConnected() 
        try 
            ConnectivityManager cm = (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();

            return netInfo != null && netInfo.isConnected();
         catch (Exception e) 
            return false;
        
    

    @Override
    public void onConnectionSuspended(int i) 

        mGoogleApiClient.connect();
    

    @Override
    public void onLocationChanged(Location location) 
        if (location != null) 
           mOnLocationResolved.onLocationResolved(location);
            stopLocationUpdates();
        

    

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) 
    

    @Override
    public void onProviderEnabled(String s) 
    

    @Override
    public void onProviderDisabled(String s) 

    



    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) 
        if (connectionResult.hasResolution()) 
            try 
                // Start an Activity that tries to resolve the error
                connectionResult.startResolutionForResult(mActivity, ConnectionResult.RESOLUTION_REQUIRED);
             catch (IntentSender.SendIntentException e) 
                e.printStackTrace();
            
         else 
            Log.e("TAG", "Location services connection failed with code==>" + connectionResult.getErrorCode());
            Log.e("TAG", "Location services connection failed Because of==> " + connectionResult.getErrorMessage());
        

    

    private void createLocationRequest() 
        Log.i("TAG", "CreateLocationRequest");
        mLocationRequest = new LocationRequest();
        long UPDATE_INTERVAL = 10 * 1000;
        mLocationRequest.setInterval(UPDATE_INTERVAL);
        long FASTEST_INTERVAL = 10000;
        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(mLocationRequest);
        //**************************
        builder.setAlwaysShow(true); //this is the key ingredient
        //**************************

    

    private void startLocationUpdates() 

        Log.i("TAG", "StartLocationUpdates");

        if (Build.VERSION.SDK_INT >= 23) 
            if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) 
                // TODO: Consider calling
                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
                        mLocationRequest, this);

            
         else 
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
                    mLocationRequest, this);
        

    

    private void stopLocationUpdates() 

        try 
            if (mGoogleApiClient.isConnected())
                LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);

            if (mLocationManager != null) 
                mLocationManager.removeUpdates(this);
            
         catch (Exception e) 
            e.printStackTrace();
        
    


    public void getLocation() 
        try 


            // getting GPS status
            Boolean isGPSEnabled = mLocationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // getting network status
            Boolean isNetworkEnabled = mLocationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) 
                Log.e("Location", "No provider enabled");
             else 
                if (ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
                    // TODO: Consider calling
                    //    ActivityCompat#requestPermissions
                    // here to request the missing permissions, and then overriding
                    //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                    //                                          int[] grantResults)
                    // to handle the case where the user grants the permission. See the documentation
                    // for ActivityCompat#requestPermissions for more details.
                    return;
                
                Location location = null;
                // First get location from Network Provider
                if (isNetworkEnabled) 
                    if (mLocationManager != null) 
                        location = mLocationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) 
                           mOnLocationResolved.onLocationResolved(location);
                         else 
                            mLocationManager.requestLocationUpdates(
                                    LocationManager.NETWORK_PROVIDER,
                                    MIN_TIME_BW_UPDATES,
                                    MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                            Log.d("Network", "Network");
                        
                    
                
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) 
                    if (location == null) 
                        if (mLocationManager != null) 
                            location = mLocationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) 
                                mOnLocationResolved.onLocationResolved(location);
                             else 
                                mLocationManager.requestLocationUpdates(
                                        LocationManager.GPS_PROVIDER,
                                        MIN_TIME_BW_UPDATES,
                                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                                Log.d("GPS Enabled", "GPS Enabled");
                            
                        
                    
                
            

         catch (Exception e) 
            e.printStackTrace();
        


    


    /*
   * checks whether the device connected or not*/
    public static boolean isNetWorkConnected(Context  context) 
        try 
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo netInfo = cm.getActiveNetworkInfo();

            return netInfo != null && netInfo.isConnected();
         catch (Exception e) 
            return false;
        
    


    public   void showWifiSettingsDialog(final Context  context) 
        SweetAlertDialog builder = new SweetAlertDialog(context, SweetAlertDialog.WARNING_TYPE);
        builder.setTitleText("Need Internet");
        builder.setContentText("Please enable your internet connection");

        builder.setConfirmText("Enable");
        builder.setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() 
            @Override
            public void onClick(SweetAlertDialog dialog) 
                dialog.cancel();
                startWifiSettings(context);
            
        );
        builder.setCancelText("Cancel");
        builder.setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() 
            @Override
            public void onClick(SweetAlertDialog dialog) 
                dialog.cancel();

            
        );

        builder.show();

    

    private   void startWifiSettings(Context context) 
        try 
            context.startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
         catch (Exception e) 
            Toast.makeText(context, "Something went wrong", Toast.LENGTH_SHORT).show();
        
    

    public static boolean isLocationEnabled(Context context) 
        int locationMode = 0;
        String locationProviders;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
            try 
                locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);

             catch (Settings.SettingNotFoundException e) 
                e.printStackTrace();
                return false;
            

            return locationMode != Settings.Secure.LOCATION_MODE_OFF;

         else 
            locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
            return !TextUtils.isEmpty(locationProviders);
        
    



在您的活动中按照以下步骤操作

创建并初始化 LocationResolver 变量

  private LocationResolver mLocationResolver;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
mLocationResolver=new LocationResolver(this);


并将这些行添加到您的活动中

@Override
protected void onStart() 
    super.onStart();
    mLocationResolver.onStart();


@Override
protected void onStop() 
    super.onStop();
    mLocationResolver.onStop();


@Override
protected void onDestroy() 
    super.onDestroy();
    mLocationResolver.onDestroy();


@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    mLocationResolver.onRequestPermissionsResult(requestCode, permissions, grantResults);

用法:当您想要位置时,使用此代码获取位置

    void retrieveLocation() 

 mLocationResolver.resolveLocation(this, new LocationResolver.OnLocationResolved() 
            @Override
            public void onLocationResolved(Location location) 
                // Do what ever you want
            
        );
    

【讨论】:

谢谢哥们!我会尝试您提出的增强功能并分享我的反馈。 顺便说一句,降级 google-location-api 版本有什么原因吗?如您所见,我已经在使用 v11.0.4 你可以使用 11.0.4 。没问题 createLocationRequest 方法中,您正在配置LocationSettingsRequest.Builder,而不使用build() 的结果。

以上是关于FusedLocationApi.getLastLocation 始终为空,即使 onCreated()的主要内容,如果未能解决你的问题,请参考以下文章