Я пытаюсь написать демонстрацию использования 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 и atargetSdkVersion
из 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.
Любые предложения?