Android O(8.0)Notificationが表示しないソリューション
6479 ワード
1、Android O(8.0)通知の変更
NotificationChannelはandroid 8.0新しい機能は、AppのtargetSDKVersion>=26で、channel通知チャネルが設定されていないと、通知が表示されなくなります.
Android Oは、android Oをターゲットとするプラットフォームであれば、ユーザーに通知を表示するために1つ以上の通知チャネルを実現する必要がある統一されたシステムを提供する通知チャネル(Notification Channels)を導入しています.例えば、チャットソフトウェアでは、チャットグループごとに通知チャネルを設定し、特定の音、ライトなどの構成を指定します.
2、Android Channel通知の互換支配
NotificationChannelの作成 NotificationChannelオブジェクトを作成し、Channelのid、name、および通知の重要度 を指定します. NotificationMannagerのcreateNotificationChannelメソッドを使用してChannelを追加します.
3、通知重要度レベルの設定
このレベルは、NotificationChannelのコンストラクション関数で指定する必要があります.合計5つのレベルが必要です.範囲はNotificationManagement.IMPORTANCE_NONE(0) ~ NotificationManager.IMPORTANCE_HIGH(4)は、Android 7.1(API 25)以下のデバイスをサポートする場合は、次のようにNotificationCompatのsetPriorityメソッドを呼び出して設定する必要があります.
Android 8.0以上はNotificationManagerを使用しています.IMPORTANCE_,Android 7.1以下はNotificationCompat.PRIORITY_定義された定数です.次は表の形でもっとよく展示します.
ユーザー通知レベル
Android8.0以上
Android7.0以下
非常レベル(通知音が表示され、プロンプト通知として表示されます)
IMPORTANCE_HIGH
PRIORITY_HIGHまたはPRIORITY_MAX
ハイレベル(通知音が発生し、通知欄に通知がある)
IMPORTANCE_DEFAULT
PRIORITY_DEFAULT
中間レベル(通知音はありませんが、通知欄に通知があります)
IMPORTANCE_LOW
PRIORITY_LOW
低レベル(通知音がなくてもステータスバーに表示されません)
IMPORTANCE_MIN
PRIORITY_MIN
これらの通知レベルは、Channel設定で変更できます.
4、カスタムチャネル通知欄
6、ジャンプ通知設定画面
ユーザーが通知を開いていない場合は、次のコードを使用して通知設定インタフェースにジャンプできます.
NotificationChannelはandroid 8.0新しい機能は、AppのtargetSDKVersion>=26で、channel通知チャネルが設定されていないと、通知が表示されなくなります.
Android Oは、android Oをターゲットとするプラットフォームであれば、ユーザーに通知を表示するために1つ以上の通知チャネルを実現する必要がある統一されたシステムを提供する通知チャネル(Notification Channels)を導入しています.例えば、チャットソフトウェアでは、チャットグループごとに通知チャネルを設定し、特定の音、ライトなどの構成を指定します.
2、Android Channel通知の互換支配
NotificationChannelの作成
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// channel ,
NotificationChannel channel = new NotificationChannel("channel_id", "channel_name",
NotificationManager.IMPORTANCE_DEFAULT);
//
channel.canBypassDnd();
//
channel.enableLights(true);
//
channel.setLockscreenVisibility(VISIBILITY_SECRET);
//
channel.setLightColor(Color.RED);
// launcher
channel.canShowBadge();
//
channel.enableVibration(true);
//
channel.getAudioAttributes();
//
channel.getGroup();
//
channel.setBypassDnd(true);
//
channel.setVibrationPattern(new long[]{100, 100, 200});
//
channel.shouldShowLights();
// channel ,
manager.createNotificationChannel(channel);
}
// : channel_id channel id;
Notification notification = new NotificationCompat.Builder(this, "channel_id")
.setContentTitle("Title").setContentText("This is content").setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_round)).build();
manager.notify(0, notification);
3、通知重要度レベルの設定
このレベルは、NotificationChannelのコンストラクション関数で指定する必要があります.合計5つのレベルが必要です.範囲はNotificationManagement.IMPORTANCE_NONE(0) ~ NotificationManager.IMPORTANCE_HIGH(4)は、Android 7.1(API 25)以下のデバイスをサポートする場合は、次のようにNotificationCompatのsetPriorityメソッドを呼び出して設定する必要があります.
builder.setPriority(NotificationCompat.PRIORITY_DEFAULT);
Android 8.0以上はNotificationManagerを使用しています.IMPORTANCE_,Android 7.1以下はNotificationCompat.PRIORITY_定義された定数です.次は表の形でもっとよく展示します.
ユーザー通知レベル
Android8.0以上
Android7.0以下
非常レベル(通知音が表示され、プロンプト通知として表示されます)
IMPORTANCE_HIGH
PRIORITY_HIGHまたはPRIORITY_MAX
ハイレベル(通知音が発生し、通知欄に通知がある)
IMPORTANCE_DEFAULT
PRIORITY_DEFAULT
中間レベル(通知音はありませんが、通知欄に通知があります)
IMPORTANCE_LOW
PRIORITY_LOW
低レベル(通知音がなくてもステータスバーに表示されません)
IMPORTANCE_MIN
PRIORITY_MIN
これらの通知レベルは、Channel設定で変更できます.
4、カスタムチャネル通知欄
private void sendCustomNotification() {
NotificationCompat.Builder builder = getNotificationBuilder();
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.layout_custom_notifition);
remoteViews.setTextViewText(R.id.notification_title, "custom_title");
remoteViews.setTextViewText(R.id.notification_content, "custom_content");
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, -1,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.turn_next, pendingIntent);
builder.setCustomContentView(remoteViews);
getNotificationManager().notify(3, builder.build());
}
5、判断通知是否开启
Api24以上,NotificationManagerCompat中提供了areNotificationsEnabled()方法。该方法中已经对API19以下,API19-24,API24以上,这三种情况做了判断。直接使用其返回值即可。返回true表示打开了消息通知,如果返回false则没有打开。
private boolean isNotificationEnabled(Context context) {
boolean isOpened = false;
try {
isOpened = NotificationManagerCompat.from(context).areNotificationsEnabled();
} catch (Exception e) {
e.printStackTrace();
}
return isOpened;
}
6、ジャンプ通知設定画面
ユーザーが通知を開いていない場合は、次のコードを使用して通知設定インタフェースにジャンプできます.
private void gotoSet() {
Intent intent = new Intent();
if (Build.VERSION.SDK_INT >= 26) {
// android 8.0
intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
intent.putExtra("android.provider.extra.APP_PACKAGE", getPackageName());
} else if (Build.VERSION.SDK_INT >= 21) {
// android 5.0-7.0
intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
intent.putExtra("app_package", getPackageName());
intent.putExtra("app_uid", getApplicationInfo().uid);
} else {
//
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", getPackageName(), null));
}
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}