Please Enable JavaScript!
Gon[ Enable JavaScript ]

반응형

안드로이드(Android) GPS LocationListener 이용해서 도시이름 가져오기

 

환경 : Eclipse Mars, Android 4.2.2

 

이번예제는 LocationListener 이용해서 GPS 정보를 얻은후 도시 이름을 가져오는 것입니다. 도시 이름은 Geocoder 를 이용해서 가져옵니다LocationListener 을 셋팅하게 되면 방위가 바뀔 때 마다 이벤트를 주게 되는데 그 정보로 정보를 찾는 방식입니다.

 

위치가져오기를 클릭하게 되면 현재 위치의 도시명과 좌표를 가져와서 EditText 에 찍어 줍니다. 그림에서는 위치정보를 가져오기 못하고 있습니다. 왜냐하면 움직임이 없는 에뮬레이터 이기 때문입니다. 하지만 제 스마트폰에서 테스트를 완료하였기 때문에 정상적으로 동작합니다.

 

안드로이드(Android) GPS LocationListener 이용해서 도시이름 가져오기

 

우선 LocationListener 을 이용해서 GPS 변동이 있을 때 값을 가져오기 위해 클래스를 만듭니다. LocationListener onLocationChanged() 함수가 변동이 있을 때 호출되는 함수 입니다. 파라미터로 넘어온 Location 정보로 도시명을 가져와서 화면에 뿌려주는 것이 전부 입니다.

 

String cityName = null;
Geocoder gcd = new Geocoder(getBaseContext(), Locale.getDefault());
List<Address> addresses;
try {
	addresses = gcd.getFromLocation(loc.getLatitude(),
			loc.getLongitude(), 1);
	if (addresses.size() > 0)
		System.out.println(addresses.get(0).getLocality());
	cityName = addresses.get(0).getLocality();
} catch (IOException e) {
	e.printStackTrace();
}

String s = longitude + "\n" + latitude + "\n\n당신의 현재 도시명 : "
		+ cityName;
editLocation.setText(s);

 

activity 가 시작하는 onCreate 함수에서는 LocationManager 객체를 만듭니다. LocationManager 객체에 LocationListener 등록할 것이기 때문입니다.

 

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

 

위치가져오기 버튼을 클릭하게 되면 LocationListener 이용해서 만든 사용자 정의 클래스를 객체화 하게 되며 LocationManager 에 등록합니다이전에 GPS 를 사용할수 있도록 옵션에 셋팅되었는지 체크하는 것이 먼저 겠죠.

 

// Getting GPS status
isGPSEnabled = locationMangaer
		.isProviderEnabled(LocationManager.GPS_PROVIDER);

// Getting network status
isNetworkEnabled = locationMangaer
		.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

if (isGPSEnabled && isNetworkEnabled) {

	editLocation.setText("방위가 바뀔때 까지 기다려주세요." + "\nWait..");
	pb.setVisibility(View.VISIBLE);
	locationListener = new MyLocationListener();
	locationMangaer.requestLocationUpdates(
			LocationManager.GPS_PROVIDER, 5000, 10,
			locationListener);
} else {
	alertbox("Gps 상태!!", "당신의 GPS 상태 : OFF");
}

 

이렇게 해서 구현된 메인 activity 의 전체 레이아웃 xml 입니다.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:weightSum="1" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.20"
        android:gravity="center"
        android:text="현재 도시명 가져오기"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/editTextLocation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.33"
        android:editable="false" >

        <requestFocus>
        </requestFocus>
    </EditText>

    <LinearLayout
        android:id="@+id/layButtonH"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.15"
        android:gravity="center" >

        <Button
            android:id="@+id/btnLocation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="위치가져오기" />
        
        <Button
            android:id="@+id/btnStop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="GPS 멈춤" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/layloadingH"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.20"
        android:gravity="center" >

        <ProgressBar
            android:id="@+id/progressBar1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
        </ProgressBar>
    </LinearLayout>

</LinearLayout>

 

메인 activity 의 전체 소스 입니다. 아래에 LocationListener 을 이용해서 만든 클래스도 포함이 되어있습니다.

 

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

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

public class LocationServiceActivity extends Activity implements
		OnClickListener {

	private LocationManager locationMangaer = null;
	private LocationListener locationListener = null;

	private Button btnGetLocation, btnGpsStop;
	private EditText editLocation = null;
	private ProgressBar pb = null;

	private static final String TAG = "Debug";
	private boolean isGPSEnabled = false;
	private boolean isNetworkEnabled = false;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_location_service);
		// if you want to lock screen for always Portrait mode
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

		pb = (ProgressBar) findViewById(R.id.progressBar1);
		pb.setVisibility(View.INVISIBLE);

		editLocation = (EditText) findViewById(R.id.editTextLocation);

		btnGetLocation = (Button) findViewById(R.id.btnLocation);
		btnGetLocation.setOnClickListener(this);

		btnGpsStop = (Button) findViewById(R.id.btnStop);
		btnGpsStop.setOnClickListener(this);

		locationMangaer = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
	}

	@Override
	public void onClick(View v) {

		switch (v.getId()) {
		case R.id.btnStop:
			locationMangaer.removeUpdates(locationListener);
			pb.setVisibility(View.INVISIBLE);
			editLocation.setText("");
			break;
		case R.id.btnLocation:

			// Getting GPS status
			isGPSEnabled = locationMangaer
					.isProviderEnabled(LocationManager.GPS_PROVIDER);

			// Getting network status
			isNetworkEnabled = locationMangaer
					.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

			if (isGPSEnabled && isNetworkEnabled) {

				editLocation.setText("방위가 바뀔때 까지 기다려주세요." + "\nWait..");
				pb.setVisibility(View.VISIBLE);
				locationListener = new MyLocationListener();
				locationMangaer.requestLocationUpdates(
						LocationManager.GPS_PROVIDER, 5000, 10,
						locationListener);
			} else {
				alertbox("Gps 상태!!", "당신의 GPS 상태 : OFF");
			}
			break;
		default:
			break;
		}
	}

	protected void alertbox(String title, String mymessage) {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setMessage("Your Device's GPS is Disable")
				.setCancelable(false)
				.setTitle("** Gps Status **")
				.setPositiveButton("Gps On",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int id) {
								Intent myIntent = new Intent(
										Settings.ACTION_SECURITY_SETTINGS);
								startActivity(myIntent);
								dialog.cancel();
							}
						})
				.setNegativeButton("Cancel",
						new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int id) {
								dialog.cancel();
							}
						});
		AlertDialog alert = builder.create();
		alert.show();
	}

	private class MyLocationListener implements LocationListener {
		@Override
		public void onLocationChanged(Location loc) {

			editLocation.setText("");
			pb.setVisibility(View.INVISIBLE);
			Toast.makeText(
					getBaseContext(),
					"Location changed : Lat: " + loc.getLatitude() + " Lng: "
							+ loc.getLongitude(), Toast.LENGTH_SHORT).show();
			String longitude = "Longitude: " + loc.getLongitude();
			Log.v(TAG, longitude);
			String latitude = "Latitude: " + loc.getLatitude();
			Log.v(TAG, latitude);

			/*---------- 도시명 가져오기 ----------- */
			String cityName = null;
			Geocoder gcd = new Geocoder(getBaseContext(), Locale.getDefault());
			List<Address> addresses;
			try {
				addresses = gcd.getFromLocation(loc.getLatitude(),
						loc.getLongitude(), 1);
				if (addresses.size() > 0)
					System.out.println(addresses.get(0).getLocality());
				cityName = addresses.get(0).getLocality();
			} catch (IOException e) {
				e.printStackTrace();
			}

			String s = longitude + "\n" + latitude + "\n\n당신의 현재 도시명 : "
					+ cityName;
			editLocation.setText(s);
		}

		@Override
		public void onProviderDisabled(String provider) {
			// TODO Auto-generated method stub
		}

		@Override
		public void onProviderEnabled(String provider) {
			// TODO Auto-generated method stub
		}

		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {
			// TODO Auto-generated method stub
		}
	}
}
반응형
Posted by 녹두장군1
,