Android studio不检查mFusedLocationProviderClient.getLastLocation()。addOnSuccessListener并返回当前位置null

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

我想从我的应用程序中获取更新的位置。但是我的应用程序没有检查这段代码

public void onSuccess(Location location){}里面的mFusedLocationProviderClient.getLastLocation()。addOnSuccessListener(这个,新的OnSuccessListener(){}并返回null位置。甚至我的设备位置都打开了,地图显示了我的位置。我的访问代码更新位置如下:

  protected void onCreate(Bundle savedInstanceState) {
                mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
        }

          public void onMapReady(GoogleMap googleMap) {
                mMap = googleMap;

                Toast.makeText(this, "Map is ready", Toast.LENGTH_SHORT).show();
                if (mLocationPermissionGranted) {
                    getDeviceLocation();

                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                            != PackageManager.PERMISSION_GRANTED &&
                            ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
                                    != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    mMap.setMyLocationEnabled(true);
                }
            }

        private void getDeviceLocation(){
                    try {
                        if(mLocationPermissionGranted) //true in my case
    {


                            mFusedLocationProviderClient.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) {

                                                moveCamera(new LatLng(location.getLatitude(),location.getLongitude()),17);
                                               // mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(),location.getLongitude()),12),2000,null);

                                            }
                                            else{
                                                Toast.makeText(MapsActivity.this, "Unable to get current location", Toast.LENGTH_SHORT).show();
                                            }
                                        }

                                    });

                        }
                    }catch (SecurityException ex){

                    }
                }

我在stacktrace中遇到以下异常

09-11 15:12:14.525 5864-5864/? E/Zygote: v2
09-11 15:12:14.530 5864-5864/? E/Zygote: accessInfo : 0
09-11 15:12:27.333 5864-5864/com.example.muzammil.maptestingproject E/BoostFramework: BoostFramework() : Exception_1 = java.lang.ClassNotFoundException: Didn't find class "com.qualcomm.qti.Performance" on path: DexPathList[[],nativeLibraryDirectories=[/system/lib, /vendor/lib]]
09-11 15:12:39.327 5864-5864/com.example.muzammil.maptestingproject E/art: The String#value field is not present on Android versions >= 6.0

其他一切都是正确的,包括清单权限和gradle依赖项。可能是任何身体帮助我解决我的问题。提前致谢。

java android google-maps android-studio geolocation
1个回答
3
投票

如果至少有一个客户端连接到它,则融合位置提供程序将给出该位置。如果客户端连接,它将立即尝试获取位置。如果您的活动是第一个连接的客户端,并且您调用的getLastLocation()可能没有足够的时间来进入第一个位置。

getLastLocation()适用于需要立即定位或根本不需要使用的地方。如果你真的想等一个位置,最好使用requestLocationUpdates()并等待回调,而不是忙于在一个线程中等待。

这是使用location获取requestLocationUpdates()的方法

    LocationCallback locationCallback;
    LocationRequest locationRequest;
    FusedLocationProviderClient fusedLocationClient;

    void getLocation() {
        locationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(30 * 1000)
                .setFastestInterval(5 * 1000);

        locationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);
                //Location received 
            }
        };

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(getApplicationContext());
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null);
    }

并且不要忘记删除在onStoponDestroy中更新的位置

fusedLocationClient?.removeLocationUpdates(locationCallback)
© www.soinside.com 2019 - 2024. All rights reserved.