setVisibility()
を使用して、Notification
のAndroid 5.0ロック画面)に表示される内容を制御するデモを作成しようとしています。ただし、無効:
デフォルトの_VISIBILITY_PRIVATE
_は、パブリックの対応物ではなく、プライベートのNotification
を表示します。
_VISIBILITY_SECRET
_通知は引き続きロック画面に表示されます
IOW、すべてが_VISIBILITY_PUBLIC
_が有効であるかのように動作します。少なくとも、Android 5.0イメージを実行しているNexus7でテストした場合、Android 5.0がリリースされました(ビルドLPX13D)。したがって、問題が私のコードに関係しているのか、このデバイスに関係しているのか、Androidのバグに関係しているのかわかりません。
同じサンプルアプリケーションの2つのエディションがあります。
OneNotificationCompat
とNotificationManagerCompat
を使用します
その他 はNotification
とNotificationManager
を使用し、minSdkVersion
は21、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'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));
}
}
_
_EXTRA_TYPE
_は、アクティビティのSpinner
から設定されています。ヘッズアップNotification
シナリオは問題なく機能するため、このロジックは問題ないようです。そして、コードをステップスルーすると(たとえば、onReceive()
のブレークポイント)、正しいパスを通過していることがわかります(たとえば、setVisibility(NotificationCompat.VISIBILITY_SECRET)
のnotifySecret()
を呼び出すとシークレットを上げることを選択しますNotification
)。
したがって、Android 5.0ロック画面で可視性の効果が得られない理由について少し戸惑っています。
助言がありますか?
あなたが説明している動作は、ロック画面の通知設定を「すべての通知コンテンツを表示する」に設定したときに発生する動作と一致しています。
この設定には3つのオプションがあります。
すべての通知コンテンツを表示は、(可視性に関係なく)すべての通知を効果的に公開します。
機密性の高い通知コンテンツを非表示にするは、新しい可視性タイプを尊重します。
通知をまったく表示しないは、すべての通知を事実上秘密にします。
ロック画面の通知の表示を変更するオプションは、以下に示すように、[サウンドと通知]> [デバイスがロックされている場合]のデバイス設定にあります。
Selvinが彼の回答で述べた のように、機密コンテンツを非表示にするオプションは、何らかのデバイスロック(PINまたはパターンロック)など)を設定した場合にのみ使用できます。 。ロック画面をスワイプするだけでデバイスのロックを解除できる場合、このオプションは使用できません。
NotificationBuilder#setPriority(Notification.PRIORITY_MIN);
を設定すると、ロック画面に通知が表示されなくなります。
驚くべきことですが、少なくともそれは十分に文書化されていました。