gpt4 book ai didi

android - 使用 AsyncTask 和 JSON 在 Google Maps APIv2 上按地址获取位置

转载 作者:行者123 更新时间:2023-11-30 02:37:16 25 4
gpt4 key购买 nike

我正在尝试在我的应用程序中实现一项功能,该功能允许您使用 Google Maps Api 按地址查找地点。
我正在尝试使用 AsyncTask 和 JSON 来执行此操作,但它总是抛出 org.json.JSONException index 0 out of range(即使该位置存在)。我曾经有下面的代码没有异步任务,但从 playstore 下载时它抛出异常。

private class FindByAddress extends AsyncTask<String, Void, LatLng> {
@Override
public LatLng doInBackground(String... placesName) {
HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?address=" +placesName+"&ka&sensor=false");
HttpClient client = new DefaultHttpClient();
HttpResponse response;
StringBuilder stringBuilder = new StringBuilder();

// Building/getting the JSON object...
try {
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
int b;
while ((b = stream.read()) != -1) {
stringBuilder.append((char) b);
}
} catch (ClientProtocolException e) { } catch (IOException e) { }

JSONObject jsonObject = new JSONObject();

try {
jsonObject = new JSONObject(stringBuilder.toString());
} catch (JSONException e) {
e.printStackTrace();
}

// Collect results
Double lon = new Double(0);
Double lat = new Double(0);

// IT MESSES UP HERE, index out of range [0..0) on getJSONObject
try {
lon = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");

lat = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");

} catch (JSONException e) {
e.printStackTrace();
}

return new LatLng(lat, lon);

}

@Override
protected void onPostExecute(LatLng latilen) {
// Show results
if(latilen.latitude!=0 && latilen.longitude!=0){
if(idioma.equals("english"))
Toast.makeText(MainActivity.this, "Location found", Toast.LENGTH_SHORT).show();
else if(idioma.equals("spanish"))
Toast.makeText(MainActivity.this, "Dirección encontrada", Toast.LENGTH_SHORT).show();
googleMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(latilen.latitude, latilen.longitude)));
}
else if(idioma.equals("english"))
Toast.makeText(MainActivity.this, "Location not found", Toast.LENGTH_SHORT).show();
else if(idioma.equals("spanish"))
Toast.makeText(MainActivity.this, "Dirección no encontrada", Toast.LENGTH_SHORT).show();
}
}

我在某处读到这需要在异步任务中,否则它会抛出 android.os.networkonmainthreadexception(这是我之前的问题)。当我没有在异步任务中使用它时,至少它在我的设备中有效(但从 PlayStore 下载时无效)。
有了这个 AsyncTask 东西就不管用了。

我曾经有this problem ,所以我不得不更改@Ani 在同一个问题的答案中显示的所有代码。

谢谢

最佳答案

如果我理解您正在尝试正确地做的事情,您为什么不直接使用 GeoCoder...

double lat, lng;
Geocoder coder = new Geocoder(this, Locale.US);
List<Address> results;
try{
results = = coder.getLocationFromName(placeName, 5); // 5 is max number of results
if(results != null){
Address location = results.get(0);
lat = location.getLatitude();
lng = location.getLongtitude();
}
}

编辑

由于您在地理编码方面遇到了一个奇怪的错误,我理解想要/需要使用替代方法。您基本上只是自己制作和解析代码(虽然我没有查看源代码,但可能是 GeoCoding 如何处理它)。多亏了你的链接,我才能够注意到罪魁祸首。

AsyncTasks doInBackground 方法参数采用数组形式。因此,您需要将 url 调用从 ... + placesName + ... 更改为 ... + placesName[0] + ...。很高兴我能提供帮助。祝你的项目好运!

关于android - 使用 AsyncTask 和 JSON 在 Google Maps APIv2 上按地址获取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26302862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com