54

long/latに基づいてアドレスを取得しようとしています。このようなものが機能するように見えますか?

Geocoder myLocation = Geocoder(Locale.getDefault());
    List myList = myLocation.getFromLocation(latPoint,lngPoint,1);

問題は私が取得し続けることです:メソッドGeocoder(Locale)はタイプsavemaplocationに対して未定義です

どんな援助も役に立ちます。ありがとうございました。


おかげで、私は最初にコンテキスト、ロケールを試しましたが、失敗し、他のコンストラクターのいくつかを調べていました(ロケールだけを言及しているコンストラクターを見たことがあります)。関係なく、

私はまだ取得しているので、それは機能しませんでした:メソッドGeocoder(Context、Locale)はタイプsavemaplocationに対して未定義です

私は持っています:import android.location.Geocoder;

4

7 に答える 7

71

次のコード スニペットは、私のためにそれを行っています (lat と lng は、このビットの上で宣言された double です)。

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
于 2009-01-25T00:58:21.620 に答える
50

これは、UIをブロックせずにGeocoderの回答を取得するために、スレッドとハンドラーを使用した完全なサンプルコードです。

ジオコーダーの呼び出し手順は、ヘルパークラスに配置できます

public static void getAddressFromLocation(
        final Location location, final Context context, final Handler handler) {
    Thread thread = new Thread() {
        @Override public void run() {
            Geocoder geocoder = new Geocoder(context, Locale.getDefault());   
            String result = null;
            try {
                List<Address> list = geocoder.getFromLocation(
                        location.getLatitude(), location.getLongitude(), 1);
                if (list != null && list.size() > 0) {
                    Address address = list.get(0);
                    // sending back first address line and locality
                    result = address.getAddressLine(0) + ", " + address.getLocality();
                }
            } catch (IOException e) {
                Log.e(TAG, "Impossible to connect to Geocoder", e);
            } finally {
                Message msg = Message.obtain();
                msg.setTarget(handler);
                if (result != null) {
                    msg.what = 1;
                    Bundle bundle = new Bundle();
                    bundle.putString("address", result);
                    msg.setData(bundle);
                } else 
                    msg.what = 0;
                msg.sendToTarget();
            }
        }
    };
    thread.start();
}

UIアクティビティでのこのGeocoderプロシージャの呼び出しは次のとおりです。

getAddressFromLocation(mLastKownLocation, this, new GeocoderHandler());

そして、UIに結果を表示するハンドラー:

private class GeocoderHandler extends Handler {
    @Override
    public void handleMessage(Message message) {
        String result;
        switch (message.what) {
        case 1:
            Bundle bundle = message.getData();
            result = bundle.getString("address");
            break;
        default:
            result = null;
        }
        // replace by what you need to do
        myLabel.setText(result);
    }   
}

次の許可をあなたに入れることを忘れないでくださいManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
于 2011-02-12T22:35:04.507 に答える
37

ここでは 2 つのことが起こっているようです。

new1)コンストラクターを呼び出す前のキーワードを見逃しています。

2) Geocoder コンストラクターに渡すパラメーターが正しくありません。Localeを期待している場所に渡していContextます。

2 つのGeocoderコンストラクターがあり、どちらも を必要としContext、1 つは も受け取りますLocale

Geocoder(Context context, Locale locale)
Geocoder(Context context)

解決

有効なコンテキストを渡してインクルードするようにコードを変更すると、準備完了ですnew

Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());   
List<Address> myList = myLocation.getFromLocation(latPoint, lngPoint, 1);

ノート

それでも問題が解決しない場合は、権限の問題である可能性があります。ジオコーディングは暗黙的にインターネットを使用してルックアップを実行するため、アプリケーションではINTERNETマニフェストに uses-permission タグが必要です。

manifestマニフェストのノード内に次の uses-permission ノードを追加します。

<uses-permission android:name="android.permission.INTERNET" />
于 2009-01-23T10:25:25.110 に答える
8

この理由は、存在しないバックエンド サービスです。

Geocoder クラスには、コア Android フレームワークに含まれていないバックエンド サービスが必要です。プラットフォームにバックエンド サービスがない場合、Geocoder クエリ メソッドは空のリストを返します。

于 2013-10-07T07:40:28.790 に答える
5

まず、LocationおよびLocationManagerクラスを使用して緯度と経度を取得します。次に、都市、住所情報を取得するための以下のコードを試してください

double latitude = location.getLatitude();
double longitude = location.getLongitude();
Geocoder gc = new Geocoder(this, Locale.getDefault());
try {
    List<Address> addresses = gc.getFromLocation(lat, lng, 1);
    StringBuilder sb = new StringBuilder();
    if (addresses.size() > 0) {
        Address address = addresses.get(0);
        for (int i = 0; i < address.getMaxAddressLineIndex(); i++)
            sb.append(address.getAddressLine(i)).append("\n");
            sb.append(address.getLocality()).append("\n");
            sb.append(address.getPostalCode()).append("\n");
            sb.append(address.getCountryName());
    }

都市情報は現在sbにあります。次に、sbをStringに変換します(sb.toString()を使用)。

于 2012-06-01T12:41:06.270 に答える
2

まあ、私はまだ困惑しています。だからここにもっとコードがあります。

地図を離れる前に、これを呼び出しますSaveLocation(myMapView,myMapController);。これが、ジオコーディング情報を呼び出すことになります。

しかし、getFromLocationを投げることができるのでIOException、SaveLocationを呼び出すために次のことをしなければなりませんでした

try
{
    SaveLocation(myMapView,myMapController);
}
catch (IOException e) 
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

次に、IOExceptionsをスローすると言ってSaveLocationを変更する必要があります。

 public void SaveLocation(MapView mv, MapController mc) throws IOException{
    //I do this : 
    Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());   
    List myList = myLocation.getFromLocation(latPoint, lngPoint, 1);
//...
    }

そして、それは毎回クラッシュします。

于 2009-01-23T23:06:51.580 に答える
0

これを使って

Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
于 2016-11-07T13:36:00.067 に答える