0

我正在爲android製作應用程序。我使用Google地圖反向地理編碼器反向地理編碼一組座標,並解析返回的JSON以提取城市名稱。但不是像「紐約」這樣的城市名稱,它是返回[email protected](4025)谷歌地圖反向地理編碼器返回亂碼而不是城市名稱?

我做錯了什麼,而不是一個真正的答案?謝謝。

這裏是ParsingAsyncClass:

package com.example.gecoding_example; 

import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.BasicResponseHandler; 
import org.json.JSONArray; 
import org.json.JSONObject; 

import android.net.http.AndroidHttpClient; 
import android.os.AsyncTask; 
import android.util.Log; 

public class ParsingAsyncClass extends AsyncTask { 
    String cityName = null; 
    @Override 
    protected String doInBackground(Object... arg0) 
     {double latitude=40.7130; 
     double longitude=74.0135; 
     final AndroidHttpClient ANDROID_HTTP_CLIENT = AndroidHttpClient.newInstance(GecodingActivity.class.getName()); 

      String googleMapUrl = "http://maps.googleapis.com/maps/api/geocode/json?latlng=" +latitude + "," 
        +longitude + "&sensor=false&language=fr"; 

      try 
      { 
       JSONObject googleMapResponse = new JSONObject(ANDROID_HTTP_CLIENT.execute(new HttpGet(googleMapUrl), 
         new BasicResponseHandler())); 

       // many nested loops.. not great -> use expression instead 
       // loop among all results 
       JSONArray results = (JSONArray) googleMapResponse.get("results"); 
       for (int i = 0; i < results.length(); i++) 
       { 
        // loop among all addresses within this result 
        JSONObject result = results.getJSONObject(i); 
        if (result.has("address_components")) 
        { 
         JSONArray addressComponents = result.getJSONArray("address_components"); 
         // loop among all address component to find a 'locality' or 'sublocality' 
         for (int j = 0; j < addressComponents.length(); j++) 
         { 
          JSONObject addressComponent = addressComponents.getJSONObject(j); 
          if (result.has("types")) 
          { 
           JSONArray types = addressComponent.getJSONArray("types"); 

           // search for locality and sublocality 


           for (int k = 0; k < types.length(); k++) 
           { 
            if ("locality".equals(types.getString(k)) && cityName == null) 
            { 
             if (addressComponent.has("long_name")) 
             { 
              cityName = addressComponent.getString("long_name"); 
             } 
             else if (addressComponent.has("short_name")) 
             { 
              cityName = addressComponent.getString("short_name"); 
             } 
            } 
            if ("sublocality".equals(types.getString(k))) 
            { 
             if (addressComponent.has("long_name")) 
             { 
              cityName = addressComponent.getString("long_name"); 
             } 
             else if (addressComponent.has("short_name")) 
             { 
              cityName = addressComponent.getString("short_name"); 
             } 
            } 
           } 
           if (cityName != null) 
           { 
            Log.d("Geoco== "+cityName, "tag"); 
            return cityName; 

           } 
          } 
         } 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       Log.d(e.toString(),"tag"); 
      } 
      return null; 
     } 




    @Override 
    protected void onPostExecute(Object cityaName){ 
     super.onPostExecute(cityaName); 
     String a; 
     a=cityaName.toString(); 
     if (cityaName != null) 
     { 
      // Do something with cityName 
      Log.d("GeocoderHelpe123" + 
        "r"+cityaName, "tag"); 
     }else{Log.d("GeocoderHelper232"+cityaName, "tag");} 
    } 

} 
+0

'Log.d( 「Geoco ==」 +的cityName, 「標籤」 );'。這條線打印給你什麼? – iTurki

+0

@iturki在LogCat內打印'Geoco == [email protected](4025)'。 –

+0

你可以發佈你使用的lat&lng嗎? – iTurki

回答

0

要調用的類toString(),但還沒有實施的toString()方法,返回你所感興趣的性質是什麼,你看到的是的十六進制表示你的對象的哈希碼。

a=cityaName.toString(); 
+0

請你詳細說明,如何獲得正確的文本輸出?我在doInBackground方法中有一個Log.d,並返回亂碼值。我還沒有用過toString()。 –

+0

您只發布了部分代碼......無論是將「Object」傳遞給「onPostExecute()」,都需要傳遞城市名稱的字符串或城市名稱作爲屬性的對象,例如'String city = myObj.cityName;' – doublesharp

1

這花了我一段時間纔得到(很多Googleing和試驗錯誤),但它的工作原理! :)享受和感謝耶穌基督。

protected class RetrieveGoogleMapsCityName extends AsyncTask<URL, Integer, Void> { 
    protected AppCompatActivity a; 
    protected AlertDialog dialog; 

    private RetrieveGoogleMapsCityName(AppCompatActivity a) { 
     this.a = a; 
    } 

    @Override 
    protected void onPreExecute() { 
     this.dialog = new AlertDialog.Builder(this.a).create(); 
     this.dialog.setCancelable(false); 
     this.dialog.setMessage("*****"); 
     this.dialog.setTitle("*****"); 
     this.dialog.show(); 
    } 

    @Override 
    protected Void doInBackground(URL... urls) { 
     try { 
      final HttpURLConnection conn; 
      conn = (HttpURLConnection) urls[0].openConnection(); 
      conn.setUseCaches(false); 
      conn.setAllowUserInteraction(false); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), 
        "UTF-8"), 8); 

      StringBuilder sb = new StringBuilder(); 

      String line; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      if (!sb.toString().isEmpty()) { 
       JSONObject obj = new JSONObject(sb.toString()); 
       JSONArray results = obj.getJSONArray("results"); 
       JSONArray address_components = results.getJSONObject(0).getJSONArray("address_components"); 

       for (int i = 0; i < address_components.length(); i++) { 
        //Log.v("JSONArray", address_components.getJSONObject(i).getString("long_name")); 
        //Log.v("JSONArrayTypes", address_components.getJSONObject(i).getJSONArray("types").getString(0)); 

        if (address_components.getJSONObject(i).getJSONArray("types").getString(0).contentEquals("locality")) { 
         Log.v("JSONArray:i", i + " " + address_components.getJSONObject(i).getString("long_name")); 
         cityName = address_components.getJSONObject(i).getString("long_name"); 
        } 
        if (address_components.getJSONObject(i).getJSONArray("types").getString(0).contentEquals("administrative_area_level_1")) { 
         stateLetters = address_components.getJSONObject(i).getString("short_name"); 
        } 
       } 
       /*cityName = 
         obj.getJSONArray("results").getJSONObject(0) 
           .getJSONArray("address_components").getJSONObject(1).getString("long_name"); 
       stateLetters = obj.getJSONArray("results").getJSONObject(0) 
         .getJSONArray("address_components").getJSONObject(4).getString("short_name");*/ 
      } 
      if (conn != null) { 
       conn.disconnect(); 
      } 
      if (reader != null) { 
       reader.close(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void v) { 
     this.dialog.dismiss(); 
     hasLocation = true; 
     Log.v("onPostExecute", "You are located in " + cityName + ", " + stateLetters); 
    } 
} 

結果:你是位於北卡羅來納州夏洛特市 結果2:您是位於英國倫敦的

相關問題