通知タイプのヘッズアップを表示しようとしていますが、できませんでした。私が試したもの
final Notification.Builder notif = new Builder(getApplicationContext())
.setContentTitle(getString(R.string.title))
.setContentText(getString(R.string.text))
// .setTicker(getString(R.string.tick)) removed, seems to not show at all
// .setWhen(System.currentTimeMillis()) removed, match default
// .setContentIntent(contentIntent) removed, I don't neet it
.setColor(Color.parseColor(getString(R.color.yellow))) //ok
.setSmallIcon(R.drawable.ic_small) //ok
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))
// .setCategory(Notification.CATEGORY_CALL) does not seem to make a difference
.setPriority(Notification.PRIORITY_MAX); //does not seem to make a difference
// .setVisibility(Notification.VISIBILITY_PRIVATE); //does not seem to make a difference
mNotificationManager.notify(Constants.NOTIFICATION_ID, notif.build());
通知は、バーにアイコンとしてのみ表示されます。 API 21エミュレーターでAPI 21を使用しています(Lプレビューではありません)。Android:Theme.Holo.NoActionBar
、Android:Theme.Holo.NoActionBar.Fullscreen
およびNotificationCompat.Builder
SDKのサンプルは利用できません。誰もそれを行う方法を知っていますか?
追加することで機能させました:
.setDefaults(Notification.DEFAULT_VIBRATE)
これが最善の方法ですか?
Notifications によると、バイブレーションまたは着信音を設定して、Heads-upを機能させる必要があります。ただし、ヘッドアップ通知を生成するためにVIBRATE許可を必要としない簡単なハックがあります。
notificationBuilder.setPriority(Notification.PRIORITY_HIGH);
if (Build.VERSION.SDK_INT >= 21) notificationBuilder.setVibrate(new long[0]);
編集:
ヘッズアップ通知を乱用しないでください。ヘッドアップ通知を使用するタイミングについては、 here を参照してください。
MAX:タイムクリティカルな状態または特定のタスクを続行する前に解決する必要がある状態をユーザーに警告する、クリティカルおよび緊急の通知用。
HIGH:主に、ユーザーにとって特に興味深いコンテンツを含むメッセージやチャットイベントなどの重要なコミュニケーション用。優先度の高い通知は、ヘッドアップ通知表示をトリガーします。
Googleによると: https://developer.Android.com/design/patterns/notifications.html
通知の優先度に「高」、「最大」、または「フルスクリーン」のフラグが付けられている場合、通知が通知されます。
したがって、次のコードはヘッドアップ通知を生成する必要があります。
.setPriority(Notification.PRIORITY_MAX)
十分なはずです。しかし、明らかに.setDefaults(Notification.DEFAULT_VIBRATE)も設定する必要があります。 GoogleがAndroid 5.0の最終リリースでこれを修正することを願っています。
バグか機能かわからない...
すべてのアプリに通知が表示されません。たとえば、Android 5.1.1のNexus 6がありますが、Android 5.0、私は設定する必要がありました:
.setPriority(Notification.PRIORITY_HIGH)
通知の優先順位を正しく設定および管理する
Androidは通知用の優先フラグをサポートしています。このフラグを使用すると、通知が表示される場所を他の通知と比較して調整でき、ユーザーが常に最も重要な通知を最初に表示するようにします。通知を投稿するときに、次の優先度レベルから選択できます。
[〜#〜] max [〜#〜]特定のタスクを続行する前に、タイムクリティカルな状態または解決する必要がある状態をユーザーに警告するクリティカルおよび緊急の通知に使用します。
[〜#〜] high [〜#〜]主に、ユーザーにとって特に興味深いコンテンツを含むメッセージやチャットイベントなどの重要なコミュニケーションに使用します。優先度の高い通知は、ヘッドアップ通知表示をトリガーします。
[〜#〜] default [〜#〜]ここで説明する他の優先度のいずれにも該当しないすべての通知に使用し、アプリケーションが独自の通知に優先順位を付けない場合
[〜#〜] low [〜#〜]ユーザーに通知するが、それほど緊急ではない通知に使用します。優先度の低い通知はリストの一番下に表示される傾向があり、パブリックまたは無向のソーシャルアップデートなどに適しています。ユーザーは通知を求められていますが、これらの通知は緊急または直接通信。
[〜#〜] min [〜#〜]気象情報やコンテキスト位置情報などのコンテキスト情報または背景情報に使用します。最小優先度の通知はステータスバーに表示されません。ユーザーは、通知シェードを展開するとそれらを発見します。
priority を設定するには、 setPriority 関数を使用します(API 16で導入)とともに setDefaults (API 11に追加)の Notification Builder 。アプリの要件に応じて、優先度 [〜#〜] default [〜#〜] 、HIGH、LOW、MAX、MINを選択します。デフォルトも選択できます here 。
小さなスニペット:
notification = NotificationBuilder(service)
notification.setPriority(Notification.PRIORITY_MAX)
notification.setDefaults(Notification.DEFAULT_ALL)
優先度を高く設定し、着信音またはバイブレーションを使用する必要があります。
notificationBuilder.setDefaults(Notification.DEFAULT_ALL);
notificationBuilder.setPriority(Notification.PRIORITY_HIGH);
参照: https://developer.Android.com/guide/topics/ui/notifiers/notifications.html#Heads-up
ヘッドアップ通知
Android 5.0(APIレベル21)を使用すると、デバイスがアクティブなとき(つまり、デバイスがロック解除され、これらの通知は、ヘッドアップ通知にもアクションボタンが表示されることを除いて、通知のコンパクトなフォームと同様に表示されます。
ヘッズアップ通知をトリガーする可能性のある条件の例は次のとおりです。
- ユーザーのアクティビティがフルスクリーンモードになっている(アプリがfullScreenIntentを使用している)、または
- 通知には高優先度があり、着信音または振動を使用します
Android 8.0(APIレベル26)以降を実行しているデバイスの場合、通知チャネルには高い重要性が必要です
new NotificationChannel("ID", "Channel Name", NotificationManager.IMPORTANCE_HIGH);
コードにこの行を追加して、ヘッドアップ通知を表示します。Lollipopバージョンでのみ機能します
notificationBuilder.setPriority(Notification.PRIORITY_HIGH);
バイブレーションを設定する必要はありません。あなただけの音を設定する必要があります。邪魔になりません。音が出ませんが、通知が上に表示されます。 PRIORITY_HIGHとDEFAULT_SOUNDを使用してください。
NotificationChannel channel = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
channel = new NotificationChannel("my_channel_01",
"Channel human readable title",
NotificationManager.IMPORTANCE_HIGH);
mNotificationManager.createNotificationChannel(channel);
}
Notification notification =
new NotificationCompat.Builder(this, "notify_001")
.setSmallIcon(R.drawable.ic_check)
.setContentTitle("My notification")
.setContentText("Hello World!")
.setPriority(Notification.PRIORITY_HIGH)
.setDefaults(NotificationCompat.DEFAULT_SOUND)
.setChannelId("my_channel_01").build();
mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, notification);