web-dev-qa-db-ja.com

ロリポップ通知setVisibility()が機能しませんか?

setVisibility()を使用して、NotificationのAndroid 5.0ロック画面)に表示される内容を制御するデモを作成しようとしています。ただし、無効:

  • デフォルトの_VISIBILITY_PRIVATE_は、パブリックの対応物ではなく、プライベートのNotificationを表示します。

  • _VISIBILITY_SECRET_通知は引き続きロック画面に表示されます

IOW、すべてが_VISIBILITY_PUBLIC_が有効であるかのように動作します。少なくとも、Android 5.0イメージを実行しているNexus7でテストした場合、Android 5.0がリリースされました(ビルドLPX13D)。したがって、問題が私のコードに関係しているのか、このデバイスに関係しているのか、Androidのバグに関係しているのかわかりません。

同じサンプルアプリケーションの2つのエディションがあります。

  • OneNotificationCompatNotificationManagerCompatを使用します

  • その他NotificationNotificationManagerを使用し、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ロック画面で可視性の効果が得られない理由について少し戸惑っています。

助言がありますか?

17
CommonsWare

あなたが説明している動作は、ロック画面の通知設定を「すべての通知コンテンツを表示する」に設定したときに発生する動作と一致しています。

この設定には3つのオプションがあります。

  • すべての通知コンテンツを表示は、(可視性に関係なく)すべての通知を効果的に公開します。

  • 機密性の高い通知コンテンツを非表示にするは、新しい可視性タイプを尊重します。

  • 通知をまったく表示しないは、すべての通知を事実上秘密にします。

ロック画面の通知の表示を変更するオプションは、以下に示すように、[サウンドと通知]> [デバイスがロックされている場合]のデバイス設定にあります。

Selvinが彼の回答で述べた のように、機密コンテンツを非表示にするオプションは、何らかのデバイスロック(PINまたはパターンロック)など)を設定した場合にのみ使用できます。 。ロック画面をスワイプするだけでデバイスのロックを解除できる場合、このオプションは使用できません。

8
Bryan Herbst

NotificationBuilder#setPriority(Notification.PRIORITY_MIN);を設定すると、ロック画面に通知が表示されなくなります。

驚くべきことですが、少なくともそれは十分に文書化されていました。

0
nmr