1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-android-app-sec-guidebook

Клонировать/Скачать
4.10.md 9 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 20:24 c13bfb7

4.10 Использование уведомлений

Android предоставляет функцию уведомления, которая позволяет отправлять сообщения конечным пользователям. Уведомления позволяют отображать значки и сообщения в области, называемой статусной строкой.

В Android 5.0 (API Level 21) была улучшена функция коммуникации уведомлений: сообщения могут отображаться даже при заблокированном экране, в зависимости от настроек пользователя и приложения. Однако неправильное использование уведомлений может привести к тому, что личная информация (которая должна быть видна только конечному пользователю) станет доступна третьим лицам. По этой причине необходимо тщательно учитывать конфиденциальность и безопасность при реализации этой функции.

Таблица ниже суммирует возможные значения видимости и соответствующее поведение уведомлений.

Значение видимости Поведение уведомления
Общедоступное Уведомление отображается на всех заблокированных экранах
Частное Уведомление отображается на всех заблокированных экранах; однако на защищённых паролем заблокированных экранах (безопасная блокировка), поля заголовка и текста уведомления скрыты (они заменяются общедоступными сообщениями, а личная информация скрыта)
Секретное Уведомление не отображается на заблокированных экранах, защищённых паролем или другими мерами безопасности (безопасная блокировка). (Уведомление отображается на незащищённых заблокированных экранах.)

4.10.1 Пример кода

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

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

Основные моменты:

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

  2. Не включайте личную информацию в уведомления, предназначенные для публичного отображения (отображаются при заблокированном экране).

  3. Установите видимость уведомления как «Частное» при создании уведомления.

  4. Когда видимость установлена как «Частная», уведомление может содержать личную информацию.

VisibilityPrivateNotificationActivity.java

package org.jssec.notification.visibilityPrivate;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.view.View;

public class VisibilityPrivateNotificationActivity extends Activity {

    /**
    * Display a private Notification
    */
    private final int mNotificationId = 0;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    public void onSendNotificationClick(View view) {
        // *** POINT 1 *** When preparing a Notification that includes private information, prepare an additional Noficiation for public display (displayed when the screen is locked).
        Notification.Builder publicNotificationBuilder = new Notification.Builder(this).setContentTitle("Notif
        ication : Public");
        if (Build.VERSION.SDK_INT >= 21)
            publicNotificationBuilder.setVisibility(Notification.VISIBILITY_PUBLIC);
        // *** POINT 2 *** Do not include private information in Notifications prepared for public display (displayed when the screen is locked).
        publicNotificationBuilder.setContentText("Visibility Public : Omitting sensitive data.");
        publicNotificationBuilder.setSmallIcon(R.drawable.ic_launcher);
        Notification publicNotification = publicNotificationBuilder.build();
        // Construct a Notification that includes private information.
        Notification.Builder privateNotificationBuilder = new Notification.Builder(this).setContentTitle("Notification : Private");
        // *** POINT 3 *** Explicitly set Visibility to Private when creating Notifications.
        if (Build.VERSION.SDK_int >= 21)
            privateNotificationBuilder.setVisibility(Notification.VISIBILITY_PRIVATE);

        // *** POINT 4 *** When Visibility is set to Private, Notifications may contain private information.
        privateNotificationBuilder.setContentText("Visibility Private : Including user info.");
        privateNotificationBuilder.setSmallIcon(R.drawable.ic_launcher);
        // When creating a Notification with Visibility=Private, we also create and register a separate
        Notification with Visibility=Public for public display.
        if (Build.VERSION.SDK_INT >= 21)
            privateNotificationBuilder.setPublicVersion(publicNotification);
        Notification privateNotification = privateNotificationBuilder.build();
        //Although not implemented in this sample code, in many cases
        //Notifications will use setContentIntent(PendingIntent intent)
        //to ensure that an Intent is transmission when Notification
        //is clicked. In this case, it is necessary to take steps--depending
        //on the type of component being called--to ensure that the Intent
        //in question is called by safe methods (for example, by explicitly
        //using Intent). For information on safe methods for calling various
        //types of component, see the following sections.
        //4.1. Creating and using Activities
        //4.2. Sending and receiving Broadcasts
        //4.4. Creating and using Services
        NotificationManager notificationManager = Как было сказано ранее, с помощью NotificationListenerService можно получить разрешение пользователя и считывать уведомления. Однако при работе с информацией из уведомлений следует быть осторожным, так как она может содержать личные данные пользователя.

MyNotificationListenerService.java

import android.app.Notification; import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import android.util.Log;

public class MyNotificationListenerService extends NotificationListenerService { @Override public void onNotificationPosted(StatusBarNotification sbn) { // Уведомление опубликовано. outputNotificationData(sbn, "Notification Posted : "); }

@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
    // Уведомление удалено.
    outputNotificationData(sbn, "Notification Deleted : ");
}

private void outputNotificationData(StatusBarNotification sbn, String prefix) {
    Notification notification = sbn.getNotification();
    int notificationID = sbn.getId();
    String packageName = sbn.getPackageName();
    long PostTime = sbn.getPostTime();
    String message = prefix + "Visibility :" + notification.visibility + " ID : " + notificationID;
    message += " Package : " + packageName + " PostTime : " + PostTime;
    Log.d("NotificationListen", message);
}

}


Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-android-app-sec-guidebook.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-android-app-sec-guidebook.git
oschina-mirror
wizardforcel-android-app-sec-guidebook
wizardforcel-android-app-sec-guidebook
master