android - samsung - ¿La configuración de la notificación de Lollipop() no funciona?
interrupciones de prioridad android (3)
Estoy tratando de escribir una demostración del uso de setVisibility()
para controlar lo que aparece en la pantalla de bloqueo de Android 5.0 para una Notification
. Sin embargo, no parece haber ningún efecto:
El
VISIBILITY_PRIVATE
predeterminado todavía muestra laNotification
privada, no su contraparte públicaVISIBILITY_SECRET
notificaciones deVISIBILITY_SECRET
siguen apareciendo en la pantalla de bloqueo
IOW, todo se comporta como si VISIBILITY_PUBLIC
estuviera vigente, al menos cuando probé en un Nexus 7 con la imagen de Android 5.0 que recibimos poco después del lanzamiento de Android 5.0 (versión LPX13D). Así que no sé si el problema está relacionado con mi código, con este dispositivo o con errores en Android.
Tengo dos ediciones de la misma aplicación de muestra:
One utiliza
NotificationCompat
yNotificationManagerCompat
El otro usa
Notification
yNotificationManager
con unaminSdkVersion
de 21 y untargetSdkVersion
de 21
(tenga en cuenta que estos proyectos son principalmente para uso dentro de Android Studio; los usuarios de Eclipse pueden importar los proyectos pero pueden requerir correcciones menores, en particular para las referencias a la biblioteca support-v13
para la primera muestra)
Las muestras utilizan AlarmManager
para activar el trabajo de Notification
, principalmente para que tenga la oportunidad de volver a la pantalla de bloqueo para ver los resultados. Aquí está el BroadcastReceiver
que es activado por AlarmManager
(mostrando la versión de 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''s 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));
}
}
El EXTRA_TYPE
se está configurando desde un Spinner
en la actividad. Esa lógica parece estar bien, porque el escenario de Notification
heads-up funciona bien. Y si paso por el código (por ejemplo, punto de interrupción en onReceive()
), lo veo en las rutas correctas (por ejemplo, llamando a setVisibility(NotificationCompat.VISIBILITY_SECRET)
en notifySecret()
cuando elijo elevar una Notification
secreta).
Por lo tanto, no entiendo por qué no obtengo los efectos de visibilidad en la pantalla de bloqueo de Android 5.0.
¿Alguna sugerencia?
Además de la respuesta de Tanis.7x: tiene que elegir cualquier protector de la pantalla de bloqueo que no sea Deslizar para "Ocultar contenido de notificación sensible" en la sección Sonidos y notificaciones
Configurando NotificationBuilder#setPriority(Notification.PRIORITY_MIN);
también evita que se muestre una notificación en la pantalla de bloqueo.
Sorprendente, pero al menos estaba bien documentado.
El comportamiento que está describiendo es consistente con el comportamiento que experimento cuando configuro mi preferencia de notificación de bloqueo de pantalla para "mostrar todo el contenido de las notificaciones".
Esta configuración tiene tres opciones:
Mostrar todo el contenido de las notificaciones hace que todas las notificaciones (independientemente de la visibilidad) sean públicas.
Ocultar contenido de notificación sensible respeta los nuevos tipos de visibilidad.
No mostrar notificaciones en absoluto hará que todas las notificaciones sean efectivamente secretas.
La opción para cambiar la visibilidad de la notificación de la pantalla de bloqueo se encuentra en la configuración del dispositivo en Sonido y notificaciones> "Cuando el dispositivo está bloqueado", como se muestra a continuación.
Como Selvin señaló en su respuesta , la opción de ocultar contenido confidencial solo está disponible si ha configurado algún tipo de bloqueo de dispositivo (como un PIN o un patrón de bloqueo). Si puede desbloquear su dispositivo con solo deslizar la pantalla de bloqueo, esta opción no estará disponible.