Как описано в этом ответе , вы можете использовать VISIBILITY_SECRET
, чтобы подавить уведомление на экране блокировки, когда у пользователя есть защищенная блокировка клавиатуры (не просто прокрутка или отсутствие блокировки клавиатуры), и подавление чувствительных уведомлений.
Чтобы охватить остальные случаи, вы можете программно скрыть уведомление с экрана блокировки и строки состояния, установив приоритет уведомления PRIORITY_MIN
всякий раз, когда присутствует блокировка клавиатуры, а затем сброс приоритета всякий раз, когда блокировка клавиатуры отсутствует.
final BroadcastReceiver notificationUpdateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
NotificationManager notificationManager =
(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder builder =
new NotificationCompat.Builder(context);
.setVisibility(NotificationCompat.VISIBILITY_SECRET);
KeyguardManager keyguardManager =
(KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
if (keyguardManager.isKeyguardLocked())
builder.setPriority(NotificationCompat.PRIORITY_MIN);
notificationManager.notify(YOUR_NOTIFICATION_ID, notification);
}
};
//For when the screen might have been locked
context.registerReceiver(notificationUpdateReceiver,
new IntentFilter(Intent.ACTION_SCREEN_OFF));
//Just in case the screen didn't get a chance to finish turning off but still locked
context.registerReceiver(notificationUpdateReceiver,
new IntentFilter(Intent.ACTION_SCREEN_ON));
//For when the user unlocks the device
context.registerReceiver(notificationUpdateReceiver,
new IntentFilter(Intent.ACTION_USER_PRESENT));
//For when the user changes users
context.registerReceiver(notificationUpdateReceiver,
new IntentFilter(Intent.ACTION_USER_BACKGROUND));
context.registerReceiver(notificationUpdateReceiver,
new IntentFilter(Intent.ACTION_USER_FOREGROUND));
Вы можете установить приоритет уведомления на PRIORITY_MIN . Это должно скрыть уведомление на экране блокировки. Он также скрывает значок из строки состояния (не уверен, что вы этого хотите), но само уведомление все еще отображается в области уведомлений.
Кажется, что VISIBILITY_SECRET делает самый чистый подход. В соответствии с документацией:
может быть сделано уведомление VISIBILITY_SECRET, которое будет подавлять его значок и тикер до тех пор, пока пользователь не обойдет блокирующий экран.
blockquote>source (NotificationData в проекте SystemUI AOSP), VISIBILITY_SECRET - единственный способ сделать это:
boolean shouldFilterOut(StatusBarNotification sbn) { if (!(mEnvironment.isDeviceProvisioned() || showNotificationEvenIfUnprovisioned(sbn))) { return true; } if (!mEnvironment.isNotificationForCurrentProfiles(sbn)) { return true; } if (sbn.getNotification().visibility == Notification.VISIBILITY_SECRET && mEnvironment.shouldHideSensitiveContents(sbn.getUserId())) { return true; } return false; }
Единственный другой тип уведомлений, которые, как представляется, отфильтровываются, - это дочерние уведомления в группе, где сводка настоящее. Поэтому, если у вас нет множественного числа с обоснованной причиной резюме, VISIBILITY_SECRET - это лучшее, что можно сделать в настоящее время.
Я создал «LockscreenIntentReceiver» для моего текущего уведомления, которое выглядит так:
private class LockscreenIntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
try {
String action = intent.getAction();
if (action.equals(Intent.ACTION_SCREEN_OFF)) {
Log.d(TAG, "LockscreenIntentReceiver: ACTION_SCREEN_OFF");
disableNotification();
} else if (action.equals(Intent.ACTION_USER_PRESENT)){
Log.d(TAG, "LockscreenIntentReceiver: ACTION_USER_PRESENT");
// NOTE: Swipe unlocks don't have an official Intent/API in android for detection yet,
// and if we set ungoing control without a delay, it will get negated before it's created
// when pressing the lock/unlock button too fast consequently.
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
if (NotificationService.this.isNotificationAllowed()) {
enableNotification((Context)NotificationService.this);
}
}
}, 800);
}
} catch (Exception e) {
Log.e(TAG, "LockscreenIntentReceiver exception: " + e.toString());
}
}
}
Этот код будет в основном удалять текущее уведомление, когда пользователь блокирует телефон (удаление будет видно очень кратко). И как только пользователь разблокирует телефон, текущее уведомление будет восстановлено после времени задержки (здесь 800 мс). enableNotification () - это метод, который создаст уведомление, и вызовет startForeground () . В настоящее время проверено работать на Android 7.1.1.
Вам остается только запомнить для регистрации и amp; соответственно отмените регистрацию получателя.