質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

KotlinでType mismatchと表示される

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 616

morizoh

score 16

前提・実現したいこと

Kotlinを使ってFirebaseからFCMで通知を送るアプリをAndroid Studioで作っています。
以下のページを参考にMyFirebaseMessagingServiceクラスを作成したところ
onMessageReceivedメソッドのNotificationCompat.Builder(this, CHANNEL_ID)の部分でType mismatchと表示されました。
型が違うと言われているのは分かるのですがどうすればいいのか分からず詰まってしまいました。
エラーを解消するにはどうすれば良いでしょうか?
https://www.aizulab.com/blog/android-firebase-fcm/

発生している問題・エラーメッセージ

Type mismatch.
Required:
Context
Found:
MyFirebaseMessagingService

該当のソースコード

package com.example.watchdog

import android.app.NotificationChannel
import android.app.NotificationManager
import android.os.Build
import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat.getSystemService
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage

class MyFirebaseMessagingService : FirebaseMessagingService() {

    companion object {

        private const val CHANNEL_ID = "com.aizulab.sample.fcm.MY_CHANNEL"
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage?) {
        remoteMessage?.data?.also { data ->
            val title = data["title"]
            val message = data["message"]

            // Android O(8.0) 以上で通知を表示する場合はチャンネルIDを指定する必要があるので
            // 処理を分けます
            val builder = if (Build.VERSION_CODES.O <= Build.VERSION.SDK_INT) {
                NotificationCompat.Builder(this, CHANNEL_ID) //ここがエラーになる
            }
            else {
                NotificationCompat.Builder(this)  //ここがエラーになる
            }
            val notification = builder
                .setSmallIcon(R.mipmap.ic_launcher)     // アイコンは指定必須です
                .setContentTitle(title)                 // 通知に表示されるタイトルです
                .setContentText(message)                // 通知内容を設定します
                .build()
            // 通知を表示します
            val nm = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
            nm.notify(0, notification)
        }
    }

    override fun onNewToken(instanceToken: String?) {
        // テストで使用するため、ログにトークンを出力します
        Log.i("SampleFCM", "token: $instanceToken")

        // 同時に通知の設定をここでしてしまいます
        val nm = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
        // Android O(8.0) 以上で通知を使用する場合は通知チャンネルを作成する必要があります
        if (Build.VERSION_CODES.O <= Build.VERSION.SDK_INT) {
            var channel = nm.getNotificationChannel(CHANNEL_ID)
            if (channel == null) {
                channel = NotificationChannel(
                    CHANNEL_ID,
                    "プッシュ通知用のチャンネルです",
                    NotificationManager.IMPORTANCE_HIGH)
                nm.createNotificationChannel(channel)
            }
        }
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

build.gradleに記述するライブラリーのバージョンを最新にすること、KotlinソースファイルでSDKの仕様が変わったからかoverrideする関数の型が合わないので3行ほど微修正を加えたこと以外は、参考にしたページ通りの作業でエミュレーターで通知を受け取るところまで動作確認できました。ですから、「確実に作れば動く」ことは間違いないです。

dependencies {

    implementation 'com.google.firebase:firebase-messaging:20.2.1'

}
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        remoteMessage.data.also { data ->

        (中略)


    override fun onNewToken(instanceToken: String) {

        (以下略)

エラーメッセージが出たという具体的な箇所が質問からはよくわからないのですが、「MyFirebaseMessagingService.ktの何行目のどこどこ」とか、そういうレベルで説明できませんか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/04 14:34

    ご丁寧にありがとうございます。情報が足りず申し訳ありません・・
    エラーはMyFirebaseMessagingService.ktの29,32行目のNotificationCompat.Builder(this)で発生しています。

    キャンセル

  • 2020/07/04 15:25

    ご提示いただいたソースファイル通りであればそうはならないと思うのですが・・・。

    class MyFirebaseMessagingService : FirebaseMessagingService() {

    のコロン以降は間違いなく記述されていますか?この記述が抜けていたら、確かに質問通りのエラーになるでしょうが。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る