차근차근/Android

GPS 로 구하는 위치좌표

예쁜꽃이피었으면 2015. 1. 6. 13:09

검색어 : 안드로이드 gps 예제


Android App | [안드로이드앱 강의] 4-3.지도&네비게이션 - 나.구글맵으로 만드는 네비게이션

http://onycomict.com/board/bbs/board.php?bo_table=class&wr_id=124


Android App | [안드로이드앱 강의] 4-3.지도&네비게이션 - 가.구글맵 환경설정




Android App | [안드로이드앱 강의] 4-1.하드웨어 - 나.GPS 로 구하는 위치좌표

http://onycomict.com/board/bbs/board.php?bo_table=class&wr_id=122


나. GPS 로 구하는 위치좌표
지도 앱 또는 네비게이션 앱을 구현하려면 위치좌표를 알아야 합니다. 페이스북, 트위터 같은SNS 와 주변 정보 제공 앱 같은 위치기반 서비스도 위치좌표는 필수 사항입니다. 사용자의 위치좌표는 LocationManager 클래스를 사용해서 구할 수 있으며 위치정보를 제공하는 Provider 는 GPS 센서, 기지국, Wifi 중에서 선택할 수 있습니다. 자세한 사용방법은 예제를 통해서 알아보겠습니다.
 
(1) GPS 센서로 위치좌표 구하기
 
1) 새로운 소스 프로젝트를 생성하고 이름을 GpsLocation 이라고 지정합니다. 소스 프로젝트를 생성하는 방법은 먼저번 시간에 했던 것과 동일합니다.
 
2) /res/layout/activity_main.xml 파일을 열고 아래와 같이 4개 TextView 위젯을 추가합니다. 1번째 TextView 에는 현재 상태를 표시하고, 2번째에는 Latitude(Latitude), 3번째에는 Longitude(경도), 4번째에는 Altitude(고도) 좌표를 표시하겠습니다.
 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
 
    <TextView
        android:id="@+id/textMsg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="State: " />
 
    <TextView
        android:id="@+id/textLat"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_below="@id/textMsg"
        android:text="Lat: " />
 
    <TextView
        android:id="@+id/textLng"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_below="@id/textLat"
        android:text="Lng: " />
 
    <TextView
        android:id="@+id/textAlt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_below="@id/textLng"
        android:text="Alt: " />
 
</RelativeLayout>
 
 
3) 앱이 실행되면 자동으로 GPS 센서에서 위치좌표를 구해서 화면에 표시하는 기능을 구현하겠습니다. /src/<패키지명>/MainActivity.java 파일을 열고 메인 액티비티 클래스에 아래와 같이 코드를 입력합니다.
 
package com.example.gpslocation;
 
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.location.LocationProvider;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;
 
public class MainActivity extends Activity {
    TextView mTextMsg;
    TextView mTextLat;
    TextView mTextLng;
    TextView mTextAlt;
    LocationManager mLocMgr;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        mTextMsg = (TextView)findViewById(R.id.textMsg);
        mTextLat = (TextView)findViewById(R.id.textLat);
        mTextLng = (TextView)findViewById(R.id.textLng);
        mTextAlt = (TextView)findViewById(R.id.textAlt);
 
        mLocMgr = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    }
 
@Override
public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
}
 
    LocationListener mLocListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            mTextLat.setText("Lat: " + location.getLatitude());
            mTextLng.setText("Lng: " + location.getLongitude());
            mTextAlt.setText("Alt: " + location.getAltitude());
        }
 
        public void onProviderDisabled(String provider) {
            mTextMsg.setText("Provider Disabled");
        }
 
        public void onProviderEnabled(String provider) {
            mTextMsg.setText("Provider Enabled");
        }
 
        public void onStatusChanged(String provider, int status, Bundle extras) {
            switch (status) {
            case LocationProvider.OUT_OF_SERVICE:
                mTextMsg.setText("Provider Out of Service");
                break;
            case LocationProvider.TEMPORARILY_UNAVAILABLE:
                mTextMsg.setText("Provider Temporarily Unavailable");
                break;
            case LocationProvider.AVAILABLE:
                mTextMsg.setText("Provider Available");
                break;
            }
        }
    };
 
    public static Criteria getCriteria() {
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setAltitudeRequired(true);
        criteria.setBearingRequired(true);
        criteria.setSpeedRequired(true);
        criteria.setCostAllowed(true);
        criteria.setPowerRequirement(Criteria.POWER_HIGH);
        return criteria;
    }
 
    public void onResume() {
        super.onResume();
        //String locProv = mLocMgr.getBestProvider(new Criteria(), true);
        String locProv = mLocMgr.getBestProvider(getCriteria(), true);
        mLocMgr.requestLocationUpdates( locProv, 3000, 3, mLocListener );
        //mLocMgr.requestLocationUpdates( LocationManager.GPS_PROVIDER, 3000, 3, mLocListener );
        mTextMsg.setText("Location Service Start");
    }
 
    public void onPause() {
        super.onPause();
        mLocMgr.removeUpdates(mLocListener);
        mTextMsg.setText("Location Service Stop");
    }
}
 
4) 이 상태에서 실행하면 Permission 오류가 발생합니다.
위치좌표를 구하려면 GPS 센서 또는 네트워크를 사용해야 하는데 사용자의 권한이 필요하기 때문입니다.
GPS 를 사용하기 위해서는 ACCESS_FINE_LOCATION 권한을 지정해야 하고, 네트워크를 사용하려면 ACCESS_COARSE_LOCATION 권한을 지정해야 합니다.
AndroidManifest.xml 파일을 로딩하고 Add 버튼을 누른 다음 팝업창에서 Uses Permission 을 선택하고 OK 버튼을 누릅니다.
왼쪽 목록에 새로운 항목이 추가되면 오른쪽 Name 속성에 android.permission.ACCESS_FILE_LOCATION 을 선택합니다.
그런 다음 단축키 Ctrl + S 를 눌러서 저장합니다.
 
동일한 과정을 한번 더 수행해서 android.permission.ACCESS_COARSE_LOCATION 을 추가합니다.
저장하고 아래쪽 탭버튼 중에서 AndroidManifest.xml 버튼을 누르면 아래와 같이 2가지 Permission 이 추가된 것을 확인할 수 있습니다.
 
<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="10" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission
    android:name="android.permission.ACCESS_COARSE_LOCATION"/>
 
5) 정확한 테스트는 타겟에 설치해서 거리를 걸어보면 확실합니다. 타겟에서 테스트 할때는 GPS 센서를 On으로 활성화 해야 합니다. 이동하면 위치좌표가 변경됩니다.
 


반응형