Android предоставляет функцию уведомления, которая позволяет отправлять сообщения конечным пользователям. Уведомления позволяют отображать значки и сообщения в области, называемой статусной строкой.
В Android 5.0 (API Level 21) была улучшена функция коммуникации уведомлений: сообщения могут отображаться даже при заблокированном экране, в зависимости от настроек пользователя и приложения. Однако неправильное использование уведомлений может привести к тому, что личная информация (которая должна быть видна только конечному пользователю) станет доступна третьим лицам. По этой причине необходимо тщательно учитывать конфиденциальность и безопасность при реализации этой функции.
Таблица ниже суммирует возможные значения видимости и соответствующее поведение уведомлений.
Значение видимости | Поведение уведомления |
---|---|
Общедоступное | Уведомление отображается на всех заблокированных экранах |
Частное | Уведомление отображается на всех заблокированных экранах; однако на защищённых паролем заблокированных экранах (безопасная блокировка), поля заголовка и текста уведомления скрыты (они заменяются общедоступными сообщениями, а личная информация скрыта) |
Секретное | Уведомление не отображается на заблокированных экранах, защищённых паролем или другими мерами безопасности (безопасная блокировка). (Уведомление отображается на незащищённых заблокированных экранах.) |
Если уведомление содержит личную информацию о конечном пользователе, необходимо удалить эту информацию перед добавлением уведомления на заблокированный экран для отображения.
Пример кода ниже показывает, как правильно использовать уведомления для сообщений, содержащих личные данные.
Основные моменты:
Используйте уведомления для сообщений, которые содержат личную информацию, подготовив версию уведомления, подходящую для публичного отображения (отображается при заблокированном экране).
Не включайте личную информацию в уведомления, предназначенные для публичного отображения (отображаются при заблокированном экране).
Установите видимость уведомления как «Частное» при создании уведомления.
Когда видимость установлена как «Частная», уведомление может содержать личную информацию.
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 )