web-dev-qa-db-ja.com

Firebaseクラウドメッセージング通知がデバイスによって受信されていません

FireBase Cloud Messagingで、デバイスからトークンを取得してGoogle Firebase通知コンソールを介して通知テストを送信するという問題があります。ただし、通知がログに記録されたり、Android仮想デバイスにプッシュされたりすることはありません。 FCMのドキュメントはほぼ正確に私が以下に持っているコードであり、firebaseでプッシュ通知を動作させるためにあなたがしなければならない他のことの方法の他にはほとんどありません。ドキュメントで指定されているセットアップ情報(build.gradleの追加、Google Playサービスのインストールなど)をすべて確認しましたが、それでもメッセージが生成されません。 「I/FA:タグマネージャが見つからないため使用されません」という通知をプッシュした直後に1回限りのエラーが表示されますが、それが出力される唯一のデータであり、タグに関連するものは見つかりませんグーグルに関する管理者の要求とFCM logcatまたはデバイスへのプッシュ通知を受信して​​いないというコードの何が問題になっていますか?役立つと思われるその他の情報があれば教えてください。ありがとう。

NotificationGenie.Java

public class NotificationGenie extends FirebaseMessagingService {

private static final String TAG = "Firebase_MSG";

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // If the application is in the foreground handle both data and notification messages here.
    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
    sendNotification(remoteMessage.getNotification().getBody());
    Log.d(TAG, "From: " + remoteMessage.getFrom());
    Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());
}

private void sendNotification(String messageBody) {
    Intent intent = new Intent(this, PostLoginActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.tf2spyprofile)
            .setContentTitle("FCM Message")
            .setContentText(messageBody)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

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

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}

}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="org.test.movile_Android">

<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
<uses-permission Android:name="Android.permission.READ_PROFILE" />
<uses-permission Android:name="Android.permission.READ_CONTACTS" />
<uses-permission Android:name="Android.permission.INTERNET" />

<application
    Android:allowBackup="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme">
    <activity
        Android:name=".LoginActivity"
        Android:label="@string/title_activity_login">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        Android:name=".DashBoardActivity"
        Android:label="@string/title_activity_dash_board"
        Android:theme="@style/AppTheme.NoActionBar">
    </activity>

    <activity
        Android:name=".NewOrderActivity"
        Android:label="@string/title_activity_dash_board"
        Android:theme="@style/AppTheme.NoActionBar">
    </activity>

    <activity
        Android:name=".PostLoginActivity"
        Android:label="@string/title_activity_dash_board"
        Android:theme="@style/AppTheme.NoActionBar">
    </activity>
</application>

<service
    Android:name=".NotificationGenie">
    <intent-filter>
        <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>
52
xec86

サービスをアプリケーションタグの外側に配置しました。これを下に変更します。

<service
    Android:name=".NotificationGenie">
    <intent-filter>
        <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

</application>
50
Tristan Richard

私は同じ問題を抱えていました、そしてそれは私のサービスでtrueにエクスポートされたenabledを定義することによって解決されます

  <service
            Android:name=".MyFirebaseMessagingService"
            Android:enabled="true"
            Android:exported="true">
            <intent-filter>
                <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
35
Hoby

"Firebase Consoleから送信されたメッセージを受信するには、Appはバックグラウンドで実行されている必要があります。隠されていたり開始されたりしてはいけません。 --- @Laurent Russierのコメントによると。

アプリをバックグラウンドで実行するまで、Firebaseからメッセージを受け取ることはありませんでした。

これは、あなたが同様にフォアグラウンドで通知を受けるエミュレータのためのUSB接続にだけ当てはまります

27
Html Tosin

Overriddenメソッドでsuper.OnMessageReceived()を呼び出します。これは私のために働いた!最後に!

10
Nikhil Setty

Firebaseクラウドメッセージングがデバイスによって受信されないという同じ問題に直面しました。

私の場合、Firebase Console Projectで定義されたパッケージ名は、私のAndroidプロジェクトのManifest&Gradleで定義されたものとは異なりました。

その結果、トークンを正しく受信しましたが、メッセージはまったく送信されませんでした。

要約すると、Firebase Consoleのパッケージ名とManifest&Gradleが一致している必要があります。

Firebase Consoleから送信されたメッセージを受信するには、Appがバックグラウンドで実行されている必要があります。

7
Juan Pablo

私は同様の問題を抱えていました、しかし私の場合私はGradleビルドから google-servicesプラグイン を見逃していました(私は既存のプロジェクトにFirebaseを追加していました)。

私は私のルートbuild.gradleに以下を追加しました:

classpath 'com.google.gms:google-services:3.1.0'

そして私のapp-レベルbuild.gradleの最後まで:

apply plugin: 'com.google.gms.google-services'

それから私はFirebase Consoleからgoogle-services.jsonファイルをダウンロードし(最初は既存のGoogle Cloudプロジェクトをインポートしていました)、それを私のappディレクトリにコピーしなければなりませんでした。

7
tx802

私は同じ問題に直面しました、しかし、私はまだ古いGCMから私の積荷にいくらかの残骸を持っていました。私がマニフェストから以下の許可を取ったとき、それは誤りを直しました。 com.google.Android.c2dm.permission.RECEIVE

5
RSSV

既存のアプリにFCMを追加したばかりの場合、onTokenRefresh()は呼び出されません。アプリをアンインストールして再度インストールすることで実行できるようになりました。

4
Tash Pemhiwa

マニフェストコードの下に従う必要があります(マニフェストにサービスが必要です)。

 <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
        package="soapusingretrofitvolley.firebase">
        <uses-permission Android:name="Android.permission.INTERNET"/>
        <application
            Android:allowBackup="true"
            Android:icon="@mipmap/ic_launcher"
            Android:label="@string/app_name"
            Android:supportsRtl="true"
            Android:theme="@style/AppTheme">
            <activity Android:name=".MainActivity">
                <intent-filter>
                    <action Android:name="Android.intent.action.MAIN" />

                    <category Android:name="Android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

            <service
                Android:name=".MyFirebaseMessagingService">
                <intent-filter>
                    <action Android:name="com.google.firebase.MESSAGING_EVENT"/>
                </intent-filter>
            </service>

            <service
                Android:name=".MyFirebaseInstanceIDService">
                <intent-filter>
                    <action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
                </intent-filter>
            </service>
        </application>

    </manifest>
2
Nilesh Panchal

私の場合、mergedmanifestに受信者がいないことに気付きました。だから私は含める必要がありました:

 <receiver
            Android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
            Android:exported="true"
            Android:permission="com.google.Android.c2dm.permission.SEND" >
            <intent-filter>
                <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
            </intent-filter>
 </receiver>
1
Irshu
    <activity Android:name=".activity.MainActivity">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <!-- Firebase Notifications -->
    <service Android:name=".service.MyFirebaseMessagingService">
        <intent-filter>
            <action Android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <service Android:name=".service.MyFirebaseInstanceIDService">
        <intent-filter>
            <action Android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>
1
ashutosh

デバイストークンをコピーすると、スペースがコピーされる可能性があります。正しいトークンをコピーしたことを再確認してください。

0
Sam

あなたもあなたのアプリが24以上のバージョンで動くことを望むかのように、これらに従ってください:

1. strings.xmlに追加してください

<string name = "default_notification_channel_id" translatable = "false"> fcm_default_channel

  1. マニフェストファイルにこのメタデータを追加します。

<meta-data Android:name = "com.google.firebase.messaging.default_notification_channel_id" Android:value = "@ string/default_notification_channel_id" />

3.(画像付きの)通知を作成するには、firebasemessagingサービスに直接追加する場合、または何らかのutilクラスを使用している場合はそのutilクラスに追加する場合に、通知を処理する場所でこのメソッドを使用します。

   @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    public static void createBigNotification(Bitmap bitmap, int icon, String message, Uri alarmSound) {
        final int NOTIFY_ID = 0; // ID of notification
        NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(NOTIFICATION_SERVICE);
        String id = mContext.getString(R.string.default_notification_channel_id); // default_channel_id
        String title = mContext.getString(R.string.app_name);
        Intent intent;
        NotificationCompat.Builder builder;
        if (notificationManager == null) {
            notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
        }
        PendingIntent resultPendingIntent;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel mChannel = notificationManager.getNotificationChannel(id);
            if (mChannel == null) {
                mChannel = new NotificationChannel(id, title, importance);
                mChannel.enableVibration(true);
                mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
                notificationManager.createNotificationChannel(mChannel);
            }
            builder = new NotificationCompat.Builder(mContext, id);
            intent = new Intent(mContext, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            resultPendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
            NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
            bigPictureStyle.setBigContentTitle(title);
            bigPictureStyle.setSummaryText(Html.fromHtml(message).toString());
            bigPictureStyle.bigPicture(bitmap);

            builder.setContentTitle(title)        // required
                    .setSmallIcon(R.drawable.app_icon)   // required
                    .setContentText(message) // required
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setAutoCancel(true)
                    .setSound(alarmSound)
                    .setStyle(bigPictureStyle)
                    .setContentIntent(resultPendingIntent)
                    .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), icon))
                    .setTicker(title)
                    .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
        } else {
            builder = new NotificationCompat.Builder(mContext, id);
            intent = new Intent(mContext, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            resultPendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
            NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
            bigPictureStyle.setBigContentTitle(title);
            bigPictureStyle.setSummaryText(Html.fromHtml(message).toString());
            bigPictureStyle.bigPicture(bitmap);

            builder.setContentTitle(title)     // required
                    .setSmallIcon(R.drawable.app_icon)   // required
                    .setContentText(message) // required
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setAutoCancel(true)
                    .setSound(alarmSound)
                    .setStyle(bigPictureStyle)
                    .setContentIntent(resultPendingIntent)
                    .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), icon))
                    .setTicker(title)
                    .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
                    .setPriority(Notification.PRIORITY_HIGH);
        }
        Notification notification = builder.build();
        notificationManager.notify(NOTIFY_ID, notification);
    }

次の手順に従うと、通知が通知トレイに届きます。

0
amit pandya
private void sendNotification(String message) {
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    int requestCode = 0;
    PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode, intent, PendingIntent.FLAG_ONE_SHOT);
    Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.URI_COLUMN_INDEX);
    NotificationCompat.Builder noBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentText(message)
            .setColor(getResources().getColor(R.color.colorPrimaryDark))
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("FCM Message")
            .setContentText("hello").setLargeIcon(((BitmapDrawable) getResources().getDrawable(R.drawable.dog)).getBitmap())
            .setStyle(new NotificationCompat.BigPictureStyle()
                    .bigPicture(((BitmapDrawable) getResources().getDrawable(R.drawable.dog)).getBitmap()))
            .setAutoCancel(true)
            .setSound(sound)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(0, noBuilder.build());
0
Neha Sharma

私はメッセージを受け取らないという私の問題を解決することができずにチュートリアルビデオと同様にこの全体の記事と他の人を通して働いていました、しかし登録トークンはうまくいきました。

それまでは、エミュレータでアプリをテストしていただけでした。実際の電話で試した後、プロジェクトに何ら変更を加えることなく即座に動作しました。

0
Jens