这里有一个奇怪的问题。目前,我有一个 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/