Android Studio-解析来自Google Places Details API电话号码的JSON,首次运行时为空

问题描述 投票:0回答:1

这里有点奇怪的问题。目前,我正在进行一项活动,该活动使用Google Places Search API获取所有出租车公司的名称和地点ID,并将其放入列表视图。然后,当单击该项目时,它将获得地点ID,并运行Places Details API来获取电话号码。

[目前,我遇到的问题是,第一次在列表视图中单击该项目时,JSON解析器将返回NULL,并且电话将拨打6855或685-5之类的号码。如果您返回并单击相同或另一个项目,则电话号码将正确提取。

在活动中,我正在运行2个JSON解析器,但是它们在不同的时间运行。

onCreate:

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(获取并调用该数字-这是首次运行时返回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;

}

[起初我以为可能是在解析器完成之前调用了Dial Action,所以我将其移到jsonParseNumber的末尾以确保但仍会执行相同的操作。

快速注释:

2个活动中的JSON解析器

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

第二解析器使用地点ID从GOOGLE PLACES DETAILS获取JSON以获取电话号码

[运行第二个解析器时,它将在第一次运行时返回NULL,但是如果再次调用,它将返回返回的预期电话号码并拨打它。

java android json android-studio google-places-api
1个回答
0
投票

这是因为,当您返回“数字”时,您的数字为空。您无需等到api调用完成。最好在获得响应以执行特定操作时实现回调。

© www.soinside.com 2019 - 2024. All rights reserved.