Android SDK Manual

Android SDK 3.5.4 변경 사항
※ Firebase 최신 라이브러리 적용.
     firebase-core:18.0.3, firebase-messaging:21.1.0.
※ targetSdkVersion 30 적용.(Android OS 11)
※ Properties deprecated 및 키 설정 기능 추가
     FingerPushManager.setAppKey(String appKey);
     FingerPushManager.setAppSecret(String secretKey);
1. 핑거푸시 관리자 사이트 APP 생성

1. 앱 추가를 눌러 핑거푸시 앱을 생성합니다.
manual_for_android_1-1

2. 필수값인 앱 이름, 앱 구분, 앱 카테고릴 입력 또는 선택합니다.
manual_for_android_1-2

3. 설정을 선택하면 App Key, App Secret 을 확인할 수 있습니다.
manual_for_android_1-3

2. FCM APP 생성

※ 기존 GCM 프로젝트가 있는 경우, 반드시 기존 프로젝트를 불러오기를 해서 사용해야 합니다.
1. 프로젝트 추가를 한 뒤, 추가한 프로젝트를 선택합니다.
manual_for_android_2-1

2. ‘설정 > 프로젝트 설정’ 으로 이동합니다.
manual_for_android_2-2

3. 서버(API)키와 발신자(Sender) ID를 확인할 수 있습니다.
manual_for_android_2-3

4. 프로젝트 메인 화면으로 이동 후, ‘Android 앱에 Firebase 추가’ 를 선택합니다.
manual_for_android_2-4

manual_for_android_2-5

5. Android 패키지 이름을 입력후 앱 등록을 하고 ‘google-services.json’ 파일을 다운로드 받습니다.
   그 뒤 다운받은 json 파일을 아래와 같은 위치로 이동 또는 복사합니다.
manual_for_android_2-6
3. 핑거푸시 관리자 사이트에 APP 키 등록하기

1. 핑거푸시 관리자 사이트 설정 화면에 FCM에서 발급된 ‘이전 서버(API) 키’ 를 입력합니다.
   핑거푸시에 이미 등록된 앱의 서버키를 변경할 경우, 기존 사용자(GCM)의 푸시 수신에 문제가 발생할 수 있습니다.
manual_for_android_3-1
4. 프로젝트 생성

1. 안드로이드 스튜디오로 프로젝트를 생성합니다.
manual_for_android_4-1

manual_for_android_4-2

2. 프로젝트의 최소 버전은 API 16(젤리빈) 으로 설정합니다.
manual_for_android_4-3

manual_for_android_4-4

manual_for_android_4-5

3. 프로젝트를 구조는 아래와 같습니다.
manual_for_android_4-6
5. 핑거푸시 키 등록하기

1. Application 클래스 또는 처음 실행되는 Activity 등에서 FingerPushManager.setAppKey(String appKey), FingerPushManager.setAppSecret(String secretKey) 를 사용하여 키 설정을 합니다.
FingerPushManager.setAppKey(String appKey);
FingerPushManager.setAppSecret(String secretKey);
6. Gradle 설정

1. 프로젝트 build.gradle(Top-level build.gradle)에 ‘classpath ‘com.google.gms:google-services:4.3.5’ 을 추가합니다.
				buildscript {
				    repositories {
				        jcenter()
				    }
				    dependencies {
				        ...
				        classpath 'com.google.gms:google-services:4.3.5'
				    }
				}

<project>/build.gradle


2. 앱 수준 build.gradle(Module-level build.gradle) 최하단에 apply plugin: ‘com.google.gms.google-services’ 을(를) 추가합니다.
				// add this at the bottom
				apply plugin: 'com.google.gms.google-services'

<project>/<app-module>/build.gradle


3. dependencies 에 implementation ‘com.google.firebase:firebase-messaging:21.1.0’, implementation ‘com.google.firebase:firebase-core:18.0.3’ 을(를) 추가합니다.
				dependencies {
				    implementation 'com.google.firebase:firebase-messaging:21.1.0'
				    implementation 'com.google.firebase:firebase-core:18.0.3'
				}

<project>/<app-module>/build.gradle

7. AAR 추가하기

1. ‘File > Project Structure’ 을 선택합니다.
manual_for_android_7-1

2. Project Structure 팝업창에서 ‘+’ 을 선택합니다.
manual_for_android_7-2

3. ‘New Module’ 팝업창에서 ‘Import .JAR/.AAR Package’ 선택하고 Next 를 누릅니다.
manual_for_android_7-3

4. 프로젝트 모듈을 선택하고 ‘Dependencies’ 탭으로 이동합니다.
이동한 뒤 하단 ‘+’ 를 누르고 ‘Module dependency’ 를 선택합니다.
manual_for_android_7-4

5. import한 fingerpush.aar 파일을 선택합니다.

6. 정상적으로 fingerpush.aar 파일이 추가됐다면 module-level build.gradle 에 행이 추가됩니다.

 

				...
				dependencies {
				    ...
				    implementation project(':fingerpush')
				}

<project>/<app-module>/build.gradle

8. AndroidX Migration

1. gradle.properties 파일에 아래와 같이 추가합니다.
android.useAndroidX=true
android.enableJetifier=true

gradle.properties

9. 디바이스 등록

1. MainActivity.java 에서 ‘FingerPushManager.getInstance(Context).setDevice(ObjectListener)’ 메소드를 호출합니다.

※ 단말기 토큰은 생성, 파기, 갱신 등의 생명주기가 있기 때문에 때문에
setDevice() 함수를 앱 실행시 항시 호출해야 합니다.

				@Override
				protected void onCreate(Bundle savedInstanceState) {
				    ...
				    FingerPushManager.getInstance(Context).setDevice(new NetworkUtility.ObjectListener() {
				        @Override
				        public void onComplete(String code, String message, JSONObject jsonObject) {
				            // code 200, 201 이 반환된 경우 정상적으로 디바이스가 등록된 것입니다.
				        }
				    
				        @Override
				        public void onError(String code, String message) {
				            // 코드 504 가 반환된 경우 이미 디바이스가 등록된 상태입니다.
				        }
				    });
				}

MainActivty.java


2. 디바이스가 정상적으로 등록됐다면, 핑거푸시 관리자 사이트에서 확인 가능합니다.
manual_for_android_10-1
10. IntentService 클래스 생성

1. ‘main/java/app_package’ 에 ‘IntentService.java’ 클래스 파일을 생성합니다.
manual_for_android_8-1

2. 생성한 IntentService.java 클래스 파일에서 ‘FingerPushFcmListener’을 상속받습니다.
상속 받은 뒤 ‘onMessage(Context context, Bundle data)’ 를 override 합니다.
				public class IntentService extends FingerPushFcmListener {
				
				    @Override
				    public void onMessage(Context context, Bundle data) {
				        createNotificationChannel(data);
				    }
				
				}

* 기본 Notification 생성 방법
※ Caution
Target Android 8.0 (API level 26) 이상은 ‘Channel’ 을 생성해야 Notification 이 노출됩니다.
Channel은 최초 생성 후 사용자가 제어권을 가져가게 됩니다. Channel Name 과 Channel Description 은 변경 가능합니다.


Channel 에 대한 상세 내용은 [페이지 이동] 을 참조바랍니다.

				private void createNotificationChannel(Bundle data) {
				    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
				    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
				        NotificationChannel mChannel = new NotificationChannel("Channel ID", "Channel Name", NotificationManager.IMPORTANCE_HIGH);
				        mChannel.setDescription(null);
				        mNotificationManager.createNotificationChannel(mChannel);
				    }
				
				    Intent intent = new Intent(IntentService.this, MainActivity.class);
				    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
				
				    PendingIntent pi = PendingIntent.getActivity(IntentService.this, (int) System.currentTimeMillis(), intent, PendingIntent.FLAG_CANCEL_CURRENT);
				    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
				        .setSmallIcon(R.mipmap.ic_launcher)
				        .setContentTitle(data.getString("data.message"))
				        .setContentText("Hello World!");
				    mBuilder.setContentIntent(pi);
				
				    mNotificationManager.notify((int) System.currentTimeMillis(), mBuilder.build());
				}

IntentService.java

* FingerNotification 생성 방법
   FingerNotification은 기존 Notification 보다 좀 더 편하게 생성할 수 있게 핑거푸시에서 제공하는 클래스입니다.

				private void createNotificationChannel(Bundle data) {
				    Intent intent = new Intent(IntentService.this, MainActivity.class);
				    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
				
				    PendingIntent pi = PendingIntent.getActivity(IntentService.this, (int) System.currentTimeMillis(), intent, PendingIntent.FLAG_CANCEL_CURRENT);
				
				    FingerNotification fingerNotification = new FingerNotification(this);
				    fingerNotification.setNotificationIdentifier((int) System.currentTimeMillis());
				    fingerNotification.setIcon(R.drawable.m_ic_launcher); // Notification small icon
				    fingerNotification.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
				    fingerNotification.setVibrate(new long[]{0, 500, 600, 1000});
				    fingerNotification.setLights(Color.parseColor("#ffff00ff"), 500, 500);
				    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
				        fingerNotification.setColor(Color.rgb(0, 114, 162));
				    }
				    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
				        fingerNotification.createChannel("channel_id", "channel_name");
				    }				   
				    fingerNotification.showNotification(data, pi);
				}

IntentService.java


3. 디바이스에서 푸시 수신 데이터(Payload)는 Bundle 타입으로 전달 받을 수 있으며, Bundle 데이터는 아래와 같습니다.
				data.msgTag : 메세지 번호
				data.code : CD:1;IM:0;PT:DEFT	
				data.time : 보낸시간
				data.appTitle : 핑거푸시 앱이름
				data.badge : 뱃지
				data.sound : 사운드
				data.title : 메세지 제목
				data.message : 메세지내용
				data.weblink : 웹링크 url
				data.labelCode : 라벨코드
				data.img : 이미지여부	
				data.imgUrl : 이미지url
				data.cd1 : 커스텀 데이터 
				data.cd2 : 커스텀 데이터
				data.cd3 : 커스텀 데이터

onMessage Bundle 데이터


4. MessageID, MessageLabel, PushMode 가져오는 방법
				String messageId = FingerPushManager.getMessageId(Bundle bundle);
				String messageLabel = FingerPushManager.getMessageLabel(Bundle bundle);
				String pushMode = FingerPushManager.getPushMode(Bundle bundle);
11. AndroidManifest 설정

1. allowBackup 값을 false 로 설정합니다.
				<application
				    android:allowBackup="false"
				    android:icon="@mipmap/ic_launcher"
				    android:label="@string/app_name">
				    ...
				</application>

AndroidManifest.xml


2. 9번에서 생성한 IntentService 클래스를 AndroidManifest.xml에 추가합니다.
<application>
    ...
    <service android:name=".IntentService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
</application>

AndroidManifest.xml

12. 저장소 권한 설정(선택사항)

1. 디바이스 관리를 위해 저장소 권한을 사용하는 것을 권장합니다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    if (!preferences.getBoolean(MANAGE_FILES_ACCESS, false)) {
        if (!Environment.isExternalStorageManager()) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
            intent.setData(Uri.parse(String.format("package:%s",getApplicationContext().getPackageName())));
            startActivityForResult(intent, STORAGE_REQUEST_CODE);
            return;
        }
    }
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                || checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_REQUEST_CODE);
            return;
        }
    }

    setDevice();
}

 

2. 저장소 권한 여부를 체크한 후, 허용 또는 거부와 무관하게 setDevice() 를 호출합니다.
				@Override
				public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
				    switch (requestCode) {
				        case STORAGE_REQUEST_CODE:
				            setDevice();
				            break;
				    }
				}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == STORAGE_REQUEST_CODE) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {

            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
            preferences.edit().putBoolean(MANAGE_FILES_ACCESS, true).commit();

            if (Environment.isExternalStorageManager()) {
                // 허용한 경우
            } else {
                // 거절한 경우
            }
            
            setDevice();
        }
    }
}

3. 외부 저장소를 사용하려면 아래 권한 및 기능을 활성화합니다.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

<application
    android:requestLegacyExternalStorage="true">
    ...
</application>

AndroidManifest.xml

13. ProGuard 설정

1. ProGuard 를 사용하는 경우 다음 규칙을 추가합니다.
				# For FingerPush SDK
				-dontwarn com.fingerpush.**
API 연동 결과 코드
코드 내용 비고
200 정상처리  
403 App_key, secret 오류, 권한없음  
404 조회 대상 없음, 조회 결과 없음  
500 처리 중 에러  
503 필수 값 없음  
504 이미 등록된 토큰 디바이스 등록에서만 사용