java - Android Studio - 从 Google Places Details API 电话号码解析 JSON,首次运行时给出 null

标签 java android json android-studio google-places-api

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

目前,我遇到了这样的问题:第一次在 ListView 中单击该项目时,JSON 解析器将返回 NULL,并且手机将调用 6855 或 685-5 等号码。如果您返回并单击同一项目或另一个项目,则电话号码将正确获取。

在 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(获取数字并调用它 - 这是第一次运行时返回 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 的末尾以确保但它仍然执行相同的操作。

快速说明:

Activity 中的 2 个 JSON 解析器

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

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

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

最佳答案

这是因为,当您返回“number”时,您的号码为空。您不会等到 api 调用完成。最好在收到执行特定操作的响应时实现回调。

关于java - Android Studio - 从 Google Places Details API 电话号码解析 JSON,首次运行时给出 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61345141/

相关文章:

java - JDBC:查看查询是否成功?

java - 安卓 : How to add images in Tab Host

java - 在 Eclipse 中创建自定义 Android 项目模板?

Android Volley 错误抛出 200 状态代码

java - 忽略 RuntimeTypeAdapterFactory 中未注册的子类型

java - 在java中检测汉字

java - 通过物体增加时间

java - CheckBox 不响应选中状态 (Android Studio)

c# - 始终在 WCF 服务中使用 Json 返回 XML 字符串

java - 震动变换 : Change field value based on the value in a nested element