반응형
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>
반응형
'앱 > Android(안드로이드 스튜디오)' 카테고리의 다른 글
Android(안드로이드 스튜디오) 웹뷰 생성 (0) | 2024.07.09 |
---|---|
Android(안드로이드 스튜디오) 배너 광고 달기 (1) | 2024.07.09 |
안드로이드 스튜디오 Running Devices (Device mode)변경 (0) | 2024.03.10 |
Android(안드로이드 스튜디오)AI TensorFlow(머신러닝 학습) (0) | 2021.04.26 |
Android(안드로이드 스튜디오) 랜덤 수를 이용한 홀 짝 (0) | 2021.04.26 |