AndroidでGoogle Maps API v2を使用していますが、正常に動作します。ただし、ジオコーダーを使用して住所の経度と緯度を取得しようとしていますが、成功しません。
V2からそれを行う方法を変更しましたか?
私は従来のコードを使用しています
Geocoder gc = new Geocoder(context);
//...
List<Address> list = gc.getFromLocationName("1600 Amphitheatre Parkway, Mountain View, CA", 1);
Address address = list.get(0);
double lat = address.getLatitude();
double lng = address.getLongitude();
//...
常に強制シャットダウンを返し、Logは何も解決しません。 try/catchのブロックを使用する場合、マップを開きますが、常に同じ場所でインターネットアクセス許可を使用します。プロジェクトに含まれているCOARSE_LOCATIONここや他のサイトにあるさまざまなコードを使用しましたが、成功しませんでした。
前もって感謝します。
このURLの例を使用してこのソリューションを試してください。
http://maps.google.com/maps/api/geocode/json?address=mumbai&sensor=false
json
のlat/lng
でaddress
形式のデータを返します。
private class DataLongOperationAsynchTask extends AsyncTask<String, Void, String[]> {
ProgressDialog dialog = new ProgressDialog(MainActivity.this);
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.setMessage("Please wait...");
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
@Override
protected String[] doInBackground(String... params) {
String response;
try {
response = getLatLongByURL("http://maps.google.com/maps/api/geocode/json?address=mumbai&sensor=false");
Log.d("response",""+response);
return new String[]{response};
} catch (Exception e) {
return new String[]{"error"};
}
}
@Override
protected void onPostExecute(String... result) {
try {
JSONObject jsonObject = new JSONObject(result[0]);
double lng = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");
double lat = ((JSONArray)jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");
Log.d("latitude", "" + lat);
Log.d("longitude", "" + lng);
} catch (JSONException e) {
e.printStackTrace();
}
if (dialog.isShowing()) {
dialog.dismiss();
}
}
}
public String getLatLongByURL(String requestURL) {
URL url;
String response = "";
try {
url = new URL(requestURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
conn.setDoOutput(true);
int responseCode = conn.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = br.readLine()) != null) {
response += line;
}
} else {
response = "";
}
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
これがあなたのお役に立てば幸いです。
これを試してください。
private void getLatLongFromAddress(String address)
{
double lat= 0.0, lng= 0.0;
Geocoder geoCoder = new Geocoder(this, Locale.getDefault());
try
{
List<Address> addresses = geoCoder.getFromLocationName(address , 1);
if (addresses.size() > 0)
{
GeoPoint p = new GeoPoint(
(int) (addresses.get(0).getLatitude() * 1E6),
(int) (addresses.get(0).getLongitude() * 1E6));
lat=p.getLatitudeE6()/1E6;
lng=p.getLongitudeE6()/1E6;
Log.d("Latitude", ""+lat);
Log.d("Longitude", ""+lng);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
httpClientは減価償却されているため、Asynctaskで次のコードを試すことができます(アドレスをURLにエンコードする必要があることに注意してください)。
public class GeoCoding extends AsyncTask<Void, Void, Void> {
private String address;
private static final String TAG = GeoCoding.class.getSimpleName();
JSONObject jsonObj;
String URL;
private String Address1 = "", Address2 = "", City = "", State = "", Country = "", County = "", PIN = "", Area="";
private double latitude, longitude;
HttpURLConnection connection;
BufferedReader br;
StringBuilder sb ;
public GeoCoding(String address){
this.address = address;
}
public String getArea(){
return Area;
}
public void getAddress() {
Address1 = "";
Address2 = "";
City = "";
State = "";
Country = "";
County = "";
PIN = "";
Area ="";
try {
String Status = jsonObj.getString("status");
if (Status.equalsIgnoreCase("OK")) {
JSONArray Results = jsonObj.getJSONArray("results");
JSONObject zero = Results.getJSONObject(0);
JSONArray address_components = zero.getJSONArray("address_components");
for (int i = 0; i < address_components.length(); i++) {
JSONObject zero2 = address_components.getJSONObject(i);
String long_name = zero2.getString("long_name");
JSONArray mtypes = zero2.getJSONArray("types");
String Type = mtypes.getString(0);
if (! TextUtils.isEmpty(long_name) || !long_name.equals(null) || long_name.length() > 0 || !long_name.equals("")) {
if (Type.equalsIgnoreCase("street_number")) {
Address1 = long_name + " ";
} else if (Type.equalsIgnoreCase("route")) {
Address1 = Address1 + long_name;
} else if (Type.equalsIgnoreCase("sublocality")) {
Address2 = long_name;
} else if (Type.equalsIgnoreCase("locality")) {
City = long_name;
} else if (Type.equalsIgnoreCase("administrative_area_level_2")) {
County = long_name;
} else if (Type.equalsIgnoreCase("administrative_area_level_1")) {
State = long_name;
} else if (Type.equalsIgnoreCase("country")) {
Country = long_name;
} else if (Type.equalsIgnoreCase("postal_code")) {
PIN = long_name;
}else if( Type.equalsIgnoreCase("neighborhood")){
Area = long_name;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void getGeoPoint(){
try{
longitude = ((JSONArray)jsonObj.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");
latitude = ((JSONArray)jsonObj.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");
}catch (Exception e){
e.printStackTrace();
}
}
@Override
protected Void doInBackground(Void... params) {
try {
StringBuilder urlStringBuilder = new StringBuilder("http://maps.google.com/maps/api/geocode/json");
urlStringBuilder.append("?address=" + URLEncoder.encode(address, "utf8"));
urlStringBuilder.append("&sensor=false");
URL = urlStringBuilder.toString();
Log.d(TAG, "URL: " + URL);
URL url = new URL(URL);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoInput(true);
connection.connect();
br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb = sb.append(line + "\n");
}
}catch (Exception e){e.printStackTrace(); }
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
try {
Log.d(TAG, "response code: " + connection.getResponseCode());
jsonObj = new JSONObject(sb.toString());
Log.d(TAG, "JSON obj: " + jsonObj);
getAddress();
Log.d(TAG, "area is: " + getArea());
getGeoPoint();
Log.d("latitude", "" + latitude);
Log.d("longitude", "" + longitude);
}
} catch (Exception e) {
e.printStackTrace();
}
super.onPostExecute(aVoid);
}
}
私のために働いた簡単な修正は、デバイスでインターネット接続を有効にすることです。 Pxaml による提案。