Lollipop Benachrichtigung setVisibility () funktioniert nicht?

Ich versuche, eine Demo von setVisibility() zu schreiben, um zu steuern, was auf dem Android 5.0 Lockscreen für eine Notification angezeigt wird. Allerdings scheint es keine Wirkung zu geben:

IOW, alles verhält sich so, als ob VISIBILITY_PUBLIC in Kraft war, zumindest wenn ich auf einem Nexus 7 VISIBILITY_PUBLIC das Android 5.0 Bild, das wir kurz nach Android 5.0 veröffentlicht wurden (Build LPX13D). Also weiß ich nicht, ob das Problem an meinen Code, an dieses Gerät oder an Bugs in Android gebunden ist.

Ich habe zwei Ausgaben der gleichen Beispielanwendung:

  • Man verwendet NotificationCompat und NotificationManagerCompat

  • Die andere nutzt Notification and NotificationManager mit einem minSdkVersion von 21 und einem targetSdkVersion von 21

(Beachten Sie, dass diese Projekte in erster Linie für den Einsatz in Android Studio verwendet werden, Eclipse-Benutzer können die Projekte importieren, aber sie können kleinere Korrekturen erfordern, insbesondere für Verweise auf die support-v13 Bibliothek für das erste Beispiel)

Die Proben verwenden AlarmManager , um die Notification auszulösen, meistens so haben Sie eine Chance, wieder zum Sperrbildschirm zu gelangen, um die Ergebnisse zu sehen. Hier ist der BroadcastReceiver , der von AlarmManager ausgelöst wird (zeigt die NotificationCompat Version):

 /*** 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)); } } 

Die EXTRA_TYPE wird von einem Spinner in der Aktivität gesetzt. Diese Logik scheint OK zu sein, denn das Heads-up- Notification funktioniert ganz gut. Und wenn ich durch den Code onReceive() (zB Breakpoint bei onReceive() ), sehe ich es durch die richtigen Pfade (z. B. das Aufrufen von setVisibility(NotificationCompat.VISIBILITY_SECRET) in notifySecret() wenn ich eine geheime Notification notifySecret() ).

Daher bin ich ein bisschen wie ein Verlust, warum ich nicht die Sichtbarkeitseffekte auf dem Android 5.0 Lockscreen bekomme.

Irgendwelche Vorschläge?

  • Führen Sie Einzel-Test, um Code-Abdeckung Jacoco Android zu überprüfen
  • Guice Performance auf Android
  • Android Google Chrome nicht auslösen nach Lockscreen App
  • Facebook SDK 3.0 Rückruf feuert zweimal
  • Start Aktivität mit einer Animation
  • Setzen Sie verschiedene minSdkVersion für testAndroid als für Hauptapp
  • 3 Solutions collect form web for “Lollipop Benachrichtigung setVisibility () funktioniert nicht?”

    Das Verhalten, das du beschreibst, steht im Einklang mit dem Verhalten, das ich erlebe, wenn ich meine Sperrbildschirm-Benachrichtigung auf "alle Benachrichtigungsinhalte anzeigen" setze.

    Diese Einstellung hat drei Möglichkeiten:

    • Zeigt alle Benachrichtigungsinhalte alle Benachrichtigungen (unabhängig von der Sichtbarkeit) effektiv öffentlich.

    • Vermeiden Sie sensible Benachrichtigung Inhalt respektiert die neuen Sichtbarkeitstypen.

    • Keine Benachrichtigungen anzeigen lassen alle Benachrichtigungen effektiv geheim werden.

    Die Option zum Ändern der Sichtbarkeit der Sperrgitterbenachrichtigung befindet sich in den Geräteeinstellungen unter Sound & Notifications> "Wenn das Gerät gesperrt ist", wie unten gezeigt.

    Wie Selvin in seiner Antwort bemerkt hat , ist die Option, sensible Inhalte zu verbergen, nur verfügbar, wenn Sie irgendeine Art von Gerätesperre (wie zB eine PIN oder Mustersperre) eingestellt haben. Wenn Sie Ihr Gerät mit einem einfachen Swipe der Sperrscheibe entsperren können, ist diese Option nicht verfügbar.

    Zusätzlich zu Tanis.7x's Antwort: Du musst jeden Lockscreen Guard anders als Swipe auswählen, um die Option "sensible Benachrichtigung" ausblenden zu markieren , unter Sound & Notifications

    Einstellung NotificationBuilder#setPriority(Notification.PRIORITY_MIN); Auch verhindert, dass eine Benachrichtigung auf dem Sperrbildschirm angezeigt wird.

    Überraschend, aber zumindest war es gut dokumentiert.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.