PART 2 - ANDROID STUDIO와 FIREBASE 연동

https://todaycode.tistory.com/8

 

[Kotlin] FCM 푸시 알림 구현하기

1. 기본개념  1-1. Firebase  1-2. FCM(Firebase Cloud Messaging)  1-3. Notification과 Data  1-4. 푸시 알림 전송 대상 2. Firebase 연동  2-1. Firebase와 app 연결  2-2. FCM 추가  2-3. 메시지 처리..

todaycode.tistory.com

위의 사이트를 참고하여 제작하였습니다.

 

MyFirebaseMessagingService.kt

package com.example.twitchpush

import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.media.RingtoneManager
import android.os.Build
import android.util.Log
import androidx.core.app.NotificationCompat
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage

class MyFirebaseMessagingService : FirebaseMessagingService(){

    private val TAG = "FirebaseService"

    override fun onNewToken(token: String) {
        val pref = this.getSharedPreferences("token", Context.MODE_PRIVATE)
        val editor = pref.edit()
        editor.putString("token",token).apply()
        editor.commit()
    }

    override fun onMessageReceived(message: RemoteMessage) {
        if(message.data.isNotEmpty()){
            Log.i("바디 : ",message.data["body"].toString())
            Log.i("타이틀 : ",message.data["title"].toString())
            sendNotification(message)
        }
    }
    private fun sendNotification(message: RemoteMessage){
        val unId : Int = (System.currentTimeMillis() / 7).toInt()

        val intent = Intent(this,MainActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        val pendingIntent = PendingIntent.getActivity(this,unId,intent,PendingIntent.FLAG_ONE_SHOT)

        // 체널이름
        val channelId = getString(R.string.firebase_channel_id)

        // 알림 소리
        val soundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

        // ui
        val notificationBuilder = NotificationCompat.Builder(this,channelId)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(message.data["body"].toString())
            .setContentText(message.data["title"].toString())
            .setAutoCancel(true)
            .setSound(soundUri)
            .setContentIntent(pendingIntent)

        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            val channel = NotificationChannel(channelId,"Notice",NotificationManager.IMPORTANCE_DEFAULT)
            notificationManager.createNotificationChannel(channel)
        }

        // 알림 생성
        notificationManager.notify(unId,notificationBuilder.build())
    }
}

MainActivity.kt

package com.example.twitchpush

import android.content.ContentValues.TAG
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatButton
import com.google.firebase.messaging.FirebaseMessaging

class MainActivity : AppCompatActivity() {
    lateinit var wakOnBtn : AppCompatButton
    lateinit var wakOffBtn : AppCompatButton
    lateinit var ineOnBtn : AppCompatButton
    lateinit var ineOffBtn : AppCompatButton
    lateinit var goseguOnBtn : AppCompatButton
    lateinit var goseguOffBtn : AppCompatButton
    lateinit var burgerOnBtn : AppCompatButton
    lateinit var burgerOffBtn : AppCompatButton
    lateinit var cottonOnBtn : AppCompatButton
    lateinit var cottonOffBtn : AppCompatButton
    lateinit var viichanOnBtn : AppCompatButton
    lateinit var viichanOffBtn : AppCompatButton
    lateinit var lilpaOnBtn : AppCompatButton
    lateinit var lilpaOffBtn : AppCompatButton


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        wakOnBtn = findViewById(R.id.wak_on)
        wakOffBtn = findViewById(R.id.wak_off)
        ineOnBtn = findViewById(R.id.ine_on)
        ineOffBtn = findViewById(R.id.ine_off)
        goseguOnBtn = findViewById(R.id.gosegu_on)
        goseguOffBtn = findViewById(R.id.gosegu_off)
        burgerOnBtn = findViewById(R.id.burger_on)
        burgerOffBtn = findViewById(R.id.burger_off)
        cottonOnBtn = findViewById(R.id.cotton_on)
        cottonOffBtn = findViewById(R.id.cotton_off)
        viichanOnBtn = findViewById(R.id.viichan_on)
        viichanOffBtn = findViewById(R.id.viichan_off)
        lilpaOnBtn = findViewById(R.id.lilpa_on)
        lilpaOffBtn = findViewById(R.id.lilpa_off)

        ineOnBtn.setOnClickListener {
            sub("ine")
        }
        ineOffBtn.setOnClickListener {
            unsub("ine")
        }

        goseguOnBtn.setOnClickListener {
            sub("gosegu")
        }
        goseguOnBtn.setOnClickListener {
            unsub("gosegu")
        }

        burgerOnBtn.setOnClickListener {
            sub("burger")
        }
        burgerOffBtn.setOnClickListener {
            unsub("burger")
        }

        cottonOnBtn.setOnClickListener {
            sub("cotton")
        }
        cottonOffBtn.setOnClickListener {
            unsub("cotton")
        }

        viichanOnBtn.setOnClickListener {
            sub("viichan")
        }
        viichanOffBtn.setOnClickListener {
            unsub("viichan")
        }

        lilpaOnBtn.setOnClickListener {
            sub("lilpa")
        }
        lilpaOffBtn.setOnClickListener {
            unsub("lilpa")
        }

        wakOnBtn.setOnClickListener {
            sub("wak")
        }

        wakOffBtn.setOnClickListener {
            unsub("wak")
        }
    }
    fun sub(topic:String){
        FirebaseMessaging.getInstance().subscribeToTopic(topic)
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    // 구독 요청 성공
                    val token = task.getResult()
                    Log.d(TAG, "token : $token")
                    Toast.makeText(this,"알림 설정 완료",Toast.LENGTH_SHORT).show()
                } else {
                    // 구독 요청 실패
                    Toast.makeText(this,"알림 설정 실패",Toast.LENGTH_SHORT).show()
                }
            }
    }
    fun unsub(topic:String){
        FirebaseMessaging.getInstance().unsubscribeFromTopic(topic)
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    // 구독 해제 요청 성공
                    Toast.makeText(this,"알림 해제 성공",Toast.LENGTH_SHORT).show()
                } else {
                    // 구독 해제 요청 실패
                    Toast.makeText(this,"알림 해제 실패",Toast.LENGTH_SHORT).show()
                }
            }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/wak_on"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="우왁굳 알림 설정" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/wak_off"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="우왁굳 알림 취소" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/viichan_on"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="비챤 알림 설정" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/viichan_off"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="비챤 알림 취소" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/ine_on"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="아이네 알림 설정" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/ine_off"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="아이네 알림 취소" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/gosegu_on"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="고세구 알림 설정" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/gosegu_off"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="고세구 알림 취소" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/cotton_on"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="주르르 알림 설정" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/cotton_off"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="주르르 알림 취소" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/burger_on"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="징버거 알림 설정" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/burger_off"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="징버거 알림 취소" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/lilpa_on"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="릴파 알림 설정" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/lilpa_off"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="릴파 알림 취소" />
    </LinearLayout>
</LinearLayout>

결과 화면