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

Posted

技术标签:

【中文标题】Android studio 不检查 mFusedLocationProviderClient.getLastLocation().addOnSuccessListener 并返回当前位置 null【英文标题】:Android studio does not check mFusedLocationProviderClient.getLastLocation().addOnSuccessListener and returns current location null 【发布时间】:2019-02-15 20:10:36 【问题描述】:

我正在尝试从我的应用中获取更新后的位置。但是我的应用程序不会检查此代码块

public void onSuccess(Location location) mFusedLocationProviderClient.getLastLocation() .addOnSuccessListener(this, new OnSuccessListener() 并返回空位置。即使我的设备位置已打开,地图也会显示我的位置。我用于访问更新位置的代码如下:

  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)

                    
                

我在堆栈跟踪中遇到以下异常

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 依赖项。可能是任何机构帮助我解决我的问题。提前致谢。

【问题讨论】:

getLastLocation() 可能返回 null 如果位置不可用(这种情况应该很少发生),将返回 null。 【参考方案1】:

如果至少有一个客户端连接到 Fused Location Provider,它将提供位置。如果客户端连接,它将立即尝试获取位置。如果您的活动是第一个连接的客户端,并且您致电getLastLocation(),则可能没有足够的时间让第一个位置进入。

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

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

    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)

【讨论】:

非常感谢您的回答,问题已经解决了。

以上是关于Android studio 不检查 mFusedLocationProviderClient.getLastLocation().addOnSuccessListener 并返回当前位置 null的主要内容,如果未能解决你的问题,请参考以下文章

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

android studio怎么更新android-ndk

在 Android Studio 上使用 Java 检查实时数据库上的重复数据

Android Studio App Inspector 不显示数据库

android studio 为啥不自动提示代码

请配置Android SDK Android Studio