APP/안드로이드

android firebase를 사용한 FCM push notification

자코린이 2022. 10. 14. 01:55

처음은 firsbase 에 접속하여 fcm 서비스를 신청하는 것입니다.

https://console.firebase.google.com 

 

로그인 - Google 계정

이메일 또는 휴대전화

accounts.google.com

 

시작하기 -> 프로젝트 만들기 를 선택합니다.

저는 일단 안드로이드만 사용할 것이므로 안드로이드를 선택해줍니다.

각 내용에 안드로이드 앱을 만들 때 적은 내용을 적어 넣습니다.

혹시 앱 패키지 이름을 모르시면 아래 사진에 표시된 곳에 가시면 나옵니다.

구글에서 설명해주는 것을 그대로 하시면 됩니다.

여기까지하시면 기본적인 firebase 설정이 끝났습니다.

 

이제 안드로이드에서 메시지를 받을 수 있게 소스를 추가해줍시다.

androidmanifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="kr.pe.jw.honeyatbee">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>
    <application
       ...여러분 앱 내용...
       >
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service

            android:name=".MyFirebaseMessagingService"
            android:exported="true">

            <intent-filter>

                <action android:name="com.google.firebase.MESSAGING_EVENT"/>

            </intent-filter>

        </service>
    </application>

</manifest>

 

build.gradle(project)

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
        mavenCentral()  // Maven Central repository
    }

    dependencies {

        classpath 'com.google.gms:google-services:4.3.14'
    }
}

plugins {
    id 'com.android.application' version '7.3.0' apply false
    id 'com.android.library' version '7.3.0' apply false
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

 

build.gradle(module)

plugins {
    id 'com.android.application'

    id 'com.google.gms.google-services'
}
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
android {
    ...
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.5.1'
    implementation 'com.google.android.material:material:1.6.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    implementation platform('com.google.firebase:firebase-bom:31.0.0')
    implementation 'com.google.firebase:firebase-analytics'
    implementation 'com.google.firebase:firebase-messaging'
    implementation 'com.google.firebase:firebase-core:21.1.1'
    implementation 'com.google.firebase:firebase-auth:21.1.0'
}

 

java 파일 생성

MyFirebaseMessagingService.java

package kr.pe.jw.honeyatbee;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Build;

import androidx.core.app.NotificationCompat;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        if (remoteMessage != null && remoteMessage.getData().size() > 0) {
            sendNotification(remoteMessage);
        }
    }

    private void sendNotification(RemoteMessage remoteMessage) {

        String title = remoteMessage.getData().get("title");
        String message = remoteMessage.getData().get("message");

        final String CHANNEL_ID = "ChannerID";
        NotificationManager mManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            final String CHANNEL_NAME = "ChannerName";
            final String CHANNEL_DESCRIPTION = "ChannerDescription";
            final int importance = NotificationManager.IMPORTANCE_HIGH;

            // add in API level 26
            NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, importance);
            mChannel.setDescription(CHANNEL_DESCRIPTION);
            mChannel.enableLights(true);
            mChannel.enableVibration(true);
            mChannel.setVibrationPattern(new long[]{100, 200, 100, 200});
            mChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
            mManager.createNotificationChannel(mChannel);
        }

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
        builder.setSmallIcon(R.drawable.ic_launcher_background);
        builder.setAutoCancel(true);
        builder.setDefaults(Notification.DEFAULT_ALL);
        builder.setWhen(System.currentTimeMillis());
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setContentTitle(title);
        builder.setContentText(message);
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            builder.setContentTitle(title);
            builder.setVibrate(new long[]{500, 500});
        }
        mManager.notify(0, builder.build());
    }

    @Override
    public void onNewToken(String s) {
        super.onNewToken(s);
    }

}

 

mainactivity.java

...
//oncreate 메소드 안에 넣어주세요
FirebaseMessaging.getInstance().getToken()
                .addOnCompleteListener(new OnCompleteListener<String>() {
                    @Override
                    public void onComplete(@NonNull Task<String> task) {
                        if(!task.isSuccessful()){
                            Log.w("FCM Log", "getInstanceId faild", task.getException());
                            return;
                        }
                        // Get new FCM registration token
                        String token = task.getResult();
                        Log.d("FCM Log", "FCM 토근 : " + token);
                        //Toast.makeText(MainActivity.this, token, Toast.LENGTH_SHORT).show();
                    }
                });
                
...

 

여기까지 하시면 안드로이드 클라이언트가 끝났습니다.

확인하기 위한 방법으로 2가지가 있습니다.

1. 직접 서버 만들기 (저는 firebase 에서 잘 안 되어 직접 하였습니다.)

2022.10.14 - [BACK END/node.js] - FCM을 이용한 push notification backend

 

FCM을 이용한 push notification backend

회사에서 개발중인 앱의 psuh 알람을 개발하는 부분이 있어 개발하기 위해 자료를 찾았습니다. 일단 firebase와 안드로이드 클라이언트 부분은 완성되어 있다는 가정하에 node 서버를 적겠습니다. fi

jacorinne.tistory.com

 

2. firebase 에서 테스트(가끔 잘 실행이 안 되는 경우가 있음)

왼쪽에 보시면 참여 -> cloud messaging이 보입니다. 

여기에 들어가시면 됩니다.

send your first messaage 를 누릅니다.

 

내용을 적고 아래의 다음 버튼을 누릅니다.

시간을 선택하고 한번 제일 마지막의 검토 버튼을 누르고 확인을 누릅니다.

 

아래 사진은 실행된 내용입니다.

 

여기까지 긴 글 읽어 주시느라 감사했습니다.

개발에 도움이 되셨으면 합니다. :)