FusedLocationProviderClient无法通过3G或4G网络获得GPS位置,除非先连接到WIFI网络

问题描述 投票:1回答:1

我们的应用程序之一正在Sunmi的T1和T2 mini上运行。应用程序使用下面的LocationUtil类发送回设备的位置数据:

 public class LocationUtil
 {

    private static final String TAG = LocationUtil.class.getSimpleName();

    private final long UPDATE_INTERVAL_IN_MILLISECONDS = 20000;
    private final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = 10000;
    private final int REQUEST_CHECK_SETTINGS = 100;

    private FusedLocationProviderClient mFusedLocationClient;
    private SettingsClient mSettingsClient;
    private LocationRequest mLocationRequest;
    private LocationSettingsRequest mLocationSettingsRequest;
    private LocationCallback mLocationCallback;
    private Location mCurrentLocation;
    private LocationReceived locReceiveListener;

    private boolean gettingUpdatesStarted;

    private Context context;

    public LocationUtil(){

    }

    public LocationUtil(Context context)
    {
        this.context = context;
    }

    public interface LocationReceived {
        void onReceive(Location location);
        void onError(String message);
    }

    private Activity actContext = null;

    public void initialise(Activity context) {

        this.actContext = context;

        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(context);

        mSettingsClient = LocationServices.getSettingsClient(context);

        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
        builder.addLocationRequest(mLocationRequest);
        mLocationSettingsRequest = builder.build();

        if (mLocationCallback == null)
        {
            mLocationCallback = new LocationCallback()
            {
                @Override
                public void onLocationResult(LocationResult locationResult)
                {
                    super.onLocationResult(locationResult);
                    // location is received
                    mCurrentLocation = locationResult.getLastLocation();
                    locReceiveListener.onReceive(mCurrentLocation);
                }

                @Override
                public void onLocationAvailability(LocationAvailability locationAvailability)
                {
                    super.onLocationAvailability(locationAvailability);
                }
            };
        }
    }

    public void StartLocationUpdater(LocationReceived locReceiveListenerIn){

        locReceiveListener = locReceiveListenerIn;

        if (!gettingUpdatesStarted)
        {    
            gettingUpdatesStarted = true;

            mSettingsClient.checkLocationSettings(mLocationSettingsRequest)
                .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>()
                {
                    @SuppressLint("MissingPermission")
                    @Override
                    public void onSuccess(LocationSettingsResponse locationSettingsResponse)
                    {
                        Log.i(TAG, "All location settings are satisfied.");

                        mFusedLocationClient.requestLocationUpdates(mLocationRequest,
                                mLocationCallback, Looper.myLooper());

                    }
                })
                .addOnFailureListener(new OnFailureListener()
                {
                    @Override
                    public void onFailure(@NonNull Exception e)
                    {
                        int statusCode = ((ApiException) e).getStatusCode();
                        gettingUpdatesStarted = false;
                        switch (statusCode)
                        {
                            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                                Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " +
                                        "location settings ");
                                try {
                                    // Show the dialog by calling startResolutionForResult(), and check the
                                    // result in onActivityResult().
                                    ResolvableApiException rae = (ResolvableApiException) e;
                                    rae.startResolutionForResult((Activity) actContext, REQUEST_CHECK_SETTINGS);
                                } catch (IntentSender.SendIntentException sie) {
                                    Log.i(TAG, "PendingIntent unable to execute request.");
                                }
                                break;
                            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                                String errorMessage = "Location settings are inadequate, and cannot be " +
                                        "fixed here. Fix in Settings.";
                                Log.e(TAG, errorMessage);
                        }

                    }

                });
        }
    }


    public void getLastLocation(LocationReceived locReceiveListenerIn) {

        locReceiveListener = locReceiveListenerIn;

        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(context);

        mFusedLocationClient.getLastLocation()
            .addOnSuccessListener( new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    // Got last known location. In some rare situations this can be null.
                    if (location != null) {

                        mCurrentLocation = location;
                        locReceiveListener.onReceive(mCurrentLocation);
                    }
                    else{
                        locReceiveListener.onError("No location received");
                    }
                }

            });

    }

    public void stopLocationUpdates() {
        // Removing location updates
        mFusedLocationClient
            .removeLocationUpdates(mLocationCallback)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {

                    gettingUpdatesStarted = false;

                }
            });
    }
}

但是,似乎只有先将设备连接到WIFI,然后再切换回3G和4G时,应用程序才能获取位置数据。首次连接3G或4G网络时,该设备不会发送任何位置数据。经过测试,发现以下内容:

结果是3G初始定位可以成功,但速度很慢。该代码使用了GMS的融合定位方案。当设备通过登录询问位置信息时,设备很快就会获得基站的位置信息。 GMS使用基站的位置信息来分析设备的经度和纬度。但是三分钟后,GMS进程打印了没有位置的日志,并且您的应用程序仍然没有位置信息。但是一段时间后,该应用程序能够从4G网络获取信息。根据当前可用的信息,怀疑GMS将位置返回给应用程序有问题

即使使用最新的Google Play服务,也无法提供位置信息

android android-location android-fusedlocation fusedlocationproviderclient
1个回答
0
投票

进一步的调查表明,第一个问题是该设备的Google Play服务版本已过时。 Google Play服务未更新的原因是由于SIM卡限制。

© www.soinside.com 2019 - 2024. All rights reserved.