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 调用完成。最好在获得执行特定操作的响应时实现回调。
这里有一个 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 调用完成。最好在获得执行特定操作的响应时实现回调。