【问题标题】:Google Maps API on Android not accepting Lat and Long values?Android 上的 Google Maps API 不接受 Lat 和 Long 值?
【发布时间】:2018-06-17 10:17:17
【问题描述】:

所以我想访问一个远程 mySQL 数据库并访问存储在那里的经纬度坐标。我编写了一个 config.php 和 fetch.php,以使用 JSON 获取数据,在此脚本中,在 onMapReady() 方法中未加载 latVal 和 longVal 值(它们是空白的),而它们在getJSON() 方法。为什么会这样?

代码:

package com.rageking.xyber.dashboardtest;

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.telecom.Connection;
import android.view.View;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.*;
import java.util.HashMap;

import com.google.android.gms.common.api.Response;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import org.json.JSONException;
import org.json.JSONObject;

public class ChildTrackerPage extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    ConnectionHTTP myCon = new ConnectionHTTP();

    String latVal, longVal;
    double latNum, longNum;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_child_tracker_page);
        getJSON("http://webgax.com/schoolapp/fetch.php");
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

    }

    public void goToMenu(View view) {
        Intent i1 = new Intent(this, UserHome.class);
        startActivity(i1);
    }

    private void getJSON(final String urlWebService) {

        class GetJSON extends AsyncTask<String, Void, String> {

            @Override
            public void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            public void onPostExecute(String s) {
                super.onPostExecute(s);
                //Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show();
                try {

                    JSONObject jsonObject = new JSONObject(s);
                    longVal = jsonObject.getString("lat");
                    latVal = jsonObject.getString("lng");
                   //Toast.makeText(getApplicationContext(),longVal, Toast.LENGTH_SHORT).show();
                   //Toast.makeText(getApplicationContext(),latVal,Toast.LENGTH_SHORT).show();

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public String doInBackground(String... strings) {
                HashMap<String,String> hashMap=new HashMap<>();
                return myCon.postRequest(hashMap, "http://webgax.com/schoolapp/fetch.php");

            }
        }

        GetJSON getJSON = new GetJSON();
        getJSON.execute();
    }

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

        //latNum =Double.parseDouble(latVal);
        //longNum = Double.parseDouble(longVal);

        //latNum = Double.valueOf(latVal);
        //longNum = Double.valueOf(longVal);

        Toast.makeText(getApplicationContext(),latVal,Toast.LENGTH_LONG).show();
        //Toast.makeText(getApplicationContext(),longVal,Toast.LENGTH_LONG).show();

        LatLng addr = new LatLng(22, 88);

        float zoomLevel = 16; //This goes up to 21

        mMap.addMarker(new MarkerOptions().position(addr).title("WebGax"));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(addr, zoomLevel));

        }
    }

【问题讨论】:

  • 您正在执行一个异步任务,您无法控制它何时结束以获取您的值并期望这些值在您的“onMapReady”调用中加载...您是否尝试过调用您的 GetJSON调用 onMapReady 之后的任务,然后在您的帖子执行中设置标记/相机?
  • 你想用 String latVal , longVal 做什么;
  • @GhostDerfel 嗯......你是对的,但你能详细说明我应该怎么做吗?我是第一次使用异步任务和 JSON,所以有点混乱。
  • @benid 给我一点时间,我会发布你的更新代码以适应它
  • @KapilParmar 我想从 JSON 中获取 latVal 和 longVal 并将其转换为浮点数并将标记设置为地图中的标记。这些是 lat 和 long 值。

标签: java android json google-maps-markers google-maps-android-api-2


【解决方案1】:

正如 cmets 中所述,您应该在地图准备好更新后尝试更新地图... 使用您的初始代码,您可以调用 AsyncTask 之前,根据服务器的响应时间,当您拥有 lat 和 long 值时,可能会导致地图准备就绪。

请查看下面的建议,我只是从 onCreate 调用中删除对您的异步任务的调用,并将其移动到地图准备好接收数据之后。

public class ChildTrackerPage extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    private ConnectionHTTP myCon = new ConnectionHTTP();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_child_tracker_page);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    public void goToMenu(View view) {
        Intent i1 = new Intent(this, UserHome.class);
        startActivity(i1);
    }

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

        GetJSON getJSON = new GetJSON();
        getJSON.execute();
    }

    private class GetJSON extends AsyncTask<String, Void, String> {

        @Override
        public String doInBackground(String... strings) {
            HashMap<String,String> hashMap=new HashMap<>();
            return myCon.postRequest(hashMap, "http://webgax.com/schoolapp/fetch.php");
        }

        @Override
        public void onPostExecute(String s) {
            JSONObject jsonObject = new JSONObject(s);
            //I'm not sure why you do that instead of just using optDouble on your JSON but I don't know the contect of your JSON
            String longVal = jsonObject.getString("lat");
            String latVal = jsonObject.getString("lng");
            double latNum = Double.parseDouble(latVal);
            double longNum = Double.parseDouble(longVal);

            LatLng addr = new LatLng(latNum, longNum);
            float zoomLevel = 16; //This goes up to 21

            if(mMap!=null){
                mMap.addMarker(new MarkerOptions().position(addr).title("WebGax"));
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(addr, zoomLevel));
            }
        }

    }

}

【讨论】:

  • 嘿..非常感谢!这解决了我的问题。请问您学习了哪些教程,或者您从哪里学习 JSON 和编程?
  • 很难指向单一来源,因为这个问题很简单,一切都来自经验(我过去犯过同样的错误)......只要继续编码,你应该被授予,也尝试了解更好的android生命周期,你会在这里找到很多资料:developer.android.com/guide/components/activities/…
猜你喜欢
  • 1970-01-01
  • 2016-09-18
  • 2012-01-29
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
相关资源
最近更新 更多