위치획득및 활용프로그래밍 2 조
Part1. 위치획득및활용 Contents Part2. 안드로이드서비스 Part3. 위치기반서비스예제
자료출처 정재곤, Do it 안드로이드앱프로그래밍, 이지스퍼블리싱, 2013 ( 사이트 : http://www.android-town.org/) 김상형, 안드로이드프로그래밍정복, 한빛미디어, 2013
위치기반서비스란? 위치로부터정보를얻어편의를제공하는기능 휴대단말기에서지상의위치정보를이용한서비스 주로 GPS 센서를이용 스마트폰에기본적으로 GPS 와센서장착 모든사람들이쉽게이용가능
GPS 를이용한위치얻기 현재위치를확인하는법 : 위치관리자에게위치정보를요청 위치관리자란? 안드로이드에서제공하는위치확인을위한서비스 위치관리자의기능 * 단말기의현재위치확인 * 특정지역에근접혹은들어갔을때알림
GPS 를이용한위치얻기 (1) 현재위치정보요청 (3) 텍스트또는그래픽형식으로위치출력 위치리스너 (Location Listener) 위치관리자 (Location Manager) 위치제공자 액티비티 (Activity) (2) 위치정보전달 GPS
GPS 를이용한위치얻기 위치관리자에게위치정보요청순서 1 위치관리자객체참조하기 2 위치리스너구현하기 3 위치정보업데이트요청하기 4 GPS 사용을위해매니페스트에권한추가하기
GPS 를이용한위치얻기 1. 위치관리자객체참조하기 - 위치관리자는시스템서비스 -> getsystemservice() 사용 - 위치관리자를위한서비스이름 : Context.LOCATION_SERVICE - Location : 위도값과경도값을가지는객체 LocationManager manager = (LocationManager) getsystemservice(context.location_service); Location location = manager.getlastknownlocation (LocationManager.GPS_PROVIDER);
GPS 를이용한위치얻기 cf) GPS_PROVIDER 와 NETWORK_PROVIDER
GPS 를이용한위치얻기 2. 위치리스너구현하기 - 위치리스너 : 위치관리자에서전달하는위치정보를받기위해정의된인터페이스위치관리자가위치정보를전달할때호출됨 private class GPSListener implements LocationListener { public void onlocationchanged(location location) { Double latitude = location.getlatitude(); Double longitude = location.getlongitude(); } 위치정보처리를위해리스너의 onlocationchanged() 구현필요
GPS 를이용한위치얻기 3. 위치정보업데이트요청하기 - 위치관리자의 requestlocationupdates() 으로현재위치갱신 - mintime이지나거나 mindistance가이동되면위치정보를수신 GPSListener gpslistener = new GPSListener(); manager.requestlocationupdates( LocationManager.GPS_PROVIDER, mintime, mindistance, gpslistener);
GPS 를이용한위치얻기 3. 위치정보업데이트요청하기 void requestlocationupdates(string provider, long mintime, float mindistance, LocationListener listener) provider 위치제공자의이름 GPS_PROVIDER, NETWORK_PROVIDER Parameters mintime 위치정보업데이트의시간간격 (ms) mindistance 업데이트시거리허용오차 (m) listener 위치정보를전달할위치리스너
GPS 를이용한위치얻기 4. 매니페스트에권한추가하기 - GPS를이용한위치정보수신권한 -> ACCESS_FINE_LOCATION으로정의되어있음 - 매니페스트에위치정보수신권한을추가 <uses-permission android:name= android.permission.ac CESS_FINE_LOCATION > </uses-permission> * 위치정보수신권한을추가하지않으면정상적인실행불가
GPS 를이용한위치얻기 실행결과예 초기실행화면 위치확인버튼클릭시
근접경보기능추가하기 근접경보 목표위치혹은지역안에있는경우사용자에게알려주 는기능 목적지도달하거나위험지역에들어왔을때알려주는방 식으로활용
근접경보기능추가하기 펜딩인텐트 : 브로드캐스트수신자참조및위치정보를위 치관리자에게전송 브로드캐스트수신자 : 위치관리자로부터경보를수신하 여사용자에게알려줌 * 인텐트란? 서로다른컴포넌트 ( 액티비티, 브로드캐스트수신자등 ) 간의 Data 전달을위해사용되는메시지객체
근접경보기능추가하기 (1) 펜딩인텐트생성 (1) 수신자참조 Pending Intent 위치관리자 액티비티 (Activity) 브로드캐스트수신자 Pending Intent - 목표지점의정보가저장된인텐트포함
근접경보기능추가하기 (1) 펜딩인텐트생성 (1) 수신자참조 Pending Intent (2) 목표지점등록 위치관리자 액티비티 (Activity) 브로드캐스트수신자 (3) 경보전달 - 위치관리자에게목표지점의위치정보를등록 - 목표지점도달시브로드캐스트수신자에게경보전달
근접경보기능추가하기 (5) 텍스트또는그래픽형식으로출력 액티비티 (Activity) (1) 펜딩인텐트생성 (1) 수신자참조 Pending Intent 브로드캐스트수신자 (2) 목표지점등록 (3) 경보전달 위치관리자 브로드캐스트수신자 - 위치관리자로부터경보수신 - 펜딩인텐트로부터위치정보를받아처리
근접경보기능추가하기 1. 위치관리자에경보위치등록 - 목표지점의위치정보를별도의인텐트에저장 Intent intentalertpos = new Intent(); intentalertpos.putextra( id, id); intentalertpos.putextra( latitude, latitude); intentalertpos.putextra( longitude, longitude);
근접경보기능추가하기 1. 위치관리자에경보위치등록 Intent Intent.putExtra(String name, double value) Parameters name value Data 종류를식별하는일종의 Key 인텐트에전달할데이터
근접경보기능추가하기 1. 위치관리자에경보위치등록 - 펜딩인텐트객체생성, 수신자참조 -> PendingIntent.getBroadcast( ) - 위치관리자에게위치정보등록 -> addproximityalert( ) PendingIntent pintent = PendingIntent.getBroadcast(this, id, intentalertpos, PendingIntent.FLAG_CANCEL_CURRENT); manager.addproximityalert(latitude, longitude, radius, expiration, pintent);
근접경보기능추가하기 1. 위치관리자에경보위치등록 PendingIntent PendingIntent.getBroadcast(Context context, int requestcode, Intent intent, int flags) context 객체가생성된현 Context Parameters requestcode 인텐트식별코드 intent 전달할인텐트 flags 인텐트관련설정 flag
근접경보기능추가하기 2. 브로드캐스트수신자정의 - BroadcastReceiver 클래스로부터상속받음 - 위치관리자로부터받을 intent를처리할 onreceive() 구현 private class IntentReceiver extends BroadcastReceiver { private Intent receivedintent; public void onreceive(context context, Intent intent) { if (intent!= null) { receivedintent = intent; int id = intent.getintextra( id, 0); double latitude = intent.getdoubleextra( latitude, 0.0D); double longitude = intent.getdoubleextra( longitude, 0.0D);
근접경보기능추가하기 3. 브로드캐스트수신자등록 - 재정의한브로드캐스트수신자클래스를메인액티비티에등록 - registerreceiver() 이용 public void oncreate(bundle savedinstancestate) { intentreceiver = new IntentReceiver(); registerreceiver(intentreceiver, intentreceiver.getfilter());
근접경보기능추가하기 실행결과예 초기실행화면경보시작버튼클릭시근접경보출력
지오코딩 (Geocoding) 일반사용자들은위도, 경도값에익숙하지않음 -> 일상생활에서쉽게사용하는주소를활용 지오코딩 : 주소를이용해지구상의위치를알아내는방법 - 순방향지오코딩 : 주소를이용해위치좌표를얻는방법 - 역방향지오코딩 : 좌표를이용해주소를얻는방법
지오코딩 (Geocoding) Geocoder : 지오코딩을제공해주는클래스 인터넷권한으로검색서버에연결 위치 ( 주소 ) 출력 Geocoder 주소 ( 좌표 ) 로찾기 지도 검색서버 액티비티
지오코딩 (Geocoding) 1. Geocoder 객체생성및 Locale 지정 - 한글을포함한지오코딩사용을위해 Locale.KOREAN 사용 public class MainActivity extends Activity { Geocoder gc = new Geocoder(this, Locale.KOREAN);
지오코딩 (Geocoding) 2. 주소로위치알아내기 - 주소검색을위해 getfromlocationname( ) 호출 - 주소정보와좌표값을 Address 객체리스트에저장 public class MainActivity extends Activity { private void searchlocation(string searchstr) { List<Address> listaddress = null; listaddress = gc.getfromlocationname( searchstr, 3);
지오코딩 (Geocoding) 2. 주소로위치알아내기 List<Address> Geocoder.getFromLocationName (String locationname, int maxresults) Parameters locationname maxresults 검색할문자열 받아올주소의최대수
지오코딩 (Geocoding) 2. 주소로위치알아내기 - Address 객체리스트에서좌표값얻기 - getlatitude( ), getlongitude( ) 호출 for ( int i = 0; i< listaddress.size(); i++) { Address outaddr = listaddress.get( i ); StringBuffer outaddrstr = new StringBuffer(); outaddrstr.append( Latitude : + outaddr.getlatitude()); outaddrstr.append( Longitude : + outaddr.getlongitude());
지오코딩 (Geocoding) 3. 위치로주소알아내기 - 주소검색을위해 getfromlocation( ) 호출 - 주소정보와좌표값을 Address 객체리스트에저장 public class MainActivity extends Activity { private void searchlocation(double latitude, double longitude) { List<Address> listaddress = null; listaddress = gc.getfromlocation( latitude, longitude, 3);
지오코딩 (Geocoding) 3. 위치로주소알아내기 List<Address> Geocoder.getFromLocation (double latitude, double longitude, int maxresults) latitude 검색할위도값 Parameters Longitude 검색할경도값 maxresults 받아올주소의수
지오코딩 (Geocoding) 3. 위치로주소알아내기 - 주소단위개수구하기 : getmaxaddresslineindex( ) 호출 - 주소문자열얻기 : getaddressline( ) 호출 for ( int i = 0; i< listaddress.size(); i++) { Address outaddr = listaddress.get( i ); int addrcount = outaddr.getmaxaddresslineindex() + 1; StringBuffer outaddrstr = new StringBuffer(); for (int k = 0; k < addrcount; k++) outaddrstr.append(outaddr.getaddressline(k));
지오코딩 (Geocoding) 3. 위치로주소알아내기 int Address.getMaxAddressLineIndex() - Address 객체의각주소단위마다 Index 가부여되어있음 - 최대 Index 값을반환 Ex) 0 1 2 3 경상북도구미시양호동 1 번지 -> 정수값 3 반환
지오코딩 (Geocoding) 3. 위치로주소알아내기 String Address.getAddressLine(int index) - 해당 Index의주소단위를문자열로반환 Ex) 0 1 2 3 경상북도구미시양호동 1 번지 getadressline(2) -> 문자열 양호동 반환
지오코딩 (Geocoding) 실행결과예 주소단어로검색하기 초기실행화면검색할단어입력검색결과출력
지오코딩 (Geocoding) 실행결과예 위치좌표로검색하기 초기실행화면주소로검색위치좌표로검색
안드로이드서비스란? 백그라운드에서실행, 사용자와직접상호작용은하지않음 연산이나메서드등의서비스를제공하는것이주임무
안드로이드서비스종류 백그라운드데몬 배경에서계속실행되는프로세스 ex) 노래재생 원격호출인터페이스 자신의기능을메소드로노출시켜특정한기능을제공 ex) COM, CORBA
서비스함수호출순서 oncreate() onstartcommand() onbind() 백그라운드데몬 원격호출인터페이스 ondestroy()
백그라운드데몬 Process Service Activity BroadCastReceiver ContentProvider 하나의프로세스안에다른컴포넌트들과유기적통신하는역할
백그라운드데몬 onstartcommand(intent intent, int flags, int startid) * intent : 클라이언트가서비스를시작할때전달하는것 * flags : 서비스의요청에대한추가정보 * startid : 서비스요청에대한고유한식별자
백그라운드데몬 매니페스트등록 <service android:name= service 하는 class import 경로 android:enabled= true > <intent-filter> <action android:name= android.intent.action.main /> <category android:name= android.intent.category.launcher /> </intent_filter> </service> * name 속성 : 서비스클래스의이름지정 * enabled 속성 : 서비스사용여부
위치기반서비스예제 MainActivity.java protected void oncreate( ){ btn1.setonclicklistener(new View.OnClickListener(){ public void onclick(view v){ Intent Service = new Intent(MainActivity.this, service.class); startservice(service); // 서비스시작 }}}; btn2.setonclicklistener(new View.OnClickListener(){ public void onclick(view v){ }}}; } Intent Service = new Intent(MainActivity.this, service.class); stopservice(service); // 서비스종료
위치기반서비스예제 service.java public void oncreate extends Service{ public int onstartcommand( ){ Threadtest thread = new Threadtest(this, mhandler); thread.start(); // 스레드시작 return super.onstartcommand(intent, flags, startid); }
위치기반서비스예제 service.java class Threadtest extends Thread{ Handler mhandler; // 스레드함수 public void run(){ Message msg = new Message(); mhandler.sendmessage(msg); // 핸들러로메시지를보내실행 } }
위치기반서비스예제 service.java Handler mhandler = new Handler(){ // 핸들러 } public void handlemessage(message msg){ startlocationservice(); // 위치확인함수실행 }
위치기반서비스예제 service.java private class MyLocationListener implements LocationListner{ public void onlocationchanged(location loc){ // 위치가변경될때마다 Toast Double latitude = loc.getlatitude(); Double longitude = loc.getlongitude(); } } Toast.makeText( ).show(); // 위도, 경도를포함한내용 Toast
위치기반서비스예제 service.java private void startlocationservice(){ LocationManager manager = (LocationManager) getsystemservice(context.location_service); manager.requestlocationupdates( LocationManager.GPS_PROVIER, mintime, mindistance, gpslistener); //gps 를이용한위치요청 }
위치기반서비스예제 실행화면
1. 안드로이드개발환경구축 2. 에뮬레이터생성및실행 3. 프로젝트생성및실행 4. 에뮬레이터속도향상시키기 5. 에뮬레이터에위치정보전송 6. GPS ON/OFF 하기 7. 예제코드링크
안드로이드개발환경구축 (1) JDK 설치하기 1 2 오라클사이트 (http://www.oracle.com/index.html) 에접속
안드로이드개발환경구축 (1) JDK 설치하기 1 2
안드로이드개발환경구축 (1) JDK 설치하기 1 동의문구에체크 2 클릭하여설치파일다운로드 32bit -> jdk-8-windows-i586.exe 64bit -> jdk-8-windows-x64.exe
안드로이드개발환경구축 (1) JDK 설치하기 설치파일을실행하고계속 Next 버튼을클릭하여설치
안드로이드개발환경구축 (2) 안드로이드번들프로그램설치 안드로이드개발을위해서는여러가지프로그램을설치해야함 이러한번거로움을줄일수있도록번들설치프로그램제공 번들설치프로그램을이용하여한번에개발환경구축이가능
안드로이드개발환경구축 (2) 안드로이드번들프로그램설치 개발자사이트 (http://developer.android.com/sdk/index.html) 에접속
안드로이드개발환경구축 (2) 안드로이드번들프로그램설치 2 클릭하여압축파일다운로드 1 동의체크및운영체제종류선택 개발자사이트 (http://developer.android.com/sdk/index.html) 에접속
안드로이드개발환경구축 (2) 안드로이드번들프로그램설치 1 압축해제후다음경로의 ecilpse 폴더로이동 2 eclipse.exe 실행
안드로이드개발환경구축 (2) 안드로이드번들프로그램설치 2 초기화면이보이면닫는다. 1 workspace 디렉토리설정
안드로이드개발환경구축 (3) ADT 및 SDK 설치 안드로이드앱개발을위해서는 ADT(Android Developer Tools) 와 SDK(Standard Development Kit) 이설치되어있어야함 번들프로그램을설치하면기본적으로가장최신버전의 ADT 와 SDK 가설치되어있음 최신버전을지원하지않는단말이있을수도있으므로이전버전의것들의설치가필요함
안드로이드개발환경구축 (3) ADT 및 SDK 설치 좌측상단의 Android SDK Manager 클릭
안드로이드개발환경구축 (3) ADT 및 SDK 설치 Tools 폴더하위의파일들모두선택
안드로이드개발환경구축 (3) ADT 및 SDK 설치 설치하고자하는버전의플랫폼선택
안드로이드개발환경구축 (3) ADT 및 SDK 설치 1 2 Install 버튼클릭 Extas 폴더하위의파일들모두선택
안드로이드개발환경구축 (3) ADT 및 SDK 설치 1 2 License 동의에체크
안드로이드개발환경구축 (3) ADT 및 SDK 설치 1 2 3 License 동의에체크
안드로이드개발환경구축 (3) ADT 및 SDK 설치 설치가다되었는지확인
에뮬레이터생성및실행 안드로이드플랫폼을이용하여에뮬레이터 (AVD : Android Virtual Device) 생성가능 PC 에서만든코드를에뮬레이터를이용하여곧바로실행시켜볼수있음
에뮬레이터생성및실행 (1) 에뮬레이터생성 좌측상단의 Android Virtual Device Manager 클릭
에뮬레이터생성및실행 (1) 에뮬레이터생성
에뮬레이터생성및실행 (1) 에뮬레이터생성 1 이름입력및단말기종류선택
에뮬레이터생성및실행 (1) 에뮬레이터생성 2 플랫폼및 CPU 종류선택
에뮬레이터생성및실행 (1) 에뮬레이터생성 3 해상도설정 4 메모리크기설정 5
에뮬레이터생성및실행 (2) 에뮬레이터실행 1 에뮬레이터선택 2
에뮬레이터생성및실행 (2) 에뮬레이터실행 1 에뮬레이터창크기설정 2
에뮬레이터생성및실행 (2) 에뮬레이터실행 에뮬레이터실행화면
프로젝트생성및실행 (1) 프로젝트생성 File -> New -> Android Application Project 클릭
프로젝트생성및실행 (1) 프로젝트생성 1 프로젝트이름입력 프로젝트및패키지이름입력
프로젝트생성및실행 (1) 프로젝트생성 2 패키지이름입력 주로도메인이름을거꾸로해서입력 프로젝트및패키지이름입력
프로젝트생성및실행 (1) 프로젝트생성 3 4 프로그램이실행될플랫폼선택
프로젝트생성및실행 (1) 프로젝트생성 1 2 3 계속해서 Next 버튼클릭
프로젝트생성및실행 (1) 프로젝트생성 다음창이뜨면 Finish 버튼클릭
프로젝트생성및실행 (2) 프로젝트실행 프로젝트폴더우클릭 -> Run As -> 1 Android Application 클릭
프로젝트생성및실행 (2) 프로젝트실행 프로젝트실행화면
에뮬레이터속도향상시키기 처음생성한에뮬레이터는실행속도가현저하게느림 하드웨어가속기를설치하여에뮬레이터의실행속도를향상시킬수있음
에뮬레이터속도향상시키기 SDK Manager 를열어다음두파일이설치되었는지확인
에뮬레이터속도향상시키기 번들설치프로그램디렉토리의다음경로로들어가 IntelHaxm.exe 실행
에뮬레이터속도향상시키기 Next 버튼을계속눌러하드웨어가속기관리자설치
에뮬레이터속도향상시키기 1 CPU 는 Intel Atom 으로선택 2 메모리크기는 500 메가이상으로설정 3 GPU 사용에체크 4 에뮬레이터설정을다음과같이변경
에뮬레이터속도향상시키기 에뮬레이터를실행시키는도중다음과같은문구가뜨는지확인
에뮬레이터에위치정보전송 개발한어플을테스트하기위해에뮬레이터를사용하기도함 GPS 는에뮬레이터의위치를확인할수없음 가상의위치정보를입력하여전송
에뮬레이터에위치정보전송 (1) 에뮬레이터를켜고, 프로그램을실행
에뮬레이터에위치정보전송 (2) 이클립스의우측상단의 DDMS 클릭
에뮬레이터에위치정보전송 DDMS 가보이지않는다면? 1 4 2 3 5
에뮬레이터에위치정보전송 (3) 좌측의 Devices 창에서에뮬레이터선택
에뮬레이터에위치정보전송 (4) 우측의 Emulator Control 창에서위도, 경도값입력 입력후 Send 클릭
GPS ON/OFF 하기 예전에는코드상에서직접 GPS 를 ON/OFF 할수있었지만지금은불가능 코드상에서 GPS 설정화면을띄우는방법을이용
GPS ON/OFF 하기 예제코드 - ContentResolver : 컨텐트프로바이더에설정된컨텐트를찾아주는객체 - isenable : GPS의 ON/OFF 여부를확인하는변수 private void setgps(){ ContentResolver cr = getcontentresolver(); boolean isenable = Settings.Secure.isLocationProviderEnabled (cr, LocationManager.GPS_PROVIDER);
GPS ON/OFF 하기 예제코드 - 조건문을이용해경고창형식으로출력 if(!isenable ) { new AlertDialog.Builder(this).setTitle("GPS 설정 ).setmessage("gps가꺼져있습니다. \ngps를켜겠습니까? ) } // 경고창제목 // 경고창메시지.setPositiveButton(" 예 ", new DialogInterface.OnClickListener() { // 버튼추가 @Override public void onclick(dialoginterface dialog, int which) { // GPS 설정화면을띄운다. Intent setintent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startactivity(setintent); } }).setnegativebutton(" 아니오 ", new DialogInterface.OnClickListener() { // 버튼추가 @Override public void onclick(dialoginterface dialog, int which) { } }).show();
GPS ON/OFF 하기 실행결과 경고창출력화면 GPS 설정화면
예제코드링크 https://github.com/mobilekit2014/mygps https://github.com/mobilekit2014/mygeocode https://github.com/mobilekit2014/myalert https://github.com/mobilekit2014/mylocationservice
thank you