web-dev-qa-db-ja.com

現在の位置の都市名を取得するにはどうすればよいですか?

私はAndroid studioで作業しており、ポップアップダイアログでユーザーが自分の位置を取得できるようにしたいのですが、私が知っているのは緯度と経度を取得することだけです。

これはコードです

import Android.app.Activity;
import Android.content.Context;
import Android.location.Criteria;
import Android.location.Location;
import Android.location.LocationListener;
import Android.location.LocationManager;
import Android.os.Bundle;
import Android.widget.TextView;
import Android.widget.Toast;

public class MainActivity extends Activity implements LocationListener {
    private TextView latituteField;
    private TextView longitudeField;
    private LocationManager locationManager;
    private String provider;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        latituteField = (TextView) findViewById(R.id.TextView02);
        longitudeField = (TextView) findViewById(R.id.TextView04);


        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        Criteria criteria = new Criteria();
        provider = locationManager.getBestProvider(criteria, false);
        Location location = locationManager.getLastKnownLocation(provider);


        if (location != null) {
            System.out.println("Provider " + provider + " has been selected.");
            onLocationChanged(location);
        } else {
            latituteField.setText("Location not available");
            longitudeField.setText("Location not available");
        }
    }


    @Override
    protected void onResume() {
        super.onResume();
        locationManager.requestLocationUpdates(provider, 400, 1, this);
    }


    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(this);
    }

    @Override
    public void onLocationChanged(Location location) {
        int lat = (int) (location.getLatitude());
        int lng = (int) (location.getLongitude());
        latituteField.setText(String.valueOf(lat));
        longitudeField.setText(String.valueOf(lng));
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {


    }

    @Override
    public void onProviderEnabled(String provider) {
        Toast.makeText(this, "Enabled new provider " + provider,
                Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onProviderDisabled(String provider) {
        Toast.makeText(this, "Disabled provider " + provider,
                Toast.LENGTH_SHORT).show();
    }
} 

mainActivityで。私を助けてくれますか?

これをマニフェストに追加しました

<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"/>

ただし、「ロケーションは利用できません」と表示されます。


23
Rick

特定の緯度経度から 住所 を取得するには、 GeoCoder クラスが必要です。以下を試してください:

Geocoder geoCoder = new Geocoder(this, Locale.getDefault()); //it is Geocoder
StringBuilder builder = new StringBuilder();
try {
    List<Address> address = geoCoder.getFromLocation(latitude, longitude, 1);
    int maxLines = address.get(0).getMaxAddressLineIndex();
    for (int i=0; i<maxLines; i++) {
    String addressStr = address.get(0).getAddressLine(i);
    builder.append(addressStr);
    builder.append(" ");
    }

String fnialAddress = builder.toString(); //This is the complete address.
} catch (IOException e) {}
  catch (NullPointerException e) {}

以下のコードがあなたのために働くはずです:(あなたのコードに関するインラインコメントをチェックしてください)

import Java.io.IOException;
import Java.util.List;
import Java.util.Locale;

import Android.app.Activity;
import Android.content.Context;
import Android.location.Address;
import Android.location.Criteria;
import Android.location.Geocoder;
import Android.location.Location;
import Android.location.LocationListener;
import Android.location.LocationManager;
import Android.os.Bundle;
import Android.widget.TextView;
import Android.widget.Toast;

public class MainActivity extends Activity implements LocationListener {
private TextView latituteField;
private TextView longitudeField;
private TextView addressField; //Add a new TextView to your activity_main to display the address
private LocationManager locationManager;
private String provider;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    latituteField = (TextView) findViewById(R.id.TextView02);
    longitudeField = (TextView) findViewById(R.id.TextView04);
    addressField = (TextView) findViewById(R.id.TextView05); //Make sure you add this to activity_main


    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    Criteria criteria = new Criteria();
    provider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(provider);


    if (location != null) {
        System.out.println("Provider " + provider + " has been selected.");
        onLocationChanged(location);
    } else {
        latituteField.setText("Location not available");
        longitudeField.setText("Location not available");
    }
}


@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(provider, 400, 1, this);
}


@Override
protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
}

@Override
public void onLocationChanged(Location location) {
    //You had this as int. It is advised to have Lat/Loing as double.
    double lat = location.getLatitude();
    double lng = location.getLongitude();

    Geocoder geoCoder = new Geocoder(this, Locale.getDefault());
    StringBuilder builder = new StringBuilder();
    try {
        List<Address> address = geoCoder.getFromLocation(lat, lng, 1);
        int maxLines = address.get(0).getMaxAddressLineIndex();
        for (int i=0; i<maxLines; i++) {
            String addressStr = address.get(0).getAddressLine(i);
            builder.append(addressStr);
            builder.append(" ");
        }

        String fnialAddress = builder.toString(); //This is the complete address.

        latituteField.setText(String.valueOf(lat));
        longitudeField.setText(String.valueOf(lng));
        addressField.setText(fnialAddress); //This will display the final address.

    } catch (IOException e) {
        // Handle IOException
    } catch (NullPointerException e) {
        // Handle NullPointerException
    }
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {


}

@Override
public void onProviderEnabled(String provider) {
    Toast.makeText(this, "Enabled new provider " + provider,
            Toast.LENGTH_SHORT).show();

}

@Override
public void onProviderDisabled(String provider) {
    Toast.makeText(this, "Disabled provider " + provider,
            Toast.LENGTH_SHORT).show();
}
}
31
gsb

AysncTask(またはUIスレッドと同じThreadGroupにないスレッド)でGeocoderを実行する必要があります!

public void getCityName(final Location location, final OnGeocoderFinishedListener listener) {
   new AsyncTask<Void, Integer, List<Address>>() {
      @Override
      protected List<Address> doInBackground(Void... arg0) {
         Geocoder coder = new Geocoder(getContext(), Locale.ENGLISH);
         List<Address> results = null;
         try {
            results = coder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
         } catch (IOException e) {
            // nothing
         }
         return results;
      }

      @Override
      protected void onPostExecute(List<Address> results) {
         if (results != null && listener != null) {
            listener.onFinished(results);
         }
      }
   }.execute();
}

この抽象リスナーを使用して

public abstract class OnGeocoderFinishedListener {
   public abstract void onFinished(List<Address> results);
}

次のようにメソッドを呼び出します。

getCityName(location, new OnGeocoderFinishedListener() {
   @Override
   public void onFinished(List<Address> results) {
      // do something with the result
   }
});

これがあなたの一部を助けることを願っています!

13
Kai Burghardt

Google apiを使用して、現在の住所を取得できます。この投稿で私の答えをチェックして、あなたの街に行きましょう。

Googleマップの緯度と経度の座標から都市名を取得する方法?

0
Vipul Purohit