본문 바로가기
앱/Android(안드로이드 스튜디오)

Android(안드로이드 스튜디오) 푸시 알림 수신(FCM)

by redbear0077 2024. 7. 21.
반응형

Android(안드로이드 스튜디오) 푸시 알림 수신

모든 내용을 따라한 후 알림이 안오는경우

1. 4의 알림 권한 확인

2. 5의 토큰을 다시 넣어본다.

3. 2번의 내용을 확인해 본다.

4. 코드를 내환경에 적절하게 넣었는지 확인한다.

1. 안드로이드 프로젝트 생성
  • 환경
Empty Views Activity로 생성
name : test
language : java
minimum SDK : API 24(Nougat, Android 7.0)
build confiquration lanquaqe : kotin DSL

 

2. firebase프로젝트 생성
  • 안드로이드 패기지 이름확인
안드로이드 프로젝트 build.gradle.kts(app) > android > namespace : 패키지이름

 

  • google-services.json파일 추가
google-services.json파일이 경로에 있어야 한다

 

  • Firebase SDK 추가
추가를 잘해야 작동한다.!!!!
프로젝트마다 이미지(공식문서)와 다를수 있다

예시파일 하단 참고
build.gradle.kts(Project), build.gradle.kts(app), lbs.versions.toml

 

 

3. 코드 작성
  • MyFirebaseMessagingService파일 생성
정상적인 SDK추가시 
FirebaseMessagingService를 import할수있다
public class MyFirebaseMessagingService extends FirebaseMessagingService {
    // 생성할 채널명
    private final String CHANNEL_ID = "fcm_message_channel";
    // 로그 명
    private final String LOG = "MyFirebaseMessaging";
}
  • 토큰확인(앱설치시 생성되는 토큰)
onNewToken으로 토큰 확인
@Override
public void onNewToken(String token) {
    super.onNewToken(token);
    Log.d("FCM", "Refreshed token: " + token);
    // 필요한 경우 여기에서 토큰을 서버에 보내 등록
}

 

  • 전송받은 메시지 확인
onMessageReceived으로 받은 메시지 확인
@Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        // 메시지 수신 시 로직
        Log.d("FCM", "From: " + remoteMessage.getFrom());

        // 알림 메시지가 있는 경우
        if (remoteMessage.getNotification() != null) {
            Log.d("FCM", "Message Notification Body1: " + remoteMessage.getNotification().getBody());
        }
    }

전체 코드는 하단 참조

  • service 추가
<uses-permission android:name="android.permission.INTERNET"/>
...
<application

...
</activity>
	<!--MyFirebaseMessagingService는 자신이 생성한 파일의 위치로 설정-->
    <service android:name=".MyFirebaseMessagingService"
        android:exported="true">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
...
</application>

 

  • 받은 메시지 알림(푸시 알림)에 표시
sendNotification로 받은 메시지 알림(푸시)에 표시
아이콘 설정은 프로젝트 생성시 있는 아이콘 사
// 수신된 메시지를 사용자에게 알림으로 보여주는 메서드입니다.
private void sendNotification(String messageBody, String messageTitle) {
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* 요청 코드 */, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);

    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, CHANNEL_ID)
                    .setSmallIcon(R.drawable.ic_launcher_foreground) // 알림 아이콘 설정
                    .setContentTitle(messageTitle)  // 알림 제목으로 Firebase에서 받은 제목을 사용
                    .setContentText(messageBody)  // 알림 내용으로 Firebase에서 받은 메시지를 사용
                    .setAutoCancel(true)  // 사용자가 알림을 탭하면 알림이 사라집니다.
                    .setSound(defaultSoundUri)  // 알림 소리 설정
                    .setContentIntent(pendingIntent);  // 알림을 탭할 때 MainActivity로 이동

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    // Android Oreo(API 레벨 26) 이상에서는 알림 채널을 생성해야 합니다.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
                "Channel human readable title", // 사용자가 이해할 수 있는 채널 제목
                NotificationManager.IMPORTANCE_DEFAULT);
        notificationManager.createNotificationChannel(channel);
    }

    notificationManager.notify(0 /* 알림 ID */, notificationBuilder.build());
}

 

4. 알림 권한 허용
수동 알림 권한 설정
설정 > Apps > 설치한 명 > Notifications > All 앱명 notifications > 켜기

 

5. 토큰 생성 및 테스트 알림 발송

  • 토큰 생성
앱을 실행하면 토큰이 생성된다.
코드에 적어둔 로그로 토큰을 확인한다.

  • 테스트 알림 발송 준비

  • 토큰 넣기
로그에서 생성한 토큰을 넣고 테스트 메시지를 전송한다.

 

  • 받은 알림 확인
받은 알림 클릭시 해당앱으로 이동한다.

 

6. 전체파일(자신의 프로젝트 경로이름을 저거야한다)

MyFirebaseMessagingService파일

package com.example.자신의 프로젝트명;

import android.util.Log;

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


public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(String token) {
        super.onNewToken(token);
        Log.d("FCM", "Refreshed token: " + token);
        // 필요한 경우 여기에서 토큰을 서버에 보내 등록
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        // 메시지 수신 시 로직
        Log.d("FCM", "From: " + remoteMessage.getFrom());

        // 알림 메시지가 있는 경우
        if (remoteMessage.getNotification() != null) {
            Log.d("FCM", "Message Notification Body1: " + remoteMessage.getNotification().getBody());
            String token = FirebaseMessaging.getInstance().getToken().getResult();
            Log.d("FCM", "token: " + token);
        }
    }

}

 

build.gradle.kts(Project)

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    alias(libs.plugins.android.application) apply false
    alias(libs.plugins.google.services) apply false
}

 

build.gradle.kts(app)

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.google.services)
}

android {
    namespace = "com.example.test"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.example.test"
        minSdk = 24
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation(libs.appcompat)
    implementation(libs.material)
    implementation(libs.activity)
    implementation(libs.constraintlayout)
    implementation(platform(libs.firebase))
    implementation("com.google.firebase:firebase-analytics")
    implementation("com.google.firebase:firebase-messaging")


    testImplementation(libs.junit)
    androidTestImplementation(libs.ext.junit)
    androidTestImplementation(libs.espresso.core)
}

 

lbs.versions.toml

[versions]
agp = "8.5.1"
gaoogle = "4.4.2"
junit = "4.13.2"
junitVersion = "1.2.1"
espressoCore = "3.6.1"
appcompat = "1.7.0"
material = "1.12.0"
activity = "1.9.0"
constraintlayout = "2.1.4"
firebase = "33.1.2"

[libraries]
junit = { group = "junit", name = "junit", version.ref = "junit" }
ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
firebase = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase" }



[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
google-services = { id = "com.google.gms.google-services", version.ref = "gaoogle" }

 

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">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Test"
        tools:targetApi="31">
        <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>

 

반응형