2010-12-31 31 views
4

私は最後の2日間、IllegalArgumentExceptionエラーで私は外出しています。アドレスから座標を取得しようとしたときにAndroidコードで受け取るエラーが発生しました。また、逆の場合でも経度からアドレスを取得します。および緯度。これはコードですが、エラーは表示されません。 Google検索で簡単に見つかる標準のコードスニペットです。geocoder.getFromLocationNameはnullのみを返します

public GeoPoint determineLatLngFromAddress(Context appContext, String strAddress) { 
    Geocoder geocoder = new Geocoder(appContext, Locale.getDefault()); 
    GeoPoint g = null; 
    try { 
     System.out.println("str addres: " + strAddress); 
     List<Address> addresses = geocoder.getFromLocationName(strAddress, 5); 
     if (addresses.size() > 0) { 
      g = new GeoPoint(
       (int) (addresses.get(0).getLatitude() * 1E6), 
       (int) (addresses.get(0).getLongitude() * 1E6) 
      ); 
     } 
    } catch (Exception e) { 
     throw new IllegalArgumentException("locationName == null"); 
    } 
    return g; 
} 

これらのmanifest.xmlファイルからの許可されている:私は、GoogleのAPIキーがあまりにも宣言したん

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 

<uses-library android:name="com.google.android.maps" />

を上記のコードから、geocoderは、nullではありませんどちらもaddressまたはappContextであり、私はここでつまずく:geocoder.getFromLocationName(strAddress, 5);

は、私はGoogleの検索の多くを行なったし、働いていた何も見つからなかった、と私が見つけた最も重要な情報はこれです:

ジオコーダクラスがコアアンドロイドフレームワークに含まれていないバックエンドサービスを必要とします。

Sooo、私は今混乱しています。どのようなコードを呼び出すか、インポートし、追加して、コード内で使用する必要がありますか? 私はGoogle API 2.2、APIレベル8を使用しています。 誰かがこれについての解決策、またはドキュメントのためのポインタを見つけた場合は、私が発見しなかったものをお知らせください。

答えて

0

Android 2.0でコードを実行すると動作します。私はmayコードと同じ問題を抱えていました。 2.2で動作しない理由は分かりません

+0

Android2.0で試してみます。ありがとうございます。うまくいけばうまくいきます。そうなら、お知らせします。明けましておめでとうございます! – test

+0

お誕生日おめでとう! – Sandy

11

私は同様の問題があり、結果が得られるまでジオコーダーをポーリングしています。ここで私はそれをやった、これまでのところ素晴らしいです。

try { 
    List<Address> geoResults = geocoder.getFromLocationName("<address goes here>", 1); 
    while (geoResults.size()==0) { 
     geoResults = geocoder.getFromLocationName("<address goes here>", 1); 
    } 
    if (geoResults.size()>0) { 
     Address addr = geoResults.get(0); 
     myLocation.setLatitude(addr.getLatitude()); 
     myLocation.setLongitude(addr.getLongitude()); 
    } 
} catch (Exception e) { 
    System.out.print(e.getMessage()); 
} 
+0

@ chris..dint work私のために –

+0

あなたは詳細を提供できますか? – chris

+1

私はそれを修正することができました。私は強制的にAndroidのマップを閉じたApp..once私はエミュレータを再起動しました。それはうまく働いた –

2
public LatLng determineLatLngFromAddress(Context appContext, String strAddress) { 
     LatLng latLng = null; 
     Geocoder geocoder = new Geocoder(appContext, Locale.getDefault()); 
     List<Address> geoResults = null; 

     try { 
      geoResults = geocoder.getFromLocationName(strAddress, 1); 
      while (geoResults.size()==0) { 
       geoResults = geocoder.getFromLocationName(strAddress, 1); 
      } 
      if (geoResults.size()>0) { 
       Address addr = geoResults.get(0); 
       latLng = new LatLng(addr.getLatitude(),addr.getLongitude()); 
      } 
     } catch (Exception e) { 
      System.out.print(e.getMessage()); 
     } 

    return latLng; //LatLng value of address 
    } 
+0

初めての場合、結果が与えられない場合、may tryの結果が返されます。 –

2

は同じ問題を抱えていました。 Geocoding Responses

は場所のJSONObjectを取得するには、このクラスを使用します:

public class GetLocationDownloadTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... strings) { 


     String result = ""; 
     URL url; 
     HttpURLConnection urlConnection; 
     try { 
      url = new URL(strings[0]); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      InputStream is = urlConnection.getInputStream(); 
      InputStreamReader inputStreamReader = new InputStreamReader(is); 

      int data = inputStreamReader.read(); 
      while(data != -1){ 
       char curr = (char) data; 
       result += curr; 
       data = inputStreamReader.read(); 
      } 
      return result; 

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

     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     if(result != null) { 
      try { 
       JSONObject locationObject = new JSONObject(result); 
       JSONObject locationGeo = locationObject.getJSONArray("results").getJSONObject(0).getJSONObject("geometry").getJSONObject("location"); 


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

    } 

あなたは、このようなクラスのインスタンスを作成して実行することができます。

String link = "https://maps.googleapis.com/maps/api/geocode/json?address=" + addressString + "&key={YOUR_API_KEY}"; 

GetLocationDownloadTask getLocation = new GetLocationDownloadTask(); 

getLocation.execute(link); 
プールはので、私は場所を取得するために、これを使用し動作しませんでした
関連する問題