Подтвердить что ты не робот

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.

У меня есть два экземпляра одного и того же примера приложения:

  • Один использует NotificationCompat и NotificationManagerCompat

  • Другой использует Notification и NotificationManager с minSdkVersion из 21 и a targetSdkVersion из 21

(обратите внимание, что эти проекты предназначены в первую очередь для использования в 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.

Любые предложения?

4b9b3361

Ответ 1

Поведение, которое вы описываете, согласуется с поведением, которое я испытываю, когда я устанавливаю предпочтение уведомления блокировки для "показать все содержимое уведомлений".

Этот параметр имеет три варианта:

  • Показать все содержимое уведомлений делает все уведомления (независимо от видимости) общедоступными.

  • Скрыть конфиденциальный контент уведомлений соответствует новым типам видимости.

  • Не показывать уведомления вообще сделает все уведомления секретными.

Возможность изменить видимость уведомлений с помощью lockscreen заключается в настройках устройства в разделе "Звук и уведомления" > "Когда устройство заблокировано", как показано ниже.

Как Селвин отметил в своем ответе, возможность скрытия конфиденциального контента доступна только в том случае, если вы установили какую-то блокировку устройства (например, блокировку PIN-кода или шаблона). Если вы можете разблокировать устройство с помощью простого прокрутки экрана блокировки, эта опция недоступна.

3J9HE.png

Ответ 2

В дополнение к ответу Tanis.7x: Вы должны выбрать любой защитный экран Lockscreen, отличный от Swipe, чтобы включить "Скрыть чувствительный контент уведомлений" в разделе "Звук и уведомления"

Ответ 3

Настройка NotificationBuilder#setPriority(Notification.PRIORITY_MIN); также запрещает отображение уведомлений на экране блокировки.

Удивительно, но, по крайней мере, это было хорошо документировано.