SlideShare a Scribd company logo
Google Cloud Message
2014.1
Google Cloud Message for Android 스위치 활성화
Google Cloud Message for Android 스위치 활성화
3-rd-party 서버키 만들기
3-rd-party 서버키 만들기
3-rd-party 서버키 만들기
3-rd-party 서버키 만들기
API Project 번호 복사
google-play-services_lib 프로젝트 import
google-play-services_lib 프로젝트 import
google-play-services_lib 프로젝트 import
google-play-services_lib 프로젝트 import
android sdk 다운로드 폴더로 이동해서 

google-play-services_lib 프로젝트를 선택해서 import 한다.
프로젝트를 만들고 import 된 

google-play-services_lib 프로젝트를

라이브러리로 참조하도록 설정한다.
라이브러리 프로젝트 참조 설정
AndroidManifest.xml 설정
<uses-permission android:name="android.permission.INTERNET" />!
<uses-permission android:name="android.permission.GET_ACCOUNTS" />!
<uses-permission android:name="android.permission.WAKE_LOCK" />!
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />!
!
<permission android:name="com.example.day15gcm.permission.C2D_MESSAGE"!
android:protectionLevel="signature" />!
<uses-permission android:name="com.example.day15gcm.permission.C2D_MESSAGE" />
위의 코드를 AndroidManifest.xml 에

<manifest></manifest> 의 자식요소로 붙여 넣는다.
<permission android:name="app 페키지명.permission.C2D_MESSAGE"!
android:protectionLevel="signature" />!
<uses-permission android:name="app 페키지명.permission.C2D_MESSAGE" />
AndroidManifest.xml 설정
! <meta-data android:name="com.google.android.gms.version"!
! ! android:value="@integer/google_play_services_version"/>!
! <receiver!
! ! android:name=".GcmBroadcastReceiver"!
! ! android:permission="com.google.android.c2dm.permission.SEND" >!
! ! <intent-filter>!
! ! ! <action android:name="com.google.android.c2dm.intent.RECEIVE" />!
! ! ! <category android:name="com.example.day15gcm" />!
! ! </intent-filter>!
! </receiver>!
! <service android:name=".GcmIntentService" />
위의 코드를 AndroidManifest.xml 에

<application></application> 의 자식요소로 붙여 넣는다.
<category android:name="app 페키지명" />!
MainActivity.java 코딩
! //필요한 상수 정의하기 !
public static final String EXTRA_MESSAGE = "message";!
public static final String PROPERTY_REG_ID = "registration_id";!
private static final String PROPERTY_APP_VERSION = "appVersion";!
private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;!
!
//Google API Console 에서 만든 API Project Number!
String SENDER_ID = "623534051417";!
!
static final String TAG = "GCMDemo";!
GoogleCloudMessaging gcm;!
SharedPreferences prefs;!
Context context;!
!
//Google Server 에서 발급받은 디바이스 아이디를 저장할 맴버필드 !
String regid;
위의 코드를 맴버필드로 붙여넣기
MainActivity.java 코딩
@Override!
public void onCreate(Bundle savedInstanceState) {!
super.onCreate(savedInstanceState);!
setContentView(R.layout.activity_main);!
context=getApplicationContext();!
//Google play Service 가 사용가능한 디바이스 인지 확인해서 !
if (checkPlayServices()) {//사용가능한 디바이스라면 !
! //GoogleColoudMessageing 객체를 얻어온다. !
gcm = GoogleCloudMessaging.getInstance(this);!
//디바이스 아이디를 읽어와 본다. !
regid = getRegistrationId(context);!
Log.e("디바이스 아이디가 이미 발급되었습니다.", regid);!
//만일 아직 발급받지 않은 상태라면 !
if (regid.isEmpty()) {!
!//발급을 받는 메소드를 호출한다. !
registerInBackground();!
}!
} else {!
Toast.makeText(this, !
!! "이 기기는 Google play Service 가 설치 되어있지 않습니다.",!
!! 0).show();!
}!
}
onCreate() 메소드 작성
MainActivity.java 코딩
//Google Play Service 가 사용 가능한지 체크해서 !
//사용가능하면 true, 사용 불가능하면 false 를 리턴하는 메소드 !
private boolean checkPlayServices() {!
int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);!
if (resultCode != ConnectionResult.SUCCESS) {!
if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {!
GooglePlayServicesUtil.getErrorDialog(resultCode, this,!
PLAY_SERVICES_RESOLUTION_REQUEST).show();!
} else {!
Log.i(TAG, "This device is not supported.");!
finish();!
}!
return false;!
}!
return true;!
}
checkPlayServices() 메소드 작성
//xml 문서에 디바이스 아이디가 저장되어 있는지 확인해서 리턴하는 메소드!
//저장되어 있다면 저장된 디바아스 아이디가 리턴된다.!
//저장되어 있지 않다면 빈 문자열 "" 이 리턴된다. !
private String getRegistrationId(Context context) {!
final SharedPreferences prefs = getGCMPreferences(context);!
String registrationId = prefs.getString(PROPERTY_REG_ID, "");!
if (registrationId.isEmpty()) {!
Log.i(TAG, "Registration not found.");!
return "";!
}!
//만일 앱의 버전이 바뀌었다면 빈문자열 "" 을 리턴해준다. !
int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);!
int currentVersion = getAppVersion(context);!
if (registeredVersion != currentVersion) {!
Log.i(TAG, "App version changed.");!
return "";!
}!
!
return registrationId;!
}
MainActivity.java 코딩
//SharedPreferences 객체를 리턴하는 메소드 !
private SharedPreferences getGCMPreferences(Context context) {!
! //MainActivity.xml 을 Access 하는 SharedPreferences 객체 리턴하기 !
return getSharedPreferences(MainActivity.class.getSimpleName(),!
Context.MODE_PRIVATE);!
}!
//현재 App 의 버전을 리턴하는 메소드 !
private static int getAppVersion(Context context) {!
try {!
PackageInfo packageInfo = context.getPackageManager()!
.getPackageInfo(context.getPackageName(), 0);!
return packageInfo.versionCode;!
} catch (NameNotFoundException e) {!
throw new RuntimeException("Could not get package name: " + e);!
}!
}
MainActivity.java 코딩
//메인 스레드가 아닌곳에서 디바이스를 등록하고 디바이스 아이디를 발급받는 메소드 !
private void registerInBackground() {!
! new RegistrationThread().start();!
}!
!
//현재 App의 버전과 디바이스 아이디를 xml 문서에 저장하는 메소드 !
private void storeRegistrationId(Context context, String regId) {!
final SharedPreferences prefs = getGCMPreferences(context);!
int appVersion = getAppVersion(context);!
Log.i(TAG, "Saving regId on app version " + appVersion);!
SharedPreferences.Editor editor = prefs.edit();!
editor.putString(PROPERTY_REG_ID, regId);!
editor.putInt(PROPERTY_APP_VERSION, appVersion);!
editor.commit();!
}!
//3-rd-party Server 에 디바이스 아이디를 전송하는 메소드 !
public void sendRegistrationIdToBackend(){!
! //프로젝트 상황에 맞게 구현한다. !
! !
}!
@Override!
protected void onResume() {!
super.onResume();!
checkPlayServices();!
}
MainActivity.java 코딩
class RegistrationThread extends Thread{!
! public void run(){!
try {!
if(gcm == null){!
gcm = GoogleCloudMessaging.getInstance(context);!
}!
//Google Server 에 디바이스 아이디를 발급요청하고 !
//발급된 아이디를 맴버필드에 저장한다.!
regid = gcm.register(SENDER_ID);!
//로그에 발급된 아이디 출력하기!
Log.e("디바이스 아이디가 발급되었습니다!", regid);!
//디바이스 아이디를 3-rd-party 서버에 전송하는 메소드 호출!
sendRegistrationIdToBackend();!
//발급받은 디바이스 아이디를 xml 문서에 저장한다. !
storeRegistrationId(context, regid);!
} catch (IOException ex) {//아이디 발급 실패!
Log.e("아이디 발급중 에러발생!",ex.getMessage());!
}!
! }!
}
MainActivity.java 에

Inner Class 로 작성한다.
GcmBroadcastReceiver.java 작성
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver{!
!
! @Override!
! public void onReceive(Context context, Intent intent) {!
! ! // Explicitly specify that GcmIntentService will handle the intent.!
ComponentName comp = new ComponentName(context.getPackageName(),!
GcmIntentService.class.getName());!
// Start the service, keeping the device awake while it is launching.!
startWakefulService(context, (intent.setComponent(comp)));!
setResultCode(Activity.RESULT_OK);! !
! }!
}
GcmIntentService.java 작성
public class GcmIntentService extends IntentService{!
! !
public static final int NOTIFICATION_ID = 1;!
private NotificationManager mNotificationManager;!
NotificationCompat.Builder builder;!
! !
! public GcmIntentService() {!
! ! super("GcmIntentService");!
! ! !
! }!
!
}!
GcmIntentService.java 작성
! @Override!
! protected void onHandleIntent(Intent intent) {!
Bundle extras = intent.getExtras();!
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);!
//도착된 메세지 타입을 읽어온다. !
String messageType = gcm.getMessageType(intent);!
!
if (!extras.isEmpty()) { !
if (GoogleCloudMessaging.!
MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {!
sendNotification("Send error: " + extras.toString());!
} else if (GoogleCloudMessaging.!
MESSAGE_TYPE_DELETED.equals(messageType)) {!
sendNotification("Deleted messages on server: " +!
extras.toString());!
} else if (GoogleCloudMessaging.!
MESSAGE_TYPE_MESSAGE.equals(messageType)) {!
!//Google Server 로 부터 받은 메세지!
!String msg=extras.getString("msg");!
! !//알림 띄우는 메소드 호출 !
sendNotification(decodedMsg);!
}!
}!
// Release the wake lock provided by the WakefulBroadcastReceiver.!
GcmBroadcastReceiver.completeWakefulIntent(intent);!! ! !
! }
GcmIntentService.java 작성
//전달 받은 메세지를 알림센터에 띄우는 메소드 !
private void sendNotification(String msg) {!
mNotificationManager = (NotificationManager)!
this.getSystemService(Context.NOTIFICATION_SERVICE);!
!
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,!
new Intent(this, MainActivity.class), 0);!
!
NotificationCompat.Builder mBuilder =!
new NotificationCompat.Builder(this)!
.setSmallIcon(R.drawable.ic_launcher)!
.setContentTitle("GCM Notification")!
.setStyle(new NotificationCompat.BigTextStyle()!
.bigText(msg))!
.setContentText(msg);!
!
mBuilder.setContentIntent(contentIntent);!
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());!
}
3rd-Party-Server 에 필요한 라이브러리 넣기
1. 안드로이드 sdk 설치된 폴더로 이동



sdkextrasgooglegcmgcm-serverdist

!
2. gcm-server.jar 파일 복사

!
3. 웹프로젝트의 Webcontent/WEB-INF/lib 

폴더에 복사한 파일을 붙여 넣기한다.
3rd-Party-Server 의 gcmTest.html
<!DOCTYPE html>!
<html>!
<head>!
<meta charset="UTF-8">!
<title>gcmTest.html</title>!
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>!
<script type="text/javascript">!
! $(function(){!
! ! $("#msg").keydown(function(event){!
! ! ! if(event.which==13){!
! ! ! ! send();!
! ! ! }!
! ! });!
! });!
! function send(){!
! ! var msg=$("#msg").val();!
! ! $.post("gcm.jsp",{"msg":msg},function(data){!
! ! ! $("#msg").val("");!
! ! });!
! }!
</script>!
</head>!
<body>!
<input type="text" name="msg" id="msg"/>!
<button onclick="send()">전송</button>!
</body>!
<%@page import="com.google.android.gcm.server.MulticastResult"%>!
<%@page import="com.google.android.gcm.server.Message"%>!
<%@page import="com.google.android.gcm.server.Sender"%>!
<%@page import="java.util.ArrayList"%>!
<%@page import="java.net.URLEncoder"%>!
<%@ page pageEncoding="UTF-8"%>!
<%!
! request.setCharacterEncoding("utf-8");!
! String clientId="안드로이드 디바이스 아이디";! !
! String msg=request.getParameter("msg");!
! String encodedMsg=URLEncoder.encode(msg, "utf-8");!
! ArrayList<String> list=new ArrayList<String>();!
! list.add(clientId);!
! //전송자 객체 생성하면서 인자로 구글 프로젝트의 api key 값을 전달한다. !
! Sender sender = new Sender("발급받은 api key");!
! //메세지 빌더 객체를 생성한후 !
! Message.Builder builder=new Message.Builder();!
! //key : value 형태로 데이터를 담는다. !
! builder.addData("msg", encodedMsg);!
! //메세지 빌더객체를 이용해서 Message 객체를 얻어온다. !
! Message message = builder.build();!
! //전송자 객체를 이용해서 메세지를 전송한다. send(메세지, 받을사람, 재전송 시도 횟수) !
! MulticastResult result = sender.send(message, list, 5); !
%>
3rd-Party-Server 의 gcm.jsp

More Related Content

What's hot

오픈소스로 만드는 DB 모니터링 시스템 (w/graphite+grafana)
오픈소스로 만드는 DB 모니터링 시스템 (w/graphite+grafana)오픈소스로 만드는 DB 모니터링 시스템 (w/graphite+grafana)
오픈소스로 만드는 DB 모니터링 시스템 (w/graphite+grafana)I Goo Lee
 
Parse.com 맛보기
Parse.com 맛보기Parse.com 맛보기
Parse.com 맛보기flashscope
 
Startup JavaScript 7 - Node.JS 기초
Startup JavaScript 7 - Node.JS 기초Startup JavaScript 7 - Node.JS 기초
Startup JavaScript 7 - Node.JS 기초Circulus
 
.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기Seong Won Mun
 
실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기
실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기
실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기Minchul Jung
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발NAVER D2
 
Nginx basic configurations
Nginx basic configurationsNginx basic configurations
Nginx basic configurationsJohn Kim
 
Redis data design by usecase
Redis data design by usecaseRedis data design by usecase
Redis data design by usecaseKris Jeong
 
Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구ByungJoon Lee
 
GraphQL overview #2
GraphQL overview #2GraphQL overview #2
GraphQL overview #2기동 이
 
HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형
HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형
HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형Minchul Jung
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.jsWoo Jin Kim
 
overview of spring4
overview of spring4overview of spring4
overview of spring4Arawn Park
 
GraphQL overview
GraphQL overviewGraphQL overview
GraphQL overview기동 이
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수NAVER D2
 
다함께, FluxUtils 한바퀴!
다함께, FluxUtils 한바퀴!다함께, FluxUtils 한바퀴!
다함께, FluxUtils 한바퀴!우영 주
 

What's hot (20)

오픈소스로 만드는 DB 모니터링 시스템 (w/graphite+grafana)
오픈소스로 만드는 DB 모니터링 시스템 (w/graphite+grafana)오픈소스로 만드는 DB 모니터링 시스템 (w/graphite+grafana)
오픈소스로 만드는 DB 모니터링 시스템 (w/graphite+grafana)
 
Parse.com 맛보기
Parse.com 맛보기Parse.com 맛보기
Parse.com 맛보기
 
Html5 performance
Html5 performanceHtml5 performance
Html5 performance
 
What is the meteor?
What is the meteor?What is the meteor?
What is the meteor?
 
Startup JavaScript 7 - Node.JS 기초
Startup JavaScript 7 - Node.JS 기초Startup JavaScript 7 - Node.JS 기초
Startup JavaScript 7 - Node.JS 기초
 
.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기
 
실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기
실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기
실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발
 
Nginx basic configurations
Nginx basic configurationsNginx basic configurations
Nginx basic configurations
 
Redis data design by usecase
Redis data design by usecaseRedis data design by usecase
Redis data design by usecase
 
Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구
 
GraphQL overview #2
GraphQL overview #2GraphQL overview #2
GraphQL overview #2
 
HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형
HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형
HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.js
 
One-day-codelab
One-day-codelabOne-day-codelab
One-day-codelab
 
overview of spring4
overview of spring4overview of spring4
overview of spring4
 
GraphQL overview
GraphQL overviewGraphQL overview
GraphQL overview
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수
 
Node.js intro
Node.js introNode.js intro
Node.js intro
 
다함께, FluxUtils 한바퀴!
다함께, FluxUtils 한바퀴!다함께, FluxUtils 한바퀴!
다함께, FluxUtils 한바퀴!
 

Viewers also liked

IBM MobileFirst Platform 고객사례집
IBM MobileFirst Platform 고객사례집IBM MobileFirst Platform 고객사례집
IBM MobileFirst Platform 고객사례집kimhsam
 
모바일 오피스를 검토하는 기업의 모바일 플랫폼 선정 기준
모바일 오피스를 검토하는 기업의 모바일 플랫폼 선정 기준 모바일 오피스를 검토하는 기업의 모바일 플랫폼 선정 기준
모바일 오피스를 검토하는 기업의 모바일 플랫폼 선정 기준 Bo Seong Seo
 
[한국핀테크포럼] 제7회 핀테크포럼
[한국핀테크포럼] 제7회 핀테크포럼[한국핀테크포럼] 제7회 핀테크포럼
[한국핀테크포럼] 제7회 핀테크포럼Hyeseon Yoon
 
Androidpn guide-0.5.0-ko
Androidpn guide-0.5.0-koAndroidpn guide-0.5.0-ko
Androidpn guide-0.5.0-kosandeepreddyp42
 
[Iga works] live operation targeting push guide
[Iga works] live operation targeting push guide[Iga works] live operation targeting push guide
[Iga works] live operation targeting push guide성인 김
 
Mobile Push Notification Solution
Mobile Push Notification SolutionMobile Push Notification Solution
Mobile Push Notification Solution남익 이
 

Viewers also liked (7)

IBM MobileFirst Platform 고객사례집
IBM MobileFirst Platform 고객사례집IBM MobileFirst Platform 고객사례집
IBM MobileFirst Platform 고객사례집
 
모바일 오피스를 검토하는 기업의 모바일 플랫폼 선정 기준
모바일 오피스를 검토하는 기업의 모바일 플랫폼 선정 기준 모바일 오피스를 검토하는 기업의 모바일 플랫폼 선정 기준
모바일 오피스를 검토하는 기업의 모바일 플랫폼 선정 기준
 
[한국핀테크포럼] 제7회 핀테크포럼
[한국핀테크포럼] 제7회 핀테크포럼[한국핀테크포럼] 제7회 핀테크포럼
[한국핀테크포럼] 제7회 핀테크포럼
 
Androidpn guide-0.5.0-ko
Androidpn guide-0.5.0-koAndroidpn guide-0.5.0-ko
Androidpn guide-0.5.0-ko
 
Mobile Application Development Platform "Morpheus"
Mobile Application Development Platform "Morpheus"Mobile Application Development Platform "Morpheus"
Mobile Application Development Platform "Morpheus"
 
[Iga works] live operation targeting push guide
[Iga works] live operation targeting push guide[Iga works] live operation targeting push guide
[Iga works] live operation targeting push guide
 
Mobile Push Notification Solution
Mobile Push Notification SolutionMobile Push Notification Solution
Mobile Push Notification Solution
 

Similar to Android Google Cloud Message 설정

Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발지수 윤
 
처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4성일 한
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Sangon Lee
 
REST API Development with Spring
REST API Development with SpringREST API Development with Spring
REST API Development with SpringKeesun Baik
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기Jeado Ko
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Testbeom kyun choi
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기현철 조
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게Sungju Jin
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개beom kyun choi
 
Node.js and react
Node.js and reactNode.js and react
Node.js and reactHyungKuIm
 
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]WSConf.
 
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발LGU+
 
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
20131217 html5
20131217 html520131217 html5
20131217 html5DK Lee
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅NAVER D2
 
코틀린 멀티플랫폼, 미지와의 조우
코틀린 멀티플랫폼, 미지와의 조우코틀린 멀티플랫폼, 미지와의 조우
코틀린 멀티플랫폼, 미지와의 조우Arawn Park
 

Similar to Android Google Cloud Message 설정 (20)

Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발
 
Nest js 101
Nest js 101Nest js 101
Nest js 101
 
처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
 
REST API Development with Spring
REST API Development with SpringREST API Development with Spring
REST API Development with Spring
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개
 
Node.js and react
Node.js and reactNode.js and react
Node.js and react
 
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
 
[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초
 
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
 
20131217 html5
20131217 html520131217 html5
20131217 html5
 
테스트
테스트테스트
테스트
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
 
코틀린 멀티플랫폼, 미지와의 조우
코틀린 멀티플랫폼, 미지와의 조우코틀린 멀티플랫폼, 미지와의 조우
코틀린 멀티플랫폼, 미지와의 조우
 

Recently uploaded

INU Graduation Powerpoint-Rabbit FootPrint
INU Graduation Powerpoint-Rabbit FootPrintINU Graduation Powerpoint-Rabbit FootPrint
INU Graduation Powerpoint-Rabbit FootPrintahghwo99
 
인천대학교 컴퓨터공학과 아틀란티스 졸업작품 commINUty PPT
인천대학교 컴퓨터공학과 아틀란티스 졸업작품 commINUty PPT인천대학교 컴퓨터공학과 아틀란티스 졸업작품 commINUty PPT
인천대학교 컴퓨터공학과 아틀란티스 졸업작품 commINUty PPTpcupcu20831004
 
(독서광) 대격변 AI 시대, 데이터로 사고하고 데이터로 리드하라
(독서광) 대격변 AI 시대,   데이터로 사고하고   데이터로 리드하라(독서광) 대격변 AI 시대,   데이터로 사고하고   데이터로 리드하라
(독서광) 대격변 AI 시대, 데이터로 사고하고 데이터로 리드하라Jay Park
 
2024년 5월 27일 개발자 이야기 - AWS 람다의 내부 동작 방식 외
2024년 5월 27일 개발자 이야기 - AWS 람다의 내부 동작 방식 외2024년 5월 27일 개발자 이야기 - AWS 람다의 내부 동작 방식 외
2024년 5월 27일 개발자 이야기 - AWS 람다의 내부 동작 방식 외Jay Park
 
JSI LAB의 X-Chat for SOC 보안관제센터 시큐리티 코파일럿 제품과 사례 소개
JSI LAB의 X-Chat for SOC 보안관제센터 시큐리티 코파일럿 제품과 사례 소개JSI LAB의 X-Chat for SOC 보안관제센터 시큐리티 코파일럿 제품과 사례 소개
JSI LAB의 X-Chat for SOC 보안관제센터 시큐리티 코파일럿 제품과 사례 소개jsilabai
 
암호화 보안USB & 외장하드 중앙관리 솔루션 ‘DataLocker SafeConsole’_DATASHEET
암호화 보안USB & 외장하드 중앙관리 솔루션 ‘DataLocker SafeConsole’_DATASHEET암호화 보안USB & 외장하드 중앙관리 솔루션 ‘DataLocker SafeConsole’_DATASHEET
암호화 보안USB & 외장하드 중앙관리 솔루션 ‘DataLocker SafeConsole’_DATASHEETSoftwide Security
 

Recently uploaded (6)

INU Graduation Powerpoint-Rabbit FootPrint
INU Graduation Powerpoint-Rabbit FootPrintINU Graduation Powerpoint-Rabbit FootPrint
INU Graduation Powerpoint-Rabbit FootPrint
 
인천대학교 컴퓨터공학과 아틀란티스 졸업작품 commINUty PPT
인천대학교 컴퓨터공학과 아틀란티스 졸업작품 commINUty PPT인천대학교 컴퓨터공학과 아틀란티스 졸업작품 commINUty PPT
인천대학교 컴퓨터공학과 아틀란티스 졸업작품 commINUty PPT
 
(독서광) 대격변 AI 시대, 데이터로 사고하고 데이터로 리드하라
(독서광) 대격변 AI 시대,   데이터로 사고하고   데이터로 리드하라(독서광) 대격변 AI 시대,   데이터로 사고하고   데이터로 리드하라
(독서광) 대격변 AI 시대, 데이터로 사고하고 데이터로 리드하라
 
2024년 5월 27일 개발자 이야기 - AWS 람다의 내부 동작 방식 외
2024년 5월 27일 개발자 이야기 - AWS 람다의 내부 동작 방식 외2024년 5월 27일 개발자 이야기 - AWS 람다의 내부 동작 방식 외
2024년 5월 27일 개발자 이야기 - AWS 람다의 내부 동작 방식 외
 
JSI LAB의 X-Chat for SOC 보안관제센터 시큐리티 코파일럿 제품과 사례 소개
JSI LAB의 X-Chat for SOC 보안관제센터 시큐리티 코파일럿 제품과 사례 소개JSI LAB의 X-Chat for SOC 보안관제센터 시큐리티 코파일럿 제품과 사례 소개
JSI LAB의 X-Chat for SOC 보안관제센터 시큐리티 코파일럿 제품과 사례 소개
 
암호화 보안USB & 외장하드 중앙관리 솔루션 ‘DataLocker SafeConsole’_DATASHEET
암호화 보안USB & 외장하드 중앙관리 솔루션 ‘DataLocker SafeConsole’_DATASHEET암호화 보안USB & 외장하드 중앙관리 솔루션 ‘DataLocker SafeConsole’_DATASHEET
암호화 보안USB & 외장하드 중앙관리 솔루션 ‘DataLocker SafeConsole’_DATASHEET
 

Android Google Cloud Message 설정

  • 2. Google Cloud Message for Android 스위치 활성화
  • 3. Google Cloud Message for Android 스위치 활성화
  • 12. google-play-services_lib 프로젝트 import android sdk 다운로드 폴더로 이동해서 google-play-services_lib 프로젝트를 선택해서 import 한다.
  • 13. 프로젝트를 만들고 import 된 google-play-services_lib 프로젝트를 라이브러리로 참조하도록 설정한다.
  • 15. AndroidManifest.xml 설정 <uses-permission android:name="android.permission.INTERNET" />! <uses-permission android:name="android.permission.GET_ACCOUNTS" />! <uses-permission android:name="android.permission.WAKE_LOCK" />! <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />! ! <permission android:name="com.example.day15gcm.permission.C2D_MESSAGE"! android:protectionLevel="signature" />! <uses-permission android:name="com.example.day15gcm.permission.C2D_MESSAGE" /> 위의 코드를 AndroidManifest.xml 에 <manifest></manifest> 의 자식요소로 붙여 넣는다. <permission android:name="app 페키지명.permission.C2D_MESSAGE"! android:protectionLevel="signature" />! <uses-permission android:name="app 페키지명.permission.C2D_MESSAGE" />
  • 16. AndroidManifest.xml 설정 ! <meta-data android:name="com.google.android.gms.version"! ! ! android:value="@integer/google_play_services_version"/>! ! <receiver! ! ! android:name=".GcmBroadcastReceiver"! ! ! android:permission="com.google.android.c2dm.permission.SEND" >! ! ! <intent-filter>! ! ! ! <action android:name="com.google.android.c2dm.intent.RECEIVE" />! ! ! ! <category android:name="com.example.day15gcm" />! ! ! </intent-filter>! ! </receiver>! ! <service android:name=".GcmIntentService" /> 위의 코드를 AndroidManifest.xml 에 <application></application> 의 자식요소로 붙여 넣는다. <category android:name="app 페키지명" />!
  • 17. MainActivity.java 코딩 ! //필요한 상수 정의하기 ! public static final String EXTRA_MESSAGE = "message";! public static final String PROPERTY_REG_ID = "registration_id";! private static final String PROPERTY_APP_VERSION = "appVersion";! private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;! ! //Google API Console 에서 만든 API Project Number! String SENDER_ID = "623534051417";! ! static final String TAG = "GCMDemo";! GoogleCloudMessaging gcm;! SharedPreferences prefs;! Context context;! ! //Google Server 에서 발급받은 디바이스 아이디를 저장할 맴버필드 ! String regid; 위의 코드를 맴버필드로 붙여넣기
  • 18. MainActivity.java 코딩 @Override! public void onCreate(Bundle savedInstanceState) {! super.onCreate(savedInstanceState);! setContentView(R.layout.activity_main);! context=getApplicationContext();! //Google play Service 가 사용가능한 디바이스 인지 확인해서 ! if (checkPlayServices()) {//사용가능한 디바이스라면 ! ! //GoogleColoudMessageing 객체를 얻어온다. ! gcm = GoogleCloudMessaging.getInstance(this);! //디바이스 아이디를 읽어와 본다. ! regid = getRegistrationId(context);! Log.e("디바이스 아이디가 이미 발급되었습니다.", regid);! //만일 아직 발급받지 않은 상태라면 ! if (regid.isEmpty()) {! !//발급을 받는 메소드를 호출한다. ! registerInBackground();! }! } else {! Toast.makeText(this, ! !! "이 기기는 Google play Service 가 설치 되어있지 않습니다.",! !! 0).show();! }! } onCreate() 메소드 작성
  • 19. MainActivity.java 코딩 //Google Play Service 가 사용 가능한지 체크해서 ! //사용가능하면 true, 사용 불가능하면 false 를 리턴하는 메소드 ! private boolean checkPlayServices() {! int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);! if (resultCode != ConnectionResult.SUCCESS) {! if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {! GooglePlayServicesUtil.getErrorDialog(resultCode, this,! PLAY_SERVICES_RESOLUTION_REQUEST).show();! } else {! Log.i(TAG, "This device is not supported.");! finish();! }! return false;! }! return true;! } checkPlayServices() 메소드 작성
  • 20. //xml 문서에 디바이스 아이디가 저장되어 있는지 확인해서 리턴하는 메소드! //저장되어 있다면 저장된 디바아스 아이디가 리턴된다.! //저장되어 있지 않다면 빈 문자열 "" 이 리턴된다. ! private String getRegistrationId(Context context) {! final SharedPreferences prefs = getGCMPreferences(context);! String registrationId = prefs.getString(PROPERTY_REG_ID, "");! if (registrationId.isEmpty()) {! Log.i(TAG, "Registration not found.");! return "";! }! //만일 앱의 버전이 바뀌었다면 빈문자열 "" 을 리턴해준다. ! int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);! int currentVersion = getAppVersion(context);! if (registeredVersion != currentVersion) {! Log.i(TAG, "App version changed.");! return "";! }! ! return registrationId;! } MainActivity.java 코딩
  • 21. //SharedPreferences 객체를 리턴하는 메소드 ! private SharedPreferences getGCMPreferences(Context context) {! ! //MainActivity.xml 을 Access 하는 SharedPreferences 객체 리턴하기 ! return getSharedPreferences(MainActivity.class.getSimpleName(),! Context.MODE_PRIVATE);! }! //현재 App 의 버전을 리턴하는 메소드 ! private static int getAppVersion(Context context) {! try {! PackageInfo packageInfo = context.getPackageManager()! .getPackageInfo(context.getPackageName(), 0);! return packageInfo.versionCode;! } catch (NameNotFoundException e) {! throw new RuntimeException("Could not get package name: " + e);! }! } MainActivity.java 코딩
  • 22. //메인 스레드가 아닌곳에서 디바이스를 등록하고 디바이스 아이디를 발급받는 메소드 ! private void registerInBackground() {! ! new RegistrationThread().start();! }! ! //현재 App의 버전과 디바이스 아이디를 xml 문서에 저장하는 메소드 ! private void storeRegistrationId(Context context, String regId) {! final SharedPreferences prefs = getGCMPreferences(context);! int appVersion = getAppVersion(context);! Log.i(TAG, "Saving regId on app version " + appVersion);! SharedPreferences.Editor editor = prefs.edit();! editor.putString(PROPERTY_REG_ID, regId);! editor.putInt(PROPERTY_APP_VERSION, appVersion);! editor.commit();! }! //3-rd-party Server 에 디바이스 아이디를 전송하는 메소드 ! public void sendRegistrationIdToBackend(){! ! //프로젝트 상황에 맞게 구현한다. ! ! ! }! @Override! protected void onResume() {! super.onResume();! checkPlayServices();! } MainActivity.java 코딩
  • 23. class RegistrationThread extends Thread{! ! public void run(){! try {! if(gcm == null){! gcm = GoogleCloudMessaging.getInstance(context);! }! //Google Server 에 디바이스 아이디를 발급요청하고 ! //발급된 아이디를 맴버필드에 저장한다.! regid = gcm.register(SENDER_ID);! //로그에 발급된 아이디 출력하기! Log.e("디바이스 아이디가 발급되었습니다!", regid);! //디바이스 아이디를 3-rd-party 서버에 전송하는 메소드 호출! sendRegistrationIdToBackend();! //발급받은 디바이스 아이디를 xml 문서에 저장한다. ! storeRegistrationId(context, regid);! } catch (IOException ex) {//아이디 발급 실패! Log.e("아이디 발급중 에러발생!",ex.getMessage());! }! ! }! } MainActivity.java 에 Inner Class 로 작성한다.
  • 24. GcmBroadcastReceiver.java 작성 public class GcmBroadcastReceiver extends WakefulBroadcastReceiver{! ! ! @Override! ! public void onReceive(Context context, Intent intent) {! ! ! // Explicitly specify that GcmIntentService will handle the intent.! ComponentName comp = new ComponentName(context.getPackageName(),! GcmIntentService.class.getName());! // Start the service, keeping the device awake while it is launching.! startWakefulService(context, (intent.setComponent(comp)));! setResultCode(Activity.RESULT_OK);! ! ! }! }
  • 25. GcmIntentService.java 작성 public class GcmIntentService extends IntentService{! ! ! public static final int NOTIFICATION_ID = 1;! private NotificationManager mNotificationManager;! NotificationCompat.Builder builder;! ! ! ! public GcmIntentService() {! ! ! super("GcmIntentService");! ! ! ! ! }! ! }!
  • 26. GcmIntentService.java 작성 ! @Override! ! protected void onHandleIntent(Intent intent) {! Bundle extras = intent.getExtras();! GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);! //도착된 메세지 타입을 읽어온다. ! String messageType = gcm.getMessageType(intent);! ! if (!extras.isEmpty()) { ! if (GoogleCloudMessaging.! MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {! sendNotification("Send error: " + extras.toString());! } else if (GoogleCloudMessaging.! MESSAGE_TYPE_DELETED.equals(messageType)) {! sendNotification("Deleted messages on server: " +! extras.toString());! } else if (GoogleCloudMessaging.! MESSAGE_TYPE_MESSAGE.equals(messageType)) {! !//Google Server 로 부터 받은 메세지! !String msg=extras.getString("msg");! ! !//알림 띄우는 메소드 호출 ! sendNotification(decodedMsg);! }! }! // Release the wake lock provided by the WakefulBroadcastReceiver.! GcmBroadcastReceiver.completeWakefulIntent(intent);!! ! ! ! }
  • 27. GcmIntentService.java 작성 //전달 받은 메세지를 알림센터에 띄우는 메소드 ! private void sendNotification(String msg) {! mNotificationManager = (NotificationManager)! this.getSystemService(Context.NOTIFICATION_SERVICE);! ! PendingIntent contentIntent = PendingIntent.getActivity(this, 0,! new Intent(this, MainActivity.class), 0);! ! NotificationCompat.Builder mBuilder =! new NotificationCompat.Builder(this)! .setSmallIcon(R.drawable.ic_launcher)! .setContentTitle("GCM Notification")! .setStyle(new NotificationCompat.BigTextStyle()! .bigText(msg))! .setContentText(msg);! ! mBuilder.setContentIntent(contentIntent);! mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());! }
  • 28. 3rd-Party-Server 에 필요한 라이브러리 넣기 1. 안드로이드 sdk 설치된 폴더로 이동 sdkextrasgooglegcmgcm-serverdist ! 2. gcm-server.jar 파일 복사 ! 3. 웹프로젝트의 Webcontent/WEB-INF/lib 폴더에 복사한 파일을 붙여 넣기한다.
  • 29. 3rd-Party-Server 의 gcmTest.html <!DOCTYPE html>! <html>! <head>! <meta charset="UTF-8">! <title>gcmTest.html</title>! <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>! <script type="text/javascript">! ! $(function(){! ! ! $("#msg").keydown(function(event){! ! ! ! if(event.which==13){! ! ! ! ! send();! ! ! ! }! ! ! });! ! });! ! function send(){! ! ! var msg=$("#msg").val();! ! ! $.post("gcm.jsp",{"msg":msg},function(data){! ! ! ! $("#msg").val("");! ! ! });! ! }! </script>! </head>! <body>! <input type="text" name="msg" id="msg"/>! <button onclick="send()">전송</button>! </body>!
  • 30. <%@page import="com.google.android.gcm.server.MulticastResult"%>! <%@page import="com.google.android.gcm.server.Message"%>! <%@page import="com.google.android.gcm.server.Sender"%>! <%@page import="java.util.ArrayList"%>! <%@page import="java.net.URLEncoder"%>! <%@ page pageEncoding="UTF-8"%>! <%! ! request.setCharacterEncoding("utf-8");! ! String clientId="안드로이드 디바이스 아이디";! ! ! String msg=request.getParameter("msg");! ! String encodedMsg=URLEncoder.encode(msg, "utf-8");! ! ArrayList<String> list=new ArrayList<String>();! ! list.add(clientId);! ! //전송자 객체 생성하면서 인자로 구글 프로젝트의 api key 값을 전달한다. ! ! Sender sender = new Sender("발급받은 api key");! ! //메세지 빌더 객체를 생성한후 ! ! Message.Builder builder=new Message.Builder();! ! //key : value 형태로 데이터를 담는다. ! ! builder.addData("msg", encodedMsg);! ! //메세지 빌더객체를 이용해서 Message 객체를 얻어온다. ! ! Message message = builder.build();! ! //전송자 객체를 이용해서 메세지를 전송한다. send(메세지, 받을사람, 재전송 시도 횟수) ! ! MulticastResult result = sender.send(message, list, 5); ! %> 3rd-Party-Server 의 gcm.jsp