не раскрывайте какую-либо часть уведомления на незащищенном экране блокировки. (при разработке android) [дублировать]

17
задан Tomáš Hubálek 20 November 2014 в 09:47
поделиться

4 ответа

Использовать видимость и приоритет

Как описано в этом ответе , вы можете использовать VISIBILITY_SECRET , чтобы подавить уведомление на экране блокировки, когда у пользователя есть защищенная блокировка клавиатуры (не просто прокрутка или отсутствие блокировки клавиатуры), и подавление чувствительных уведомлений.

Чтобы охватить остальные случаи, вы можете программно скрыть уведомление с экрана блокировки и строки состояния, установив приоритет уведомления PRIORITY_MIN всякий раз, когда присутствует блокировка клавиатуры, а затем сброс приоритета всякий раз, когда блокировка клавиатуры отсутствует.

Недостатки

  • Использование Android 5, это, как представляется, приводит к тому, что уведомление очень коротко появляется на экране блокировки, но затем исчезает.
  • Больше не работает с Android Developer Developer 2, если у пользователя нет защищенного экрана блокировки ( например, салфетки), поскольку приоритеты уведомлений устарели .

Пример

final BroadcastReceiver notificationUpdateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        NotificationManager notificationManager =
            (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);

        NotificationCompat.Builder builder =
            new NotificationCompat.Builder(context);
            .setVisibility(NotificationCompat.VISIBILITY_SECRET);

        KeyguardManager keyguardManager =
            (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);

        if (keyguardManager.isKeyguardLocked())
            builder.setPriority(NotificationCompat.PRIORITY_MIN);

        notificationManager.notify(YOUR_NOTIFICATION_ID, notification);
    }
};

//For when the screen might have been locked
context.registerReceiver(notificationUpdateReceiver,
    new IntentFilter(Intent.ACTION_SCREEN_OFF));

//Just in case the screen didn't get a chance to finish turning off but still locked
context.registerReceiver(notificationUpdateReceiver,
    new IntentFilter(Intent.ACTION_SCREEN_ON));

//For when the user unlocks the device
context.registerReceiver(notificationUpdateReceiver,
    new IntentFilter(Intent.ACTION_USER_PRESENT));

//For when the user changes users
context.registerReceiver(notificationUpdateReceiver,
    new IntentFilter(Intent.ACTION_USER_BACKGROUND));
context.registerReceiver(notificationUpdateReceiver,
    new IntentFilter(Intent.ACTION_USER_FOREGROUND));
13
ответ дан Community 28 August 2018 в 06:27
поделиться

Вы можете установить приоритет уведомления на PRIORITY_MIN . Это должно скрыть уведомление на экране блокировки. Он также скрывает значок из строки состояния (не уверен, что вы этого хотите), но само уведомление все еще отображается в области уведомлений.

4
ответ дан Floern 28 August 2018 в 06:27
поделиться

Кажется, что VISIBILITY_SECRET делает самый чистый подход. В соответствии с документацией:

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

source (NotificationData в проекте SystemUI AOSP), VISIBILITY_SECRET - единственный способ сделать это:

boolean shouldFilterOut(StatusBarNotification sbn) {
    if (!(mEnvironment.isDeviceProvisioned() ||
            showNotificationEvenIfUnprovisioned(sbn))) {
        return true;
    }

    if (!mEnvironment.isNotificationForCurrentProfiles(sbn)) {
        return true;
    }

    if (sbn.getNotification().visibility == Notification.VISIBILITY_SECRET &&
            mEnvironment.shouldHideSensitiveContents(sbn.getUserId())) {
        return true;
    }
    return false;
}

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

6
ответ дан gprathour 28 August 2018 в 06:27
поделиться

Я создал «LockscreenIntentReceiver» для моего текущего уведомления, которое выглядит так:

    private class LockscreenIntentReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        try { 
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                Log.d(TAG, "LockscreenIntentReceiver: ACTION_SCREEN_OFF");
                disableNotification();
            } else if (action.equals(Intent.ACTION_USER_PRESENT)){
                Log.d(TAG, "LockscreenIntentReceiver: ACTION_USER_PRESENT");
                // NOTE: Swipe unlocks don't have an official Intent/API in android for detection yet,
                // and if we set ungoing control without a delay, it will get negated before it's created
                // when pressing the lock/unlock button too fast consequently.
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (NotificationService.this.isNotificationAllowed()) {
                            enableNotification((Context)NotificationService.this);
                        }
                    }
                }, 800);
            }
        } catch (Exception e) {
            Log.e(TAG, "LockscreenIntentReceiver exception: " + e.toString());
        }
    }
}

Этот код будет в основном удалять текущее уведомление, когда пользователь блокирует телефон (удаление будет видно очень кратко). И как только пользователь разблокирует телефон, текущее уведомление будет восстановлено после времени задержки (здесь 800 мс). enableNotification () - это метод, который создаст уведомление, и вызовет startForeground () . В настоящее время проверено работать на Android 7.1.1.

Вам остается только запомнить для регистрации и amp; соответственно отмените регистрацию получателя.

0
ответ дан ItWillDo 28 August 2018 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: