2013-08-14 6 views
19

私はアンドロイドスタジオで作業しています。ポップアップダイアログでは、ユーザーが自分のポジションを取得できるようにしたいと思いますが、私が知ることは緯度と経度を取得することだけです。私の現在の位置の都市名をどのように取得できますか?

これは、コードMainActivity.Canで

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(); 
    } 
} 

あなたは私を助けているのですか?

私はマニフェスト

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

でこれを追加しましたが、それはまだ「場所が利用できません」と言います。


+0

名前であなたはアドレスですか? – Nerd

+0

はい私は都市を意味します:例。 Florence – Rick

答えて

27

あなたは与えられた緯度/経度からAddressを取得するために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(); 
} 
} 
+0

@ user2675569:私の編集した答えをチェックしてください。 – Nerd

+0

私は理由を知らないが、うまくいかない!私が自分の電話でアプリを起動すると、「残念なことに、私のアプリケーションは停止しました」と表示されます。それはあなたのために働くのですか? – Rick

+0

投稿Logcat – Nerd

0

あなたが現在位置のアドレスを取得するために、GoogleのAPIを使用することができ、以下を試してみてください。あなたの都市を取得するこの記事で私の答えをチェックしてください。あなたはAysncTask(またはスレッドではないUIスレッドと同じスレッドグループ内)にジオコーダを実行する必要が

How to get city name from latitude and longitude coordinates in Google Maps?

11

!この抽象リスナー

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

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(); 
} 

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

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

希望これはあなたのいくつかを助けます!

関連する問題