如何将地图聚焦到用户位置?

费迪毒液

我创建了一个MapActivity将地图聚焦到用户位置的地图。

public void getMyLatLng() {
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    LocationListener ll = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status,
                Bundle extras) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onLocationChanged(Location location) {
            myLatLng = new LatLng(location.getLatitude(),location.getLongitude());
        }
    };
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll);
    lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    //myLatLng = new LatLng(myLoc.getLatitude(), myLoc.getLongitude());
}

java.lang.NullPointerException第一次运行时出现问题。但是,当我再次运行它时,它可以工作。第二个问题是,当我放置NETWORK_PROVIDER而不是GPS_PROVIDER时,它将很好地工作。有什么建议可以解决这个问题吗?

维普尔米塔尔

您可以从GPS和nework请求更新位置,例如:

 public class LocationService implements LocationListener {

    boolean isGPSEnabled = false;

    boolean isNetworkEnabled = false;

    boolean canGetLocation = false;

    final static long MIN_TIME_INTERVAL = 60 * 1000L;

    Location location;


    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; // 10

    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1; // 1 minute

    protected LocationManager locationManager;

    private CountDownTimer timer = new CountDownTimer(5 * 1000, 1000) {

        public void onTick(long millisUntilFinished) {

        }

        public void onFinish() {
            stopUsingGPS();
        }
    };

    public LocationService() {
        super(R.id.gps_service_id);
    }


    public void start() {
        if (Utils.isNetworkAvailable(context)) {

            try {


                timer.start();


                locationManager = (LocationManager) context
                        .getSystemService(Context.LOCATION_SERVICE);

                isGPSEnabled = locationManager
                        .isProviderEnabled(LocationManager.GPS_PROVIDER);

                isNetworkEnabled = locationManager
                        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
                this.canGetLocation = true;
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        Location tempLocation = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (tempLocation != null
                                && isBetterLocation(tempLocation,
                                        location))
                            location = tempLocation;
                    }
                }
                if (isGPSEnabled) {

                    locationManager.requestSingleUpdate(
                            LocationManager.GPS_PROVIDER, this, null);
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("GPS Enabled", "GPS Enabled");
                    if (locationManager != null) {
                        Location tempLocation = locationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (tempLocation != null
                                && isBetterLocation(tempLocation,
                                        location))
                            location = tempLocation;
                    }
                }

            } catch (Exception e) {
                onTaskError(e.getMessage());
                e.printStackTrace();
            }
        } else {
            onOfflineResponse(requestData);
        }
    }

    public void stopUsingGPS() {
        if (locationManager != null) {
            locationManager.removeUpdates(LocationService.this);
        }
    }

    public boolean canGetLocation() {
        locationManager = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        isGPSEnabled = locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        // getting network status
        isNetworkEnabled = locationManager
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        return isGPSEnabled || isNetworkEnabled;
    }

    @Override
    public void onLocationChanged(Location location) {

        if (location != null
                && isBetterLocation(location, this.location)) {

            this.location = location;

        }
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public Object getResponseObject(Object location) {
        return location;
    }

    public static boolean isBetterLocation(Location location,
            Location currentBestLocation) {
        if (currentBestLocation == null) {
            // A new location is always better than no location
            return true;
        }

        // Check whether the new location fix is newer or older
        long timeDelta = location.getTime() - currentBestLocation.getTime();
        boolean isSignificantlyNewer = timeDelta > MIN_TIME_INTERVAL;
        boolean isSignificantlyOlder = timeDelta < -MIN_TIME_INTERVAL;
        boolean isNewer = timeDelta > 0;

        // If it's been more than two minutes since the current location,
        // use the new location
        // because the user has likely moved
        if (isSignificantlyNewer) {
            return true;
            // If the new location is more than two minutes older, it must
            // be worse
        } else if (isSignificantlyOlder) {
            return false;
        }

        // Check whether the new location fix is more or less accurate
        int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation
                .getAccuracy());
        boolean isLessAccurate = accuracyDelta > 0;
        boolean isMoreAccurate = accuracyDelta < 0;
        boolean isSignificantlyLessAccurate = accuracyDelta > 200;

        // Check if the old and new location are from the same provider
        boolean isFromSameProvider = isSameProvider(location.getProvider(),
                currentBestLocation.getProvider());

        // Determine location quality using a combination of timeliness and
        // accuracy
        if (isMoreAccurate) {
            return true;
        } else if (isNewer && !isLessAccurate) {
            return true;
        } else if (isNewer && !isSignificantlyLessAccurate
                && isFromSameProvider) {
            return true;
        }
        return false;
    }

}

请注意,每次获取位置时,我们都将其与已知位置进行比较,以通过调用isBetterLocation更好地找到该新位置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android 地图 - 如何自动将地图居中到用户的当前位置?

来自分类Dev

如何将地图的位置保持在KML层而不是用户的当前位置?

来自分类Dev

如何将JSpinner绑定到地图?

来自分类Dev

在聚焦其他组以打开文件后,如何将焦点恢复到快速面板?

来自分类Dev

如何将地图键值收集到列表中

来自分类Dev

如何将值传递到地图中?

来自分类Dev

如何将Enum类型存储到地图中?

来自分类Dev

Cassandra:如何将PreparedStatement绑定到地图数据

来自分类Dev

在Leaflet.js中,如何将地图聚焦在外部JS突出显示的多边形上?

来自分类Dev

如何在地图片段上绘制从当前位置到用户输入位置的路径?

来自分类Dev

如何将文件保存到用户可访问的位置?

来自分类Dev

如何将地图复制到另一张地图

来自分类Dev

如何将JFrame固定到特定位置?

来自分类Dev

如何将游戏对象放置到鼠标位置

来自分类Dev

如何将URL定位到特定位置

来自分类Dev

熊猫,如何将列表传递到列表位置

来自分类Dev

如何将容器定位到固定位置?

来自分类Dev

如何将位置分享到 Whatsapp、Facebook 等

来自分类Dev

如何将 Renderable 放置到 HitTestResult getPoint() 位置

来自分类Dev

如何将Web用户控件呈现到PlaceHolder中

来自分类Dev

如何将CUPS打印机绑定到用户?

来自分类Dev

如何将Middleman网站部署到GitHub用户页面

来自分类Dev

如何将Microsoft用户从Azure同步到Keycloak

来自分类Dev

如何将CUPS打印机绑定到用户?

来自分类Dev

如何将Linux用户导入到GitLab?

来自分类Dev

如何将root的权限复制到当前用户?

来自分类Dev

iOS MKMapView-如果用户已平移/拖动地图视图,则停止将地图视图重新居中到用户的位置

来自分类Dev

如何将指令自动聚焦调整为自动聚焦=“ true” /“ false”?

来自分类Dev

如何将当前位置的地图绘制为特定的纬度经度值

Related 相关文章

  1. 1

    Android 地图 - 如何自动将地图居中到用户的当前位置?

  2. 2

    如何将地图的位置保持在KML层而不是用户的当前位置?

  3. 3

    如何将JSpinner绑定到地图?

  4. 4

    在聚焦其他组以打开文件后,如何将焦点恢复到快速面板?

  5. 5

    如何将地图键值收集到列表中

  6. 6

    如何将值传递到地图中?

  7. 7

    如何将Enum类型存储到地图中?

  8. 8

    Cassandra:如何将PreparedStatement绑定到地图数据

  9. 9

    在Leaflet.js中,如何将地图聚焦在外部JS突出显示的多边形上?

  10. 10

    如何在地图片段上绘制从当前位置到用户输入位置的路径?

  11. 11

    如何将文件保存到用户可访问的位置?

  12. 12

    如何将地图复制到另一张地图

  13. 13

    如何将JFrame固定到特定位置?

  14. 14

    如何将游戏对象放置到鼠标位置

  15. 15

    如何将URL定位到特定位置

  16. 16

    熊猫,如何将列表传递到列表位置

  17. 17

    如何将容器定位到固定位置?

  18. 18

    如何将位置分享到 Whatsapp、Facebook 等

  19. 19

    如何将 Renderable 放置到 HitTestResult getPoint() 位置

  20. 20

    如何将Web用户控件呈现到PlaceHolder中

  21. 21

    如何将CUPS打印机绑定到用户?

  22. 22

    如何将Middleman网站部署到GitHub用户页面

  23. 23

    如何将Microsoft用户从Azure同步到Keycloak

  24. 24

    如何将CUPS打印机绑定到用户?

  25. 25

    如何将Linux用户导入到GitLab?

  26. 26

    如何将root的权限复制到当前用户?

  27. 27

    iOS MKMapView-如果用户已平移/拖动地图视图,则停止将地图视图重新居中到用户的位置

  28. 28

    如何将指令自动聚焦调整为自动聚焦=“ true” /“ false”?

  29. 29

    如何将当前位置的地图绘制为特定的纬度经度值

热门标签

归档