Do it! 안드로이드 앱프로그래밍 13일차 (19.05.24)

2019. 5. 24. 14:48Engineer/안드로이드 앱 프로그래밍

반응형


 Chapter 12. 메시징과 소셜 네트워크 서비스 


   12-1 메시징 서비스 이해하기


메시지를 서로 주고 받을 수 있는 서비스를 흔히 메시징 서비스(Messaging Serivce)라고 하며 다음과 같은 네가지로 나눌 수 있음

  • 단말간 메세지 송수신(이동통신사 서버 사용) : SMS/MMS
  • 서버를 통한 단말 간 메시지 송수신 : XMPP, SIP, 카카오톡, WhatsApp
  • SNS를 통한 단말 간 메시지 공유 : Twiter, Facebook
  • 푸시 서비스를 통한 메시지 전송 : FCM


   12-2 푸시 서비스 사용하기


단말로 알림 메시지를 보내는 기술적인 방법

  • 단순 SMS를 이용한 알림 : 간단하지만 비용이 발생할 수 있음
  • 앱엥서 연결을 만들어 놓은 상태에서 알림 : 앱에서 서버와의 연결을 만들어 놓고 폴링하는 과정 필요. 백그라운드 서비스를 이용해야 하므로 간한하지만은 않음
  • 구글의 푸시 서비스(FCM)를 사용하여 알림 : 구글의 클라우드 서버를 사용해 최적화한 서비스. 앱에서 직접 연결할 필요가 없으며 단말의 내부 연결을 공유하여 데이터를 수신하는 방식


FCM (Firebase Cloud Messaging)은 GCM (Google Cloud Messaging)이 일부분이 되어 통합된 서비스를 말하며 GCM보다 간단하게 사용할 수 있도록 많은 기능을 라이브러리로 제공


'푸시 서비스'란 "업데이트가 있습니다"와 같은 메시지를 구글 클라우드 서버에서 구글 Play 스토어가 설치된 단말로 보내주는 방식으로 이를 위해서는 아래와 같은 과정이 필요

  1. 단말은 자신을 클라우드 서버에 등록하고 서버로부터 등록 ID를 받음
  2. 클라우드로 부터 받은 등록 ID는 메시지 전송을 담당할 애플리케이션 서버로 보냄. 그래야 푸싱 메시지가 있을 경우 애플리케이션 서버가 어느 단말로 푸싱 메시지를 보낼지 첨부하여 클라우드 서버에 요청 할 수 있음
  3. 보내려는 메시지는 애플리케이션 서버에서 클라우드에 접속한 후 전송. 이때 애플리케이션 서버는 API키(인증 정보)라는 고유한 값을 포함해야 함
  4. 클라우드 서버로 전송된 메시지는 대상 단말에 보내짐
푸시 서비스를 받기 위한 전체적인 과정
①FCM을 사용할 수 있도록 서비스를 만들어 등록 (2개의 서비스가 필요)
첫번째는 Java 코드에서는 FirebaseMessagingService 클래스를 상속 받도록 한다. FireMessangingService 클래스도 서비스 클래스이며 푸시 메시지를 전달하는 역할을 담당한다. 구글 클라우드 서버에서 보내오는 메시지는 이 클래스에서 받을 수 있으며, onMessageReceived( )메소드로 정의되어 있다. 따라서 onMessageReceived( )메소드를 재정의하면 구글 클라우드 서버에서 보내오는 메시지를 받아서 처리 가능


두번째는 FirebaseInstanceIdService 클래스를 상속한 클래스의 Java 코드인데 이 클래스는 클라우드 서버에 단말을 등록하는 역할을 담당한다. 단말의 등록 ID를 전달 받으면 onTokenRefresh( ) 메소드가 호출되기 때문에 이 메소드를 재정의하면 전달 받은 등록 ID를 확인 가능


이 두개의 서비스는 모두 인텐트 필터를 갖도록 설정해야 하므로 매니페스트 파일에 설정한다. 그리고 푸시 서비스는 인터넷을 사용하기 때문에 인터넷 권한도 추가한다. 


②화면 레이아웃 및 자바 소스 코드에 단말 등록과 메시지 전송 기능 추가하기

메인 액티비티의 코드 작성. 메시지 전송을 위해서 Volly 라이브러리를 사용. 이 라이브러리는 RequestQueue 객체에 요청 객체( Request Object)를 만들어 추가하면 자동으로 메시지를 전송.  getRegistrationId( )메소드로 단말의 등록 ID확인. 


FirebaseInstanceId 객체는 구글 클라우드 서버에 단말을 등록한 후에 받게 되는 단말 ID를 확인 할수 있도록 도와줌. 이 객체를 참조한 후 getToken( )메소드를 호출하면 등록 ID가 반환됨. 이 등록 ID는 푸시 메시지를 보낼 대 사용되므로 잘 보관해야함. 


메시지를 전송하려면 JSONObject 타입의 객체를 요청 객체로 만듬. 그안에 원하는 만큼 데이터를 추가할 수 있음. 데이터를 추가할 때는 또 다른 JSONObject 객체를 만든 후 그 안에 추가함. 이 때 데이터 이름과 값이 어떤 것인지 잘 기억해야함. 데이터를 받는 쪽에서 어떤 이름으로 된 어떤 데이터가 전달 되는지 알아야 확인 가능하기 때문. 


클라우드 서버에 메시지를 전송할 때는 Volley 라이브러리나 okHttp 라이브러리 등을 사용할 수 있음. 이 책에서는 Volly 라이브러리를 사용하면서 JSON 객체를 요청객체로 하여 서버에 전송


③자바 소스코드에 메시지 수신 기능 추가하기

단말이 클라우드 서버로부터 메시지를 받으면 (처음 받는 곳은 서비스 클래스임) onMessageReceived( ) 메소드가 호출됨. 이때 전달되는 RemoteMessage 객체의 정보를 확인하면 푸시 메세지의 데이터를 확인 할 수 있음. 이때 데이터를 확인하기 위해서 데이터 이름(key라고 해야하나 필드명이라고해야하나)를 알고 있어야함. getFrom( )메소드는 어디서 전송한 것인지 발진자 코드를 확인 할 수 있으며, getData( ) 메소드는 데이터를 확인 할수 있음


서비스 클래스에서 푸시 메시지를 수신했으므로 데이터를 사용자에게 보내주려면 인텐트를 통해 메인 엑티비티로 전달해야함. 메인 엑티비티가 이미 메모리에 만들어져 있는 경우에는 메인 엑티비티의 onNewIntent( )메소드로 데이터가 전달됨

 


   12-3 페이스북 연동하기


페이스북의 기능을 사용하기 위해서는 로그인이 필요. 페이스북의 로그인 과정은 미리 구성된 라이브러리를 통해 간단한게 진행 가능. 정상적으로 로그인한 이후에는 페이스북의 다양한 기능을 연동하여 사용 가능


로그인에 사용되는 페이스북 앱의 키 값은 페이스북의 앱 등록 화면에서 앱을 추가하면 확인 가능. 이 키 값을 코드에 넣은 후 로그인 과정을 진행. 앱 등록을 위한 페이스북 개발자 사이트 주소 https://developers.facebook.com/


코드 작성에 앞서 페이스북 라이브러리를 사용하기 위해서는 build.gradle 파일을 열고 dependencies 항목에 라이브러리를 추가. 그리고 메니페스트 파일에 인터넷 권한을 추가. meta-data 태그의 value 속성 값으로 들어간 facebook_app_id 변수는 /res/values 폴더 안에 있는 string.xml 파일안에 추가되어야하며 그 값으로 페이스북 개발자 사이트에서 등록한 앱의 AppID가 설정되어야함. 


build.gradle 파일과 메니페스트파일, string.xml파일 정보 설정 작업이 끝나면, 메인 액티비티 파일에서 FacebookSDK.sdkInitialize( )메소드를 호출하면됨. 이때 주의점은 setContentView( )메소드 호출전에 호출되어야 한다는 것. 


로그인된 이후에 Graph API라는 것을 사용해 페이스북의 다양한 기능을 앱에서 사용하도록 만들 수 있음




 Chapter 13. 근거리 통신과 센서 


   13-1 근거리 통신 이해하기


안드로이드 플랫폼 단말기에서는 근거리 무선통신 중에서 NFC(Near Field Communication)와 Wi-Fi 다이렉트, 그리고 블루투스가 일바적임


NFC는 블루투스보다 전송속도가 느리지만 통신설정 시간이 매우 짧아 센서의 인식과 반응속도가 매우 빠른 장점을 가짐

NFC를 사용하는 방식은 3가지

  1. 태그로 사용하기 : 내 디바이스를 태그로 사용할 수 있음
  2. 태그 읽기와 쓰기: 태그의 데이터 읽기와 쓰기가 가능
  3. 디바이스끼리 P2P로 데이터 주고 받기 : P2P 모드를 사용하면 디바이스끼리 데이터를 주고 받을 수 있음

블루투스는 소비전력이 적고 값싼 휴대폰과 그 주변장치를 연결하는 무선 솔루션으로 개발된 후 국제 표준으로 자리 잡음. 
안드로이드는 블루투스 프로토콜 스택을 포함하고 있기 때문에 블루투스 API를 이용하면 간단. 블루투스 API의 기능은 아래와 같음
  • 내 디바이스 활성화: 다른 디바이스가 내 블루투스를 검색할 수 있도록 활성화 시킴
  • 페어링된 블루투스 디바이스 검색: 페어링된 디바이스 중에서 활성화된 디바이스가 주변에 있는 지 검색 가능
  • 페어링 되지 않은 블루투스 디바이스 검색: 주변에 있는 활성화된 블루투스 디바이스 검색 가능
  • 서버 소켓을 이용해 연결 대기 : 페어링된 다른 디바이스로부터 요청을 받기 위해 서버소켓을 이용해 연결 대기
  • 클라이언트 소켓을 이용해 연결 : 페어링된 다른 디바이스로 클라이언트 소겟을 이용해 연결 가능. 연결이 만들어지면 서로 데이터 교환 가능


   13-2 NFC 사용하기


NFC 데이터 포멧을 인지하고 있어야함. NFC의 데이터는 NDEF(NFC Data Exchange Format) 이라는 포멧으로 만들어지며 하나의 NDEF데이터는하나 또는 여러개의 NDEF 레코드들로 구성 (자세한건 NFC표준 참조 http://www.nfc-forum.org)


NFC 애플리케이션을 만들 때는 메니패스트에 사용 권한 등록 필요. 또한 NFC 기능을 사용하기 위한 태그도 등록 필요


NFC 태그는 리더기와 접촉하게되면 정보를 교환 할 수 있도록 인식. 인식된 정보는 브로드캐스팅으로 애플리케이션에 전달. 이 과정이 빠르다보니 정보를 처리하는 대상 애플리케이션도 명확하게 지정하는 것이 필요. 


NFC 태그를 새로 만들기 위해서는 NdefMessage 객체를 만드는 메소드를 정의해야함. NdefMessage와 NdefRecord 클래스는 각각 NFC 메시지 객체와 NFC레코드 객체를 정의. 



   13-3 NFC 태그 읽기와 쓰기


NFC 태그를 단말에서 인식하게 되면 그정보는 인텐트의 부가 데이터로 넣어져 브로드캐스팅 됨. 이때 인텐트에 들어있는 NFC 태그의 값을 확인하러면 'EXTRA_TAG' 를 키값으로 하여 Parcelable 객체를 참조하면됨


NFC 사용시 필요한 시스템 서비스는 NfcAdapter 객체의 getDefaultAdapter( ) 메소드를 이용하여 간단하게 참조. 


새로운 액티비티가 띄워지면 getIntent( )메소드를 이용해 전달도니 인텐트 객체를 확인. 이 안의 태그 데이터는 getParcelableArrayExtra( )메소드로 확인 가능.  



   13-4 센서 이해하기


안드로이드에서는 다양한 표준 센서들을 지원. 대표적인 지원하는 센서는 아래와 같음

  • 가속 센서
  • 자이로스코프 센서
  • 중력 센서
  • 조도센서
  • 선형 가속 센서
  • 근접 센서
  • 온도 센서
  • 방향 센서
이 정보들은 센서 매니저(SensorManager)라는 시스템 서비스를 통해 같은 방식으로 사용 가능

센서를 사용하면서 볼수 있는 대표적인 클래스들

  • SensorManager : 센서를 다루기 위해 제공되는 시스템 서비스 객체, 각 센서 정보를 포함. 
  • Sensor
  • SensorEvent : 센서로 부터 정보를 받을때 사용되는 객체

센서를 사용할 때는 센서 매니저 객체를 시스템 서비스로 참조하는 것부터 시작. getSystemService( )메소들르 호출하여 시스템 서비스 객체를 참조하며, 이 때 사용하는 상수는 SENSOR_SERVICE 

센서 매니저 객체를 참조한 후 단말에서 지원하는 모든 센서 리스트를 가져오려면 getSensorList( )메소드를 호출

센서의 값들이 변하는 경우에는 SensorEven객체를 통해 전달 받게 됨. onAccuracyChanged( )는 센서의 정확도값이 변할 때마다 호출, onSensorChanged( )메소드는 센서의 데이터값이 변할 때마다 호출





반응형