Android Studio - 从 Google 地点详细信息 API 解析 JSON Phone 第一个 运行 给出空值的数字

Android Studio - Parsing JSON from Google Places Details API Phone Number giving null on first run

这里有一个 st运行ge 问题。目前我有一个 activity,它使用 Google Places Search API 获取所有出租车公司的名称和地点 ID,并将它们放入列表视图中。然后,当单击该项目时,它将使用地点 ID 和 运行 地点详细信息 API 来获取 phone 号码。

目前我运行正在解决以下问题:第一次在列表视图中单击该项目时,JSON 解析器将 return 一个 NULL 而 phone 将拨打 6855 或 685-5 等号码。如果您返回并单击相同的项目或其他项目,那么 phone 号码将正确获取。

在 activity 我是 运行 宁 2 JSON 解析器但是他们 运行 在不同的时间。

创建时:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_taxi);
    mQueue = Volley.newRequestQueue(this);
    pQueue = Volley.newRequestQueue(this);
    listItem = new ArrayList<>();
    placeid = new ArrayList<>();
    police = findViewById(R.id.textView11);
    userlist = findViewById(R.id.users_list);
    jsonParse();
    userlist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String phone = jsonParseNumber(position);
            }
        });
    }

jsonParse(获取本地出租车公司名称)

        private void jsonParse() {
        String url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=51.6232817,0.2919483&radius=1000&type=taxi%20service&keyword=taxi&key=APIKEY";
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray jsonArray = response.getJSONArray("results");
                for (int i = 0; i < jsonArray.length(); i++){
                    JSONObject result = jsonArray.getJSONObject(i);
                    String name = result.getString("name");
                    String id = result.getString("place_id");
                    placeid.add(id);
                    listItem.add(name);
                }
                adapter = new ArrayAdapter(Taxi.this, R.layout.row, listItem);
                userlist.setAdapter(adapter);
            } catch (JSONException e) {
                e.printStackTrace();
            }

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

    mQueue.add(request);
}

jsonParseNumber(获取数字并调用它 - 这是第一个 returning NULL 的代码 运行)

private String jsonParseNumber(int pos) {
    String id = placeid.get(pos);
    String url = "https://maps.googleapis.com/maps/api/place/details/json?placeid="+id+"&key=APIKEY";
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONObject jsonArray = response.getJSONObject("result");
                for (int i = 0; i < jsonArray.length(); i++){
                    number = jsonArray.getString("formatted_phone_number");
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

    pQueue.add(request);
    Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel: " + number));
    startActivity(intent);
    return number;

}

起初我认为可能是在解析器完成之前调用了拨号操作,所以我将它移到 jsonParseNumber 的末尾以确保但它仍然执行相同的操作。

快速笔记:

2 JSON 个解析器 Activity

第一个解析器从 GOOGLE PLACES SEARCH API 获取 JSON 以获取该地区出租车公司的名称和地点 ID

2nd Parser 使用地点 ID 从 GOOGLE PLACES DETAILS 中获取 JSON 以获取 phone 编号

当第二个解析器是 运行 时,它将 return 第一个 运行 上的 NULL 但是如果再次调用它将 return return预期的 phone 号码并拨打它。

因为,你return"number"时你的号码是空的。您不会等到 api 调用完成。最好在获得执行特定操作的响应时实现回调。