Android通知が表示されない


115

Androidで通知を追加するプログラムが必要です。そして、誰かが通知をクリックすると、2番目のアクティビティに誘導されます。

コードを確立しました。通知は機能しているはずですが、何らかの理由で機能していません。Notificationまったく表示されていません。何が欠けているのかわかりません。

それらのファイルのコード:

Notification n = new Notification.Builder(this)
        .setContentTitle("New mail from " + "test@gmail.com")
        .setContentText("Subject")
        .setContentIntent(pIntent).setAutoCancel(true)
        .setStyle(new Notification.BigTextStyle().bigText(longText))
        .build();

NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Hide the notification after it's selected

notificationManager.notify(0, n);

質問するときは、もっと簡潔になるようにしてください。が機能してないのを説明できません。実際、機能していないことについては言及していません。Activity発売されていませんか?Notification表示されていませんか?
slinden77 2013

3
@dmmh私は私の質問で私の問題は何だと言った!そして、私は質問に何も問題を見つけませんでした。私の質問は問題について具体的でした。あなたが専門家でない場合、突く必要はありません!そしてtato469の答えは大丈夫でした。
Choudhury AM 2013

3
このサイトの目的は、問題を解決するためではなく、他の人が問題の解決策を見つけることができるようにすることです。私は突っついていません。私はあなたの気持ちを傷つけて申し訳ありませんが、事実はあなたの質問が間違っていた、答えが間違っていた、そしてこのすべての誤解を招く情報はあなたが説明するのと同じ問題を抱えている他の初心者プログラマーを導き、うまくいかない解決策を試すことに頼っているあなたが提供したコードに基づいて。私が専門家であるかどうかは関係ありません。特に私が正しいからではなく、あなたの質問は曖昧で、他の答えは間違っています。
slinden77 2013年

誤解を招くので、この質問と回答を削除するように依頼します。良い一日を過ごしてください。
slinden77 2013年

1
問題が何であるかを人々が理解できるように質問を変更しました。
Choudhury AM 2013

回答:


412

コードはアイコンなしでは機能しません。したがって、次のsetSmallIconようにビルダーチェーンの呼び出しを追加して、機能させます。

.setSmallIcon(R.drawable.icon)

Android Oreo(8.0)以降

Android 8では、channelIdを使用してプロパティを設定するという新しい要件が導入されましたNotificationChannel

private NotificationManager mNotificationManager;

NotificationCompat.Builder mBuilder =
    new NotificationCompat.Builder(mContext.getApplicationContext(), "notify_001");
Intent ii = new Intent(mContext.getApplicationContext(), RootActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, ii, 0);

NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle();
bigText.bigText(verseurl);
bigText.setBigContentTitle("Today's Bible Verse");
bigText.setSummaryText("Text in detail");

mBuilder.setContentIntent(pendingIntent);
mBuilder.setSmallIcon(R.mipmap.ic_launcher_round);
mBuilder.setContentTitle("Your Title");
mBuilder.setContentText("Your text");
mBuilder.setPriority(Notification.PRIORITY_MAX);
mBuilder.setStyle(bigText);

mNotificationManager =
    (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

// === Removed some obsoletes
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
    String channelId = "Your_channel_id";
    NotificationChannel channel = new NotificationChannel(
                                        channelId,
                                        "Channel human readable title",
                                        NotificationManager.IMPORTANCE_HIGH);
   mNotificationManager.createNotificationChannel(channel);
  mBuilder.setChannelId(channelId);
}

mNotificationManager.notify(0, mBuilder.build());

CHANNEL_IDを取得するには?助けてください
アナンタプラサード

@LAnantaPrasad CHANNEL_IDは、ユーザーの識別子となることを目的としています。チャットの会話やグループチャットなど、通知をグループ化するものです。
Casey Daniel

ありがとう、setChannelId必要です。追加する前に、SONYデバイスには通知が表示されますが、SAMSUNGデバイスには表示されません。
Wesely


2
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }このチェックがないと、デバイスのAPIが26以上の場合でも通知が表示されないため、チェックも含めます。
Koushik Shom Choudhury

57

実際、フェルナンドヴァッレの答えは正しくないようです。繰り返しになりますが、何が問題なのか、何が機能していないのかを説明できないため、質問はあいまいです。

あなたのコードを見て、私はNotification単に表示されていないと仮定しています。

アイコンを提供しなかったため、通知は表示されません。SDKのドキュメントには、その必要性については記載されていませんが、実際には非常に重要であり、それがNotificationないと表示されません。

addAction4.1以降でのみ使用できます。その前に、を使用してPendingIntentを起動しActivityます。を指定しているように見えるPendingIntentため、問題は別の場所にあります。論理的には、それが欠落しているアイコンであると結論付ける必要があります。


その問題を見つけました。しかし、適切な返事をありがとう。本当にありがとうございました。
Choudhury AM

1
addActionは4.1以降でしか使用できないとおっしゃっていましたが、間違っています。2.3で使用しました。リファレンスマニュアルでは、通知ではなくボタンについて説明しています。「Android 4.1より前のプラットフォームでは、アクションボタンは表示されません。」あなたはここで確認できます。AddActionは android.support.v4.appに含まれている
ƒernandoヴァッレ

1
OPはNotification.BuilderNotificationCompat.Builder提案されているように、ではなくを使用しています。互換性ライブラリがあり、それを使用できるからといって、通常のAPIで関数を使用できるわけではありません。あなたが提供するリンクは実際にこれを規定しています。Notification.Builder例が示すように、この質問は明らかにに関連しています。そして互換性ライブラリはおそらく4.1が利用可能になった後にのみこの関数を含みました。あなたの答えは誤解を招くものです。なぜなら、2.3から利用可能になっていることを示唆しているからです。
slinden77 2013年

私はmisspoke場合は申し訳ありませんが、私はそれが2.3で可能であることを意味
ƒernandoヴァッレ

4
あのアイコン!! それが欠けていることにさえ気づかなかったが、それを追加することで問題が修正された。コンソールにアイコンが表示されていないために便利なものは何も表示されず、警告なしに失敗するようです。
ピート

33

小さなアイコンがありませんでした。私は同じ間違いをしました、そして、上記のステップはそれを解決しました。

公式ドキュメントによると:通知オブジェクトには次のものが含まれている必要があります。

  1. setSmallIcon()で設定される小さなアイコン

  2. タイトル、setContentTitle()で設定

  3. 詳細テキスト、setContentText()で設定

  4. Android 8.0(APIレベル26)以降では、setChannelId()によって設定されるか、チャネルの作成時にNotificationCompat.Builderコンストラクターで提供される有効な通知チャネルID 。

http://developer.android.com/guide/topics/ui/notifiers/notifications.htmlを参照してください


3
本当じゃない。setContentを使用してカスタム通知レイアウトを使用する場合、タイトルやテキストは必要ありません。
Ray Li

11

これは、今日の私を倒してしまったが、私は上ので、それは気づいたアンドロイド9.0(パイ)、サイレント、デフォルトではまた、ちょうどのようにそれらをサイレンシングするのではなく、すべての通知を非表示になりますアンドロイド8.1の前に(オレオ)と。これは通知には適用されません。

開発デバイスでDNDをオンにするのが好きなので、DND設定に移動して設定を変更し、通知を単に非表示にする(ただし非表示にしない)ように修正しました。


9

Android 8.1(Oreo)以降のAndroidバージョンでは、通知を表示するために通知チャネルの作成が必須です。Oreo + Androidのアプリで通知が表示されない場合は、アプリの起動時に次の関数を呼び出す必要があります-

private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name,
       importance);
        channel.setDescription(description);
        // Register the channel with the system; you can't change the importance
        // or other notification behaviours after this
        NotificationManager notificationManager =
        getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
   }
}

1

あなたは忘れていると思います

addAction(int icon, CharSequence title, PendingIntent intent)

ここを見てください:アクションの追加


1
メソッドaddAction()はで使用できませんNotification.Builder
slinden77 2013年

1
存在しますが、非推奨です。代わりに、でAction作成できるインスタンスを渡すことができますNotification.Action.Builder。PS、必ず使用compatの代替(すなわち、NotificationCompat)、Googleがバグにパッチを適用し、それらとのより良い互換性を提供する傾向があるので、
グーカン・バリスアーカー

アクションを指定したくない場合.setContentIntent(null)は、ビルダーで使用してください。
グーカンバリスアーカー

1

Androidアプリでも同じ問題が発生しました。通知を試してみたところ、Android 7.0(Nougat)システムを実行しているAndroidエミュレーターで通知が表示されていましたが、Android 8.1(Oreo)を搭載している私の電話では通知が実行されていませんでした。

ドキュメントを読んだ後、Androidには通知チャネルと呼ばれる機能があり、それがないと通知はOreoデバイスに表示されません。以下は、通知チャネルに関する公式のAndroidドキュメントへのリンクです。


1

私にとってはの問題でしたdeviceToken。受信者と送信者のデバイストークンがデータベースで適切に更新されているかどうか、または通知を送信するためにトークンにアクセスしている場所を確認してください。

たとえば、次のコードを使用して、アプリの起動時にデバイストークンを更新します。したがって、常に適切に更新されます。

// Device token for push notifications
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
  new OnSuccessListener<InstanceIdResult>() {

    @Override
    public void onSuccess(InstanceIdResult instanceIdResult) {

        deviceToken = instanceIdResult.getToken();

        // Insert device token into Firebase database
        fbDbRefRoot.child("user_detail_profile").child(currentUserId).child("device_token")).setValue(deviceToken)
                .addOnSuccessListener(
                  new OnSuccessListener<Void>() {

                    @Override
                    public void onSuccess(Void aVoid) {

                    }
                });
    }
});

これdeviceTokenはどこで宣言されていますか?
Peter Mortensen

なぜonSuccess空ですか?
Peter Mortensen

@PeterMortensen ..成功すると、新しいインテントを開始する、トーストを与える、同じページに留まるなど、ロジックで許可されていることをすべて実行できます。deviceToken宣言については、ページのonCreateの前にそれをPrivate String deviceTokenとして宣言できます
DragonFire

(私自身のコメントをより明確にするために:2つonSuccessのs があります-私は(空の)内部の1つを参照していました)
Peter Mortensen

1

また、build.gradleファイルを変更し、使用するAndroid SDKバージョンをそのファイルに追加する必要があります。

implementation 'com.android.support:appcompat-v7:28.0.0'

私の場合、これは魅力のように機能しました。


0

通知を次々にすばやく表示したり、既存の通知をキャンセルしたりして、すぐに再度表示したりすると、通知が表示されない場合があります(たとえば、進行中の通知の変更についてヘッドアップ通知をトリガーしてユーザーに通知するため)。これらの場合、システム、ユーザーにとって圧倒的またはスパム的になりすぎる可能性があると感じたときに、通知をブロックすることを決定する場合があります。

少なくとも標準のAndroid(10でテスト済み)の外側から見ると、この動作は少しランダムに見えることに注意してください。私の推測では、非常に短い時間のしきい値があり、その間、あまり多くの通知を送信できません。を呼び出すNotificationManager.cancel()と、NotificationManager.notify()この動作が発生する場合があります。

オプションがある場合は、通知を更新するときにそれをキャンセルしないでくださいNotificationManager.notify()。更新された通知で呼び出してください。これは、システムによる前述のブロッキングを引き起こさないようです。


-1

通知チャネルの使用中にバージョン8.1以上のAndroid 8.1(Oreo)を使用している場合は、重要度を高く設定します。

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);

1
「1つのバージョン> =」とはどういう意味ですか?「バージョン8.1(またはそれ以上)」という意味ですか?ここではコメント(適切なものではありません)ではなく、回答を編集して返信してください。
Peter Mortensen

@PeterMortensenは、私を正してくれてありがとうのタイプでした
Faisal Naseer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.