4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

HMSのプッシュ通知の受信方法とAndroidのプッシュ通知の表示方法の説明

Posted at

HMSのプッシュ通知の種類

HMSのプッシュ通知を送るときに、Notification MessageまたはData Messageを選ぶことができます。
Notification Messageで送る場合、HMS Coreが受信処理をするので、ユーザーが受信処理を実装しなくても大丈夫です。
Data Messageで送る場合、ユーザーは受信処理を実装する必要があります。
そのため、Data Messageのほうが実装の難易度が高いです。

image.jpg

Data Messageの受信処理の実装方法

1. HmsMessageServiceを継承するクラスを作成

YourHmsMessageService.kt
class MainService: HmsMessageService() {
}

マニュフェストにサービスを追加することも忘れずに!

AndroidManifest.xml
<service
      android:name=".YourHmsMessageService"
      android:exported="false">
      <intent-filter>
            <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
      </intent-filter>
</service>

2. onMessageReceivedをオーバーライド

YourHmsMessageService.kt
class MainService: HmsMessageService() {
    override fun onMessageReceived(message: RemoteMessage?) {
        super.onMessageReceived(message)
        message?.let {
            val jsonData = JSONObject(it.data)
            // ここで通知を出す
        }
    }
}

3. messageを解析

次のようなData Messageを送るとします。

image-2.png

これを送ったら、Androidでは次のように受信します。

image-1.png

Data MessageをJSONで処理できます。
残りはデータを通知に出すだけです。

Androidのプッシュ通知の表示方法

HMS端末のOSバージョンは低くてもAndroid 9.0以上なので、通知を出すときに通知チャンネルが必須です。
次はAndroidのプッシュ通知を表示するサンプルです。

YourHmsMessageService.kt
private fun createNotification(context: Context, jsonObject: JSONObject) {
    val notificationManager: NotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager? ?: return

    // 通知クリック後に開くActivityを定義する
    val pendingIntent = PendingIntent.getActivity(
        context,
        jsonObject.optInt("id", 0),
        Intent(context, YourActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
        },
        PENDING_INTENT_FLAG
    )

    // 通知に表示する内容を設定する
    val builder = NotificationCompat.Builder(context, CHANNEL_ID)
        // 通知アイコン
        .setSmallIcon(android.R.mipmap.sym_def_app_icon)
        // 通知タイトル
        .setContentTitle(jsonObject.optString("title"))
        // 通知本文
        .setContentText(jsonObject.optString("message"))
        // 通知の優先度やサウンドを設定するが、Android 8.0以上の場合は通知チャンネルを使うので、Android 7.1までしかこの設定が効かない
        // https://developer.android.com/training/notify-user/channels
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        // 先ほど定義したpendingIntentをセットする
        .setContentIntent(pendingIntent)
        // 通知クリック後に通知を消す
        .setAutoCancel(true)

    // Android 8.0以上の場合、通知チャンネルが必要
    // HMS端末のAndroidバージョンは9.0以上なので、通知チャンネルは必須
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channel = NotificationChannel(
            CHANNEL_ID,
            CHANNEL_NAME,
            NotificationManager.IMPORTANCE_HIGH
        ).apply {
            description = CHANNEL_DESCRIPTION

            // バッジを表示する
            setShowBadge(true)

            // バイブレーションを有効にする
            enableVibration(true)

            // サウンドを有効にし、デフォルトのサウンドをセットする
            setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION), null)

            // ロックスクリーンに通知を表示する
            // VISIBILITY_PRIVATE : Show this notification on all lockscreens, but conceal sensitive or private information on secure lockscreens.
            // VISIBILITY_PUBLIC : Show this notification in its entirety on all lockscreens.
            // VISIBILITY_SECRET : Do not reveal any part of this notification on a secure lockscreen.
            lockscreenVisibility = Notification.VISIBILITY_PUBLIC
        }

        // 通知チャンネルを作る
        notificationManager.createNotificationChannel(channel)
    }

    // 最後は設定した
    notificationManager.notify(jsonObject.optInt(KEY_ID, 0), builder.build())
}

上記のサンプルを動かすと、通知チャンネルが作成され、その通知チャンネルで通知が出されます。

image1.pngimage1.png

通知も表示できます。

image1.png

GitHub

参考

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?