Lollipop Notification setVisibility() не работает?
Я пытаюсь написать демонстрацию использования setVisibility()
для управления тем, что отображается на заблокированном экране Android 5.0 для Notification
. Однако, похоже, никакого эффекта нет:
-
по умолчанию VISIBILITY_PRIVATE
по-прежнему отображается закрытый Notification
, а не его общедоступный экземпляр
-
VISIBILITY_SECRET
уведомления по-прежнему отображаются на заблокированном экране
IOW, все ведет себя так, как будто VISIBILITY_PUBLIC
вступил в силу, по крайней мере, когда я тестировал Nexus 7 под управлением изображения Android 5.0, которое мы получили вскоре после выхода Android 5.0 (сборка LPX13D). Поэтому я не знаю, связана ли проблема с моим кодом, с этим устройством или с ошибками в Android.
У меня есть два экземпляра одного и того же примера приложения:
(обратите внимание, что эти проекты предназначены в первую очередь для использования в Android Studio, пользователи Eclipse могут импортировать проекты, но могут потребоваться небольшие исправления, особенно для ссылок на библиотеку support-v13
для первого примера)
Образцы используют AlarmManager
для запуска работы Notification
, в основном, чтобы у вас появилась возможность вернуться к экрану блокировки, чтобы увидеть результаты. Вот BroadcastReceiver
, который запускается AlarmManager
(показывая версию NotificationCompat
):
/***
Copyright (c) 2014 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.
From _The Busy Coder Guide to Android Development_
http://commonsware.com/Android
*/
package com.commonsware.android.lollipopnotify;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.provider.Settings;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
public class AlarmReceiver extends BroadcastReceiver {
private static final int NOTIFY_ID=1337;
static final String EXTRA_TYPE="type";
@Override
public void onReceive(Context ctxt, Intent i) {
NotificationManagerCompat mgr=NotificationManagerCompat.from(ctxt);
switch (i.getIntExtra(EXTRA_TYPE, -1)) {
case 0:
notifyPrivate(ctxt, mgr);
break;
case 1:
notifyPublic(ctxt, mgr);
break;
case 2:
notifySecret(ctxt, mgr);
break;
case 3:
notifyHeadsUp(ctxt, mgr);
break;
}
}
private void notifyPrivate(Context ctxt, NotificationManagerCompat mgr) {
Notification pub=buildPublic(ctxt).build();
mgr.notify(NOTIFY_ID, buildNormal(ctxt).setPublicVersion(pub).build());
}
private void notifyPublic(Context ctxt, NotificationManagerCompat mgr) {
mgr.notify(NOTIFY_ID,
buildNormal(ctxt)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.build());
}
private void notifySecret(Context ctxt, NotificationManagerCompat mgr) {
mgr.notify(NOTIFY_ID,
buildNormal(ctxt)
.setVisibility(NotificationCompat.VISIBILITY_SECRET)
.build());
}
private void notifyHeadsUp(Context ctxt, NotificationManagerCompat mgr) {
mgr.notify(NOTIFY_ID,
buildNormal(ctxt)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.build());
}
private NotificationCompat.Builder buildNormal(Context ctxt) {
NotificationCompat.Builder b=new NotificationCompat.Builder(ctxt);
b.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setContentTitle(ctxt.getString(R.string.download_complete))
.setContentText(ctxt.getString(R.string.fun))
.setContentIntent(buildPendingIntent(ctxt, Settings.ACTION_SECURITY_SETTINGS))
.setSmallIcon(android.R.drawable.stat_sys_download_done)
.setTicker(ctxt.getString(R.string.download_complete))
.addAction(android.R.drawable.ic_media_play,
ctxt.getString(R.string.play),
buildPendingIntent(ctxt, Settings.ACTION_SETTINGS));
return(b);
}
private NotificationCompat.Builder buildPublic(Context ctxt) {
NotificationCompat.Builder b=new NotificationCompat.Builder(ctxt);
b.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setContentTitle(ctxt.getString(R.string.public_title))
.setContentText(ctxt.getString(R.string.public_text))
.setContentIntent(buildPendingIntent(ctxt, Settings.ACTION_SECURITY_SETTINGS))
.setSmallIcon(android.R.drawable.stat_sys_download_done)
.addAction(android.R.drawable.ic_media_play,
ctxt.getString(R.string.play),
buildPendingIntent(ctxt, Settings.ACTION_SETTINGS));
return(b);
}
private PendingIntent buildPendingIntent(Context ctxt, String action) {
Intent i=new Intent(action);
return(PendingIntent.getActivity(ctxt, 0, i, 0));
}
}
В операции EXTRA_TYPE
устанавливается значение . Эта логика кажется ОК, потому что сценарий хэдз-ап Notification
работает отлично. И если я пройду через код (например, точку останова в onReceive()
), я вижу, что он проходит через правильные пути (например, вызов setVisibility(NotificationCompat.VISIBILITY_SECRET)
в notifySecret()
, когда я выбираю поднять секрет Notification
).
Следовательно, я немного потерял, почему я не получаю эффекты видимости на заблокированном экране Android 5.0.
Любые предложения?
Ответы
Ответ 1
Поведение, которое вы описываете, согласуется с поведением, которое я испытываю, когда я устанавливаю предпочтение уведомления блокировки для "показать все содержимое уведомлений".
Этот параметр имеет три варианта:
-
Показать все содержимое уведомлений делает все уведомления (независимо от видимости) общедоступными.
-
Скрыть конфиденциальный контент уведомлений соответствует новым типам видимости.
-
Не показывать уведомления вообще сделает все уведомления секретными.
Возможность изменить видимость уведомлений с помощью lockscreen заключается в настройках устройства в разделе "Звук и уведомления" > "Когда устройство заблокировано", как показано ниже.
Как Селвин отметил в своем ответе, возможность скрытия конфиденциального контента доступна только в том случае, если вы установили какую-то блокировку устройства (например, блокировку PIN-кода или шаблона). Если вы можете разблокировать устройство с помощью простого прокрутки экрана блокировки, эта опция недоступна.
![3J9HE.png]()
Ответ 2
В дополнение к ответу Tanis.7x: Вы должны выбрать любой защитный экран Lockscreen, отличный от Swipe, чтобы включить "Скрыть чувствительный контент уведомлений" в разделе "Звук и уведомления"
Ответ 3
Настройка NotificationBuilder#setPriority(Notification.PRIORITY_MIN);
также запрещает отображение уведомлений на экране блокировки.
Удивительно, но, по крайней мере, это было хорошо документировано.