【问题标题】:Android MapView getlongitude and getlatitude returns 0.0 on volley requestAndroid MapView getlongitude 和 getlatitude 在 volley 请求中返回 0.0
【发布时间】:2016-10-23 15:58:04
【问题描述】:

您好,我对位置获取经度和纬度有疑问。 在我的数据库中它总是 0.0。

它使用 volley 来传递 lngs 和 lats 变量,但当它到达时值为 0.0

变量 lats 和 lngs 应该已经在 onLocationChanged() 函数中更新了

这是我的一些代码

Private double lats;
Private double lngs;

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    View myinflate = inflater.inflate(R.layout.fragment_home, container, false);
    final TextView usr = (TextView)myinflate.findViewById(R.id.user);



    Bundle extras = getActivity().getIntent().getExtras();
    usrnme = extras.getString("user");


    requestQueue = Volley.newRequestQueue(getActivity());


    locationManager = (LocationManager) getActivity().getSystemService(getActivity().LOCATION_SERVICE);

    listener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            lats=location.getLatitude();
            lngs=location.getLongitude();

        }

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

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    };


    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            ActivityCompat.requestPermissions(getActivity(),PERMISSIONS_LOCATION,REQUEST_LOCATION);

        }

    }
    else
    {
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
    }





            StringRequest request = new StringRequest(Request.Method.POST, insertUrl, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {

                }

            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {


                }
            }) {

                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
                    Map<String, String> parameters = new HashMap<String, String>();
                    parameters.put("usr", usrnme);
                    parameters.put("lat", Double.toString(lats));
                    parameters.put("lng", Double.toString(lngs));

                    return parameters;
                }
            };
            requestQueue.add(request);

【问题讨论】:

    标签: android gps fragment android-volley android-mapview


    【解决方案1】:

    我认为您提前将 lats 和 longs 交给服务器。相反,在您从 locationManager 侦听器调用 onLocationChanged 方法后立即发送位置。

    Private double lats;
    Private double lngs;
    
     @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    
        // Inflate the layout for this fragment
        View myinflate = inflater.inflate(R.layout.fragment_home, container, false);
        final TextView usr = (TextView)myinflate.findViewById(R.id.user);
    
    
    
        Bundle extras = getActivity().getIntent().getExtras();
        usrnme = extras.getString("user");
    
    
        requestQueue = Volley.newRequestQueue(getActivity());
    
    
        locationManager = (LocationManager) getActivity().getSystemService(getActivity().LOCATION_SERVICE);
    
        listener = new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                lats=location.getLatitude();
                lngs=location.getLongitude();
    
                StringRequest request = new StringRequest(Request.Method.POST, insertUrl, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
    
                    }
    
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
    
    
                    }
                }) {
    
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String, String> parameters = new HashMap<String, String>();
                        parameters.put("usr", usrnme);
                        parameters.put("lat", Double.toString(lats));
                        parameters.put("lng", Double.toString(lngs));
    
                        return parameters;
                    }
                };
                requestQueue.add(request);
    
            }
    
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
    
            }
    
            @Override
            public void onProviderEnabled(String provider) {
    
            }
    
            @Override
            public void onProviderDisabled(String provider) {
    
            }
        };
    
    
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    
                ActivityCompat.requestPermissions(getActivity(),PERMISSIONS_LOCATION,REQUEST_LOCATION);
    
            }
    
        }
        else
        {
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
        }
    

    【讨论】:

    • 谢谢!有效! lats 和 lngs 现在在我的数据库中!但是,当我尝试在地图中的标记中使用 lats 和 lngs 变量时,它会将我发送到非洲!大声笑,这不等于发送的相同 lats 和 lngs 变量..有什么想法吗?
    • 来自onLocationChanged,您能否在 lats 和 lngs 值上记录一个日志,然后将值放在 www.maps.google.com 以查看它的实际位置?如果它仍然将您带到非洲,那么您从服务器获取的位置确实由您的应用提供。
    • 这是异步行为。 onLocationChanged 方法在获取位置后被调用。通常需要几毫秒。现在,如果您在侦听器之外记录 lat long 值,编译器将立即执行该行。所以,它得到了空白值。
    • 将更新的位置值从 onLocationChanged 方法传递到您的标记。这将使您的标记具有更新的位置。如果您只是将标记代码放在侦听器之外,那么您使用的是 lat long 的声明值。
    • 是的,当然。创建一个方法,例如createMarker(double latVal, double longVal),您可以在其中输入标记相关代码。此方法将采用 lat long 值作为方法参数。现在,只需从您的 onLocationChanged 方法中调用该方法,并使用您更新的 lats 和 lng 变量,如下所示,public void onLocationChanged(Location location) { lats=location.getLatitude(); lngs=location.getLongitude(); createMarker(lats, lngs); // other code
    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多