【问题标题】:Finding the latitude and longitude values for the device's current location in Android with Google Maps API使用 Google Maps API 在 Android 中查找设备当前位置的纬度和经度值
【发布时间】:2020-08-07 13:15:37
【问题描述】:

因此基于此提出了许多类似的问题,我也得到了一个可行的解决方案。但是,这似乎只适用于我的物理 Android 设备。如果我将它与模拟器一起使用,该方法会返回一个空值,我不知道为什么。许多消息来源提到我目前使用的代码有更好的替代方案,但他们没有提到具体是什么/如何。这是我用来获取设备当前位置的代码:

@SuppressWarnings("MissingPermission")
    private LatLng getCurrentLocation() {
        LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        String locationProvider = LocationManager.NETWORK_PROVIDER;
        assert locationManager != null;
        android.location.Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);
        return new LatLng(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude());
    }

我也不喜欢必须隐藏警告的事实。我查看的来源包括:

https://developer.android.com/training/location/retrieve-current.html#java

What is the simplest and most robust way to get the user's current location on Android?

第一个不起作用,我得到一个空值。对于我正在寻找的简单结果,第二个看起来过于复杂。

【问题讨论】:

    标签: java android


    【解决方案1】:

    这段代码在我的一个项目中运行良好:

    public class LocationManager {
            private static LocationManager requestManager;
            private FusedLocationProviderClient mLocationProviderClient;
            private Location mLocation;
            private Location mMyCurrentLocation;
            private locationSuccessListener mListener;
    
        public Location getLocation() {
            return mLocation;
        }
    
        public void setLocation(Location location) {
            mLocation = location;
        }
    
        private LocationManager(FusedLocationProviderClient fusedLocationProviderClient) {
            this.mLocationProviderClient = fusedLocationProviderClient;
        }
    
        public static LocationManager createInstance(FusedLocationProviderClient fusedLocationProviderClient) {
            if (requestManager != null) {
                return requestManager;
            } else {
                return requestManager = new LocationManager(fusedLocationProviderClient);
            }
        }
    
        public static LocationManager getInstance() {
            return requestManager;
        }
    
        public void setLocation(Activity activity) {
            mListener = (locationSuccessListener) activity;
            LocationCallback callback = new LocationCallback();
            LocationRequest locationRequest = new LocationRequest();
            Task<Void> r = mLocationProviderClient.requestLocationUpdates(locationRequest, callback, Looper.getMainLooper());
            r.addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    mLocationProviderClient.getLastLocation().addOnSuccessListener(activity, new OnSuccessListener<Location>() {
                        @Override
                        public void onSuccess(Location location) {
                            mMyCurrentLocation = location;
                            mLocation = location;
                            if (location != null) {
                                mListener.onLocationReceived();
                                mLocationProviderClient.removeLocationUpdates(callback);
                            }
                        }
                    });
                }
            });
    
    
        }
    
        public Location getMyCurrentLocation() {
            return mMyCurrentLocation;
        }
    
    
        public interface locationSuccessListener {
            void onLocationReceived();
        }
    

    你需要这样做:

    public class PlacesActivity extends SingleFragmentActivity implements NavigationView.OnNavigationItemSelectedListener, LocationManager.locationSuccessListener
    

    然后在你的活动中你会得到这个:

    @Override
        public void onLocationReceived() {
             Location l = LocationManager.getInstance().getMyCurrentLocation();
                 if (l==null){
                     Toast.makeText(this, "unable to get location", Toast.LENGTH_SHORT).show();
                     
                 }
        }
    

    要获得许可,您应该这样做:

    if (ContextCompat.checkSelfPermission(Objects.requireNonNull(getActivity()), Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(getActivity(),
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                        0);
                
    

    【讨论】:

    • 谢谢,但是 setLocation 方法中是否需要有权限?或者那只是我的IDE?另外,该方法到底在做什么?我已经创建了这个类的一个实例,并传递了一个新的 fusedlocationprovider。我应该直接在需要的地方调用 getMyCurrentLocation 方法还是在此之前做点什么?如果我在此之前不做任何事情,我想我会返回一个空值
    • 我想我还必须调用 set location 并传递当前活动。但是,您说我的活动需要在类中实现该接口,我该怎么做呢?我在 onLocationReceived 方法中实现了什么?
    • onLocationReceived 方法中的 RequestManager 到底是什么?另外,我需要创建一个位置管理器还是只调用该方法,然后创建一个 Location 字段来存储当前位置,然后可以在其他地方使用?
    • 我仍然返回空值,即使在调用 setLocation 之后,您能否提供更多详细信息:(
    • 另外,需要注意的是,如果直接在一个类上使用getInstance,返回的实例不会因为没有初始化而默认为null吗?
    猜你喜欢
    • 2015-05-06
    • 2011-01-16
    • 2012-01-25
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多