Mit dem Sicherheitscenter interagieren

Weiterleitung zum Sicherheitscenter

Jede App kann das Sicherheitscenter über die Aktion android.content.Intent.ACTION_SAFETY_CENTER (Stringwert android.intent.action.SAFETY_CENTER) öffnen.

So öffnen Sie das Sicherheitscenter:

Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);

startActivity(openSafetyCenterIntent);

Weiterleitung zu einem bestimmten Problem

Sie können auch über mit bestimmten Absichtsmerkmalen. Diese Extras sind nicht zur Nutzung durch Dritte gedacht. Sie gehören zu SafetyCenterManager, das wiederum zu @SystemApi gehört. Nur System-Apps können auf diese Extras zugreifen.

Intent-Extras, die zu einer bestimmten Warnkarte weiterleiten:

  • EXTRA_SAFETY_SOURCE_ID
    • Stringwert: android.safetycenter.extra.SAFETY_SOURCE_ID
    • Stringtyp: Gibt die ID der Sicherheitsquelle der zugehörigen Warnkarte an.
    • Erforderlich, damit die Weiterleitung zum Problem funktioniert
  • EXTRA_SAFETY_SOURCE_ISSUE_ID
    • Stringwert: android.safetycenter.extra.SAFETY_SOURCE_ISSUE_ID
    • Stringtyp: Gibt die ID der Warnungskarte an
    • Erforderlich, damit die Weiterleitung zum Problem funktioniert
  • EXTRA_SAFETY_SOURCE_USER_HANDLE
    • Stringwert: android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE
    • UserHandle-Typ: Gibt UserHandle für die zugehörige Warnkarte an.
    • Optional (Standardeinstellung ist der aktuelle Nutzer)

Mit dem folgenden Code-Snippet können Sie in einer Activity-Instanz den Bildschirm „Sicherheitscenter“ für ein bestimmtes Problem öffnen:

UserHandle theUserHandleThisIssueCameFrom = ;

Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_ID, "TheSafetySourceIdThisIssueCameFrom")
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_ISSUE_ID, "TheSafetySourceIssueIdToRedirectTo")
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_USER_HANDLE, theUserHandleThisIssueCameFrom);

startActivity(openSafetyCenterIntent);

Auf eine bestimmte Unterseite weiterleiten (ab Android 14)

Unter Android 14 oder höher ist die Seite „Sicherheitscenter“ in mehrere Unterseiten unterteilt, die die verschiedenen SafetySourcesGroup darstellen. Unter Android 13 werden diese als minimierbare Einträge angezeigt.

Mit folgendem Intent können Nutzer auf eine bestimmte Unterseite weitergeleitet werden:

  • EXTRA_SAFETY_SOURCES_GROUP_ID
    • Stringwert: android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID
    • Stringtyp: Gibt die ID von SafetySourcesGroup an
    • Erforderlich, damit die Weiterleitung zur Unterseite funktioniert

Mit dem folgenden Code-Snippet können Sie in einer Activity-Instanz den Bildschirm „Sicherheitscenter“ mit einer bestimmten Unterseite öffnen:

Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID, "TheSafetySourcesGroupId");

startActivity(openSafetyCenterIntent);

Quell-APIs des Sicherheitscenters verwenden

Die Safety Center-Quell-APIs sind über SafetyCenterManager (eine @SystemApi) verfügbar. Code für die API-Oberfläche ist in der Code Search verfügbar. Der Implementierungscode der APIs ist in der Code Search verfügbar.

Berechtigungen

Auf die Quell-APIs des Sicherheitscenters kann nur über System-Apps auf der Zulassungsliste zugegriffen werden mit den unten aufgeführten Berechtigungen. Weitere Informationen finden Sie unter Zulassungsliste für Berechtigungen mit erhöhten Berechtigungen.

  • READ_SAFETY_CENTER_STATUS
    • signature|privileged
    • Wird für die SafetyCenterManager#isSafetyCenterEnabled() API verwendet (nicht für Sicherheitscenter-Quellen benötigt, SEND_SAFETY_CENTER_UPDATE)
    • Wird von System-Apps verwendet, die prüfen, ob das Sicherheitscenter aktiviert ist
    • Nur für System-Apps auf der Zulassungsliste gewährt
  • SEND_SAFETY_CENTER_UPDATE
    • internal|privileged
    • Wird für die aktivierte API und die Safety Sources API verwendet
    • Nur von Sicherheitsquellen verwendet
    • Nur für System-Apps auf der Zulassungsliste gewährt

Diese Berechtigungen sind privilegiert und Sie können sie nur erhalten, indem Sie sie der entsprechenden Datei hinzufügen, z. B. der Datei com.android.settings.xml für die Einstellungen App und der AndroidManifest.xml-Datei der App. Weitere Informationen zum Berechtigungsmodell finden Sie unter protectionLevel.

SafetyCenterManager abrufen

SafetyCenterManager ist eine @SystemApi-Klasse, auf die über System-Apps zugegriffen werden kann ab Android 13. In diesem Aufruf wird gezeigt, wie Sie SafetyCenterManager abrufen:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
  // Must be on T or above to interact with Safety Center.
  return;
}
SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
if (safetyCenterManager == null) {
  // Should not be null on T.
  return;
}

Prüfen, ob das Sicherheitscenter aktiviert ist

Bei diesem Anruf wird geprüft, ob das Sicherheitscenter aktiviert ist. Für den Aufruf ist entweder die Berechtigung READ_SAFETY_CENTER_STATUS oder SEND_SAFETY_CENTER_UPDATE erforderlich:

boolean isSafetyCenterEnabled = safetyCenterManager.isSafetyCenterEnabled();
if (isSafetyCenterEnabled) {
  // …
} else {
  // …
}

Daten bereitstellen

Quelldaten des Sicherheitscenters mit den angegebenen String sourceId werden der Sicherheitsabteilung zur Verfügung gestellt Mitte mit dem SafetySourceData-Objekt, das einen UI-Eintrag und einen Liste der Probleme (Warnkarten). Der UI-Eintrag und die Warnkarten können verschiedene Schweregrade, die in der Klasse SafetySourceData angegeben sind:

  • SEVERITY_LEVEL_UNSPECIFIED
    • Kein Schweregrad angegeben
    • Farbe: Grau oder transparent (abhängig von den SafetySourcesGroup der Eintrag)
    • Wird für dynamische Daten verwendet, die sich als statische Einträge in der Benutzeroberfläche darstellen oder um ein nicht spezifizierter Eintrag
    • Darf nicht für Warnkarten verwendet werden
  • SEVERITY_LEVEL_INFORMATION
    • Allgemeine Informationen oder kleinere Vorschläge
    • Farbe: Grün
  • SEVERITY_LEVEL_RECOMMENDATION
    • Empfehlung, dass der Nutzer Maßnahmen in Bezug auf dieses Problem ergreifen sollte, da es sie gefährden könnten,
    • Farbe: Gelb
  • SEVERITY_LEVEL_CRITICAL_WARNING
    • Eine kritische Warnung, dass der Nutzer Maßnahmen ergreifen muss, da ein Risiko besteht
    • Farbe: Rot

SafetySourceData

Das SafetySourceData-Objekt besteht aus einem UI-Eintrag, Warnkarten und Invarianten.

  • Optionale SafetySourceStatus-Instanz (UI-Eintrag)
  • Liste der SafetySourceIssue-Instanzen (Warnkarten)
  • Optionale Bundle-Extras (ab Version 14)
  • Invarianten:
    • Die SafetySourceIssue-Liste muss aus Problemen mit eindeutigen IDs bestehen.
    • Die Instanz SafetySourceIssue darf keine höhere Bedeutung haben als SafetySourceStatus, wenn ein Wert vorhanden ist (es sei denn, SafetySourceStatus ist SEVERITY_LEVEL_UNSPECIFIED, in diesem Fall SEVERITY_LEVEL_INFORMATION Probleme erlaubt sind).
    • Zusätzliche Anforderungen, die durch die API-Konfiguration auferlegt werden, müssen erfüllt sein. Handelt es sich bei der Quelle beispielsweise nur um ein Problem, darf sie keine SafetySourceStatus-Instanz.

SafetySourceStatus

  • Erforderlicher CharSequence-Titel
  • Zusammenfassung der erforderlichen CharSequence
  • Erforderlicher Schweregrad
  • Optional PendingIntent Instanz, um den Nutzer auf die richtige Seite weiterzuleiten. Standardmäßig wird intentAction verwendet. aus der Konfiguration, falls vorhanden)
  • Optional: IconAction (als Seitensymbol im Eintrag angezeigt) mit folgenden Elementen:
    • Erforderlicher Symboltyp. Es muss sich um einen der folgenden Typen handeln:
      • ICON_TYPE_GEAR: Wird als Zahnrad neben dem UI-Eintrag angezeigt
      • ICON_TYPE_INFO: Wird als Informationssymbol neben dem UI-Eintrag angezeigt
    • Erforderlich, um den Nutzer zu einer anderen Seite weiterzuleiten PendingIntent
  • Optionaler boolescher enabled-Wert, der es ermöglicht, den UI-Eintrag als zu markieren deaktiviert, sodass es nicht anklickbar ist (Standardeinstellung ist true).
  • Invarianten:
    • PendingIntent-Instanzen müssen eine Activity-Instanz öffnen.
    • Wenn der Eintrag deaktiviert ist, muss er SEVERITY_LEVEL_UNSPECIFIED
    • Zusätzliche Anforderungen, die durch die API-Konfiguration auferlegt werden.

SafetySourceIssue

  • Erforderliche eindeutige String-Kennung
  • Erforderlicher Titel für CharSequence
  • Optionaler CharSequence-Untertitel
  • Zusammenfassung der erforderlichen CharSequence
  • Erforderlicher Schweregrad
  • Optionale Problemkategorie, die einer der folgenden sein muss:
    • ISSUE_CATEGORY_DEVICE: Das Problem betrifft das Gerät des Nutzers.
    • ISSUE_CATEGORY_ACCOUNT: Das Problem betrifft die Konten des Nutzers.
    • ISSUE_CATEGORY_GENERAL: Das Problem wirkt sich auf die allgemeine Sicherheit des Nutzers aus. Das ist die Standardeinstellung.
    • ISSUE_CATEGORY_DATA (ab Android 14): Das Problem betrifft die Daten des Nutzers.
    • ISSUE_CATEGORY_PASSWORDS (Android wird gestartet) 14): Das Problem betrifft die Passwörter.
    • ISSUE_CATEGORY_PERSONAL_SAFETY (ab Android 14): Das Problem wirkt sich auf die persönliche Sicherheit des Nutzers aus.
  • Liste mit Action-Elementen, die der Nutzer bei diesem Problem anwenden kann (jeweils) Die Instanz Action besteht aus:
    • Erforderliche eindeutige String-Kennung
    • Erforderliches CharSequence-Label
    • Erforderlich PendingIntent um die Nutzenden auf eine andere Seite weiterzuleiten oder die Aktion direkt von Sicherheitscenter-Bildschirm
    • Optionaler boolescher Wert, der angibt, ob das Problem direkt behoben werden kann Sicherheitscenter-Bildschirm (Standardeinstellung ist false)
    • Optionale CharSequence-Erfolgsnachricht, die dem Nutzer angezeigt wird Wenn das Problem direkt über das Sicherheitscenter behoben wurde Bildschirm
  • Optionale PendingIntent, die aufgerufen wird, wenn der Nutzer das Problem schließt (Standardeinstellung: nichts wird aufgerufen)
  • Erforderliche String-ID für den Problemtyp; ähnelt der Problem-ID, muss aber nicht eindeutig sein und wird für die Protokollierung verwendet
  • Optionale String für die Deduplizierungs-ID. Damit kann dieselbe SafetySourceIssue aus verschiedenen Quellen gepostet und nur einmal in der Benutzeroberfläche angezeigt werden, vorausgesetzt, sie hat dieselbe deduplicationGroup (ab Android 14). Wenn nicht angegeben, tritt das Problem nie auf dedupliziert
  • Optional: CharSequence für den Titel der Attribution. Dies ist ein Text, der angibt, woher die Warnkarte stammt (ab Android 14). Wenn nicht angegeben, wird der Titel des SafetySourcesGroup
  • Optionale Maßnahmen für das Problem (ab Android 14), die eine der folgenden Optionen sein müssen:
    • ISSUE_ACTIONABILITY_MANUAL: Der Nutzer muss dieses Problem beheben. manuell. Das ist die Standardeinstellung.
    • ISSUE_ACTIONABILITY_TIP: Dieses Problem ist nur ein Tipp und erfordert möglicherweise keine Nutzereingaben.
    • ISSUE_ACTIONABILITY_AUTOMATIC: Dieses Problem wurde bereits behoben und erfordert möglicherweise keine Nutzereingaben.
  • Optionales Benachrichtigungsverhalten (Android wird gestartet) 14). Dabei muss es sich um einen der folgenden Werte handeln:
    • NOTIFICATION_BEHAVIOR_UNSPECIFIED: Das Sicherheitscenter entscheidet, für die Karte „Warnung“ erforderlich. Das ist die Standardeinstellung.
    • NOTIFICATION_BEHAVIOR_NEVER: Es wurde keine Benachrichtigung gepostet.
    • NOTIFICATION_BEHAVIOR_DELAYED: Eine Benachrichtigung wird einige Zeit nach der Erstmeldung des Problems veröffentlicht.
    • NOTIFICATION_BEHAVIOR_IMMEDIATELY: Eine Benachrichtigung wird gepostet, sobald das Problem gemeldet wurde.
  • Optionales Notification zum Anzeigen einer benutzerdefinierten Benachrichtigung mit der Karte „Warnung“ (Ab Android 14). Wenn keine Angabe erfolgt, wird der Notification wird von der Warnungskarte abgeleitet. Zusammensetzung:
    • Erforderlicher Titel für CharSequence
    • Erforderliche CharSequence-Zusammenfassung
    • Liste der Action-Elemente, die der Nutzer für diese Benachrichtigung ausführen kann
  • Invarianten:
    • Die Liste der Action-Instanzen muss aus Aktionen mit eindeutigen Kennungen
    • Die Liste der Action-Instanzen muss entweder eine oder zwei Action enthalten Elemente. Wenn die Umsetzbarkeit nicht ISSUE_ACTIONABILITY_MANUAL ist, Action darf keinen Wert enthalten.
    • Die OnDismiss-PendingIntent darf keine Activity-Instanz öffnen.
    • Zusätzliche Anforderungen durch die API-Konfiguration

Daten zu bestimmten Ereignissen werden dem Sicherheitscenter bereitgestellt. Daher ist es notwendig, Angeben, warum die Quelle SafetySourceData mit einem SafetyEvent-Instanz.

SafetyEvent

  • Erforderlicher Typ, der einer der folgenden sein muss:
    • SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED: Der Status der Quelle hat sich geändert.
    • SAFETY_EVENT_TYPE_REFRESH_REQUESTED: auf eine Aktualisierung/erneuten Scan reagieren vom Sicherheitscenter erhalten, verwenden Sie dieses statt SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED, damit das Sicherheitscenter die Anforderung zum Aktualisieren/Erneuten Scannen nachverfolgt.
    • SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED: Wir haben das Problem behoben SafetySourceIssue.Action direkt über das Sicherheitscenter. nutzen statt SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED aus Sicherheitsgründen um die gelösten SafetySourceIssue.Action nachzuverfolgen.
    • SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED: Wir haben versucht, SafetySourceIssue.Action direkt über den Bildschirm des Sicherheitscenters zu beheben, konnten das Problem jedoch nicht beheben. Verwenden Sie diese ID anstelle von SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED, damit das Sicherheitscenter erkennen kann, dass SafetySourceIssue.Action fehlgeschlagen ist.
    • SAFETY_EVENT_TYPE_DEVICE_LOCALE_CHANGED: Die Sprache des Geräts hat sich geändert. Wir aktualisieren daher den Text der bereitgestellten Daten. Dazu ist es zulässig, SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED zu verwenden.
    • SAFETY_EVENT_TYPE_DEVICE_REBOOTED: Wir stellen diese Daten im Rahmen der beim ersten Startvorgang, da die Daten des Sicherheitscenters nicht Neustarts; dürfen SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED verwendet werden dafür.
  • Optionale String-ID für die Aktualisierungs-Broadcast-ID.
  • Optionale String-Kennung für die SafetySourceIssue-Instanz, die abgerufen wird behoben.
  • Optionale String-Kennung für die SafetySourceIssue.Action-Instanz gelöst werden kann.
  • Invarianten:
    • Die Übertragungs-ID zur Aktualisierung muss angegeben werden, wenn der Typ SAFETY_EVENT_TYPE_REFRESH_REQUESTED
    • Die Problem- und Aktions-IDs müssen angegeben werden, wenn der Typ SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED oder SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED ist.

Unten sehen Sie ein Beispiel dafür, wie eine Quelle Daten an das Sicherheitscenter weitergeben könnte (in dieser wenn ein Eintrag mit einer einzelnen Warnung angezeigt wird):

PendingIntent redirectToMyScreen =
    PendingIntent.getActivity(
        context, requestCode, redirectToMyScreenIntent, PendingIntent.FLAG_IMMUTABLE);
SafetySourceData safetySourceData =
    new SafetySourceData.Builder()
        .setStatus(
            new SafetySourceStatus.Builder(
                    "title", "summary", SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION)
                .setPendingIntent(redirectToMyScreen)
                .build())
        .addIssue(
            new SafetySourceIssue.Builder(
                    "MyIssueId",
                    "title",
                    "summary",
                    SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION,
                    "MyIssueTypeId")
                .setSubtitle("subtitle")
                .setIssueCategory(SafetySourceIssue.ISSUE_CATEGORY_DEVICE)
                .addAction(
                    new SafetySourceIssue.Action.Builder(
                            "MyIssueActionId", "label", redirectToMyScreen)
                        .build())
                .build())
        .build();
SafetyEvent safetyEvent = new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
safetyCenterManager.setSafetySourceData("MySourceId", safetySourceData, safetyEvent);

Letzte bereitgestellte Daten abrufen

Sie können die letzten Daten abrufen, die für eine Quelle, die zu Ihrer App gehört, an das Safety Center gesendet wurden. So können Sie etwas in Ihrer eigenen Benutzeroberfläche anzeigen, prüfen, ob die Daten vor der Ausführung eines ressourcenintensiven Vorgangs aktualisiert werden müssen, oder dieselbe SafetySourceData-Instanz mit einigen Änderungen oder mit einer neuen SafetyEvent-Instanz an das Safety Center senden. Sie ist auch zum Testen nützlich.

Verwende diesen Code, um die letzten Daten abzurufen, die dem Sicherheitscenter gesendet wurden:

SafetySourceData lastDataProvided = safetyCenterManager.getSafetySourceData("MySourceId");

Fehler melden

Wenn Sie keine SafetySourceData-Daten erheben können, können Sie den Fehler im Safety Center melden. Dadurch wird der Eintrag ausgegraut, die im Cache gespeicherten Daten werden gelöscht und eine Meldung wie Einstellung konnte nicht geprüft werden wird angezeigt. Sie können auch einen Fehler melden, wenn eine Instanz von SafetySourceIssue.Action nicht aufgelöst wird. werden die im Cache gespeicherten Daten nicht gelöscht und der UI-Eintrag bleibt unverändert. aber eine Nachricht ist angezeigt, um sie über den Fehler zu informieren.

Sie können den Fehler mit SafetySourceErrorDetails angeben, das aus folgenden Elementen besteht:

  • SafetySourceErrorDetails: Erforderliche SafetyEvent-Instanz:
// An error has occurred in the background, need to clear the Safety Center data to avoid showing data that may not be valid anymore
SafetyEvent safetyEvent = new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
SafetySourceErrorDetails safetySourceErrorDetails = new SafetySourceErrorDetails(safetyEvent);
safetyCenterManager.reportSafetySourceError("MySourceId", safetySourceErrorDetails);

Auf eine Anfrage zur Aktualisierung oder erneuten Überprüfung antworten

Sie können sich vom Sicherheitscenter anweisen, neue Daten bereitzustellen. Wenn Sie auf eine Aktualisierungs- oder Neuabfrage reagieren, sieht der Nutzer den aktuellen Status, wenn er das Sicherheitscenter öffnet und auf die Schaltfläche „Scannen“ tippt.

Dazu wird eine Übertragung mit der folgenden Aktion empfangen:

  • ACTION_REFRESH_SAFETY_SOURCES
    • Stringwert: android.safetycenter.action.REFRESH_SAFETY_SOURCES
    • Wird ausgelöst, wenn das Sicherheitscenter eine Anfrage zum Aktualisieren der Daten der Sicherheitsquelle für eine bestimmte App sendet.
    • Geschützter Intent, der nur vom System gesendet werden kann
    • Wird als explizite Absicht an alle Sicherheitsquellen in der Konfigurationsdatei gesendet und erfordert die Berechtigung SEND_SAFETY_CENTER_UPDATE.

Im Rahmen dieser Übertragung werden die folgenden Extras bereitgestellt:

  • EXTRA_REFRESH_SAFETY_SOURCE_IDS
    • Stringwert: android.safetycenter.extra.REFRESH_SAFETY_SOURCE_IDS
    • Stringarraytyp (String[]) für die Quell-IDs, die für die jeweilige App aktualisiert werden sollen
  • EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE

    • Stringwert: android.safetycenter.extra.REFRESH_SAFETY_SOURCES_REQUEST_TYPE
    • Ganzzahltyp, stellt einen Anfragetyp dar @IntDef
    • Muss einer der folgenden Werte sein:
      • EXTRA_REFRESH_REQUEST_TYPE_GET_DATA: Die Quelle wird aufgefordert, relativ schnell Daten bereitzustellen, in der Regel, wenn der Nutzer die Seite öffnet.
      • EXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA: Erfordert von der Quelle, möglichst aktuelle Daten bereitzustellen, in der Regel, wenn der Nutzer auf die Schaltfläche „Neuer Scan“ klickt.
  • EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID

    • Stringwert: android.safetycenter.extra.REFRESH_SAFETY_SOURCES_BROADCAST_ID
    • Stringtyp, stellt eine eindeutige Kennung für die angeforderte Aktualisierung dar

Um ein Signal vom Sicherheitscenter zu erhalten, musst du eine BroadcastReceiver Instanz. Die Nachricht wird mit einer speziellen BroadcastOptions gesendet, die das Empfänger, um einen Dienst im Vordergrund zu starten.

BroadcastReceiver antwortet auf eine Aktualisierungsanfrage:

public final class SafetySourceReceiver extends BroadcastReceiver {
  // All the safety sources owned by this application.
  private static final String[] ALL_SAFETY_SOURCES = new String[] {"MySourceId1", "…"};
  @Override
  public void onReceive(Context context, Intent intent) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
      // Must be on T or above to interact with Safety Center.
      return;
    }
    String action = intent.getAction();
    if (!SafetyCenterManager.ACTION_REFRESH_SAFETY_SOURCES.equals(action)) {
      return;
    }
    String refreshBroadcastId =
        intent.getStringExtra(SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID);
    if (refreshBroadcastId == null) {
      // Should always be provided.
      return;
    }
    String[] sourceIds =
        intent.getStringArrayExtra(SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCE_IDS);
    if (sourceIds == null) {
      sourceIds = ALL_SAFETY_SOURCES;
    }
    int requestType =
        intent.getIntExtra(
            SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE,
            SafetyCenterManager.EXTRA_REFRESH_REQUEST_TYPE_GET_DATA);
    SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
    if (safetyCenterManager == null) {
      // Should not be null on T.
      return;
    }
    if (!safetyCenterManager.isSafetyCenterEnabled()) {
      // Preferably, no Safety Source code should be run if Safety Center is disabled.
      return;
    }
    SafetyEvent refreshSafetyEvent =
        new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_REFRESH_REQUESTED)
            .setRefreshBroadcastId(refreshBroadcastId)
            .build();
    for (String sourceId : sourceIds) {
      SafetySourceData safetySourceData = getSafetySourceDataFor(sourceId, requestType);
      // Set the data (or report an error with reportSafetySourceError, if something went wrong).
      safetyCenterManager.setSafetySourceData(sourceId, safetySourceData, refreshSafetyEvent);
    }
  }
  private SafetySourceData getSafetySourceDataFor(String sourceId, int requestType) {
    switch (requestType) {
      case SafetyCenterManager.EXTRA_REFRESH_REQUEST_TYPE_GET_DATA:
        return getRefreshSafetySourceDataFor(sourceId);
      case SafetyCenterManager.EXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA:
        return getRescanSafetySourceDataFor(sourceId);
      default:
    }
    return getRefreshSafetySourceDataFor(sourceId);
  }
  // Data to provide when the user opens the page or on specific events.
  private SafetySourceData getRefreshSafetySourceDataFor(String sourceId) {
    // Get data for the source, if it's a fast operation it could potentially be executed in the
    // receiver directly.
    // Otherwise, it must start some kind of foreground service or expedited job.
    return null;
  }
  // Data to provide when the user pressed the rescan button.
  private SafetySourceData getRescanSafetySourceDataFor(String sourceId) {
    // Could be implemented the same way as getRefreshSafetySourceDataFor, depending on the source's
    // need.
    // Otherwise, could potentially perform a longer task.
    // In which case, it must start some kind of foreground service or expedited job.
    return null;
  }
}

Die gleiche Instanz von BroadcastReceiver im obigen Beispiel wird in AndroidManifest.xml deklariert:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="…">
    <application>
    <!--  -->
        <receiver android:name=".SafetySourceReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="android.safetycenter.action.REFRESH_SAFETY_SOURCES"/>
            </intent-filter>
        </receiver>
    <!--  -->
    </application>
</manifest>

Idealerweise ist eine Sicherheitscenter-Quelle so implementiert, dass SafetyCenterManager, wenn sich die Daten ändern. Aus Gründen der Systemintegrität empfehlen wir, nur auf das Signal für die erneute Suche zu reagieren (wenn der Nutzer auf die Schaltfläche „Scannen“ tippt), nicht aber, wenn der Nutzer das Sicherheitscenter öffnet. Wenn diese Funktion erforderlich, das Feld refreshOnPageOpenAllowed="true" in der Konfigurationsdatei muss festgelegt sein, damit die Quelle in diesen Fällen die gesendete Übertragung empfangen kann.

Auf das Sicherheitscenter reagieren, wenn es aktiviert oder deaktiviert ist

Mit dieser Intent-Aktion können Sie reagieren, wenn das Sicherheitscenter aktiviert oder deaktiviert ist:

  • ACTION_SAFETY_CENTER_ENABLED_CHANGED
    • Stringwert: android.safetycenter.action.SAFETY_CENTER_ENABLED_CHANGED
    • Wird ausgelöst, wenn das Sicherheitscenter während der Laufzeit des Geräts aktiviert oder deaktiviert wird
    • Wird beim Starten nicht aufgerufen (verwenden Sie dazu ACTION_BOOT_COMPLETED).
    • Geschützter Intent, der nur vom System gesendet werden kann
    • Wird als explizite Absicht an alle Sicherheitsquellen in der Konfigurationsdatei gesendet. Erfordert die Berechtigung SEND_SAFETY_CENTER_UPDATE.
    • Wird als impliziter Intent gesendet, für den READ_SAFETY_CENTER_STATUS erforderlich ist Berechtigung

Mit dieser Intent-Aktion können Sie Funktionen aktivieren oder deaktivieren, die sich auf den Dienst „Sicherheitscenter“ auf dem Gerät beziehen.

Lösungsmaßnahmen implementieren

Eine Auflösungsaktion ist eine SafetySourceIssue.Action-Instanz, die ein Nutzer können Sie das Problem direkt über das Sicherheitscenter lösen. Der Nutzer tippt auf eine Aktionsschaltfläche und die von der Sicherheitsquelle gesendete PendingIntent-Instanz auf SafetySourceIssue.Action wird ausgelöst. Dadurch wird das Problem im Hintergrund behoben und das Sicherheitscenter wird benachrichtigt, wenn die Lösung abgeschlossen ist.

Zum Implementieren von Auflösungsaktionen kann die Sicherheitscenter-Quelle einen Dienst verwenden, wenn Der Vorgang dauert voraussichtlich einige Zeit (PendingIntent.getService) oder Übertragungsempfänger (PendingIntent.getBroadcast).

Verwende diesen Code, um ein Problem an das Sicherheitscenter zu senden:

Intent resolveIssueBroadcastIntent =
    new Intent("my.package.name.MY_RESOLVING_ACTION").setClass(ResolveActionReceiver.class);
PendingIntent resolveIssue =
    PendingIntent.getBroadcast(
        context, requestCode, resolveIssueBroadcastIntent, PendingIntent.FLAG_IMMUTABLE);
SafetySourceData safetySourceData =
    new SafetySourceData.Builder()
        .setStatus(
            new SafetySourceStatus.Builder(
                    "title", "summary", SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION)
                .setPendingIntent(redirectToMyScreen)
                .build())
        .addIssue(
            new SafetySourceIssue.Builder(
                    "MyIssueId",
                    "title",
                    "summary",
                    SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION,
                    "MyIssueTypeId")
                .setIssueCategory(SafetySourceIssue.ISSUE_CATEGORY_DEVICE)
                .addAction(
                    new SafetySourceIssue.Action.Builder(
                            "MyIssueActionId", "label", resolveIssue)
                        .setWillResolve(true)
                        .build())
                .build())
        .build();
SafetyEvent safetyEvent = new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
safetyCenterManager.setSafetySourceData("MySourceId", safetySourceData, safetyEvent);

BroadcastReceiver löst die Aktion auf:

public final class ResolveActionReceiver extends BroadcastReceiver {
  private static final String MY_RESOLVING_ACTION = "my.package.name.MY_RESOLVING_ACTION";
  @Override
  public void onReceive(Context context, Intent intent) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
      // Must be on T or above to interact with Safety Center.
      return;
    }
    String action = intent.getAction();
    if (!MY_RESOLVING_ACTION.equals(action)) {
      return;
    }
    SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
    if (safetyCenterManager == null) {
      // Should not be null on T.
      return;
    }
    if (!safetyCenterManager.isSafetyCenterEnabled()) {
      // Preferably, no Safety Source code should be run if Safety Center is disabled.
      return;
    }
    resolveTheIssue();
    SafetyEvent resolveActionSafetyEvent =
        new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED)
            .setSafetySourceIssueId("MyIssueId")
            .setSafetySourceIssueActionId("MyIssueActionId")
            .build();
    SafetySourceData dataWithoutTheIssue = ;
    // Set the data (or report an error with reportSafetySourceError and
    // SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED, if something went wrong).
    safetyCenterManager.setSafetySourceData("MySourceId", dataWithoutTheIssue, resolveActionSafetyEvent);
  }

  private void resolveTheIssue() {
    // Resolves the issue for the user. Given this a BroadcastReceiver, this should be a fast action.
    // Otherwise, a foreground service and PendingIntent.getService should be used instead (or a job
    // could be scheduled here, too).
  }
}

Dieselbe Instanz von BroadcastReceiver im obigen Beispiel wird in deklariert. AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="…">
    <application>
    <!--  -->
        <receiver android:name=".ResolveActionReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="my.package.name.MY_RESOLVING_ACTION"/>
            </intent-filter>
        </receiver>
    <!--  -->
    </application>
</manifest>

Auf Ablehnungen von Problemen reagieren

Sie können eine PendingIntent-Instanz angeben, die ausgelöst werden kann, wenn ein SafetySourceIssue Instanz wurde geschlossen. Das Sicherheitscenter kümmert sich um diese Probleme Ablehnungen:

  • Wenn von einer Quelle ein Problem gemeldet wird, kann der Nutzer es im Sicherheitscenter schließen. Bildschirm, indem Sie auf die Schaltfläche zum Schließen tippen (eine X-Schaltfläche auf der Karte mit Warnungen).
  • Wenn ein Nutzer ein Problem ablehnt und das Problem weiterhin besteht, wird es nicht angezeigt auf der Benutzeroberfläche.
  • Ein Laufwerk bleibt auch bei Geräteneustarts dauerhaft geschlossen.
  • Wenn die Quelle im Play Console-Sicherheitscenter ein Problem nicht mehr meldet und es später wieder meldet, wird das Problem wieder angezeigt. Dadurch soll die wenn ein Nutzer eine Warnung sieht, sie schließt und dann Maßnahmen ergreift, sollte das Problem behoben werden, aber die Nutzenden tun wieder etwas, verursacht ein ähnliches Problem. Jetzt sollte die Warnkarte wieder angezeigt werden.
  • Gelbe und rote Warnkarten werden alle 180 Tage wieder angezeigt, es sei denn, der Nutzer hat sie mehrmals geschlossen.

Zusätzliche Verhaltensweisen sollten von der Quelle nicht benötigt werden, es sei denn:

  • Die Quelle versucht, dieses Verhalten auf unterschiedliche Weise zu implementieren, zum Beispiel das Problem noch einmal ansprechen.
  • Die Quelle versucht, dies als Rückruf zu verwenden, um beispielsweise die Informationen zu protokollieren.

Daten für mehrere Nutzer/Profile bereitstellen

Die SafetyCenterManager API kann nutzer- und profilübergreifend verwendet werden. Weitere Informationen finden Sie unter Apps für mehrere Nutzer erstellen. Das Context Objekt, das SafetyCenterManager bereitstellt, ist mit einem UserHandle verknüpft. , sodass die zurückgegebene SafetyCenterManager-Instanz mit dem Sicherheitscenter für diese UserHandle Instanz. Standardmäßig ist Context die mit dem aktiven Nutzer verknüpft sind. Sie können aber auch eine Instanz für einen anderen Nutzer, wenn die App die INTERACT_ACROSS_USERS- und INTERACT_ACROSS_USERS_FULL-Berechtigungen. In diesem Beispiel sehen Sie, für alle Nutzer/Profile:

Context userContext = context.createContextAsUser(userHandle, 0);
SafetyCenterManager userSafetyCenterManager = userContext.getSystemService(SafetyCenterManager.class);
if (userSafetyCenterManager == null) {
  // Should not be null on T.
  return;
}
// Calls to userSafetyCenterManager will provide data for the given userHandle

Jeder Nutzer auf dem Gerät kann mehrere verwaltete Profile haben. Das Sicherheitscenter stellt für jeden Nutzer unterschiedliche Daten bereit, führt jedoch die Daten aller verwalteten Profilen, die mit einem bestimmten Nutzer verknüpft sind.

Wenn profile="all_profiles" für die Quelle in der Konfigurationsdatei festgelegt ist, Folgendes geschieht:

  • Es gibt einen UI-Eintrag für den Nutzer (übergeordnetes Profil) und alle zugehörigen verwalteten Profile (die titleForWork-Instanzen verwenden).
  • Das Signal zur Aktualisierung oder erneuten Prüfung wird für das übergeordnete Profil und alle verknüpfte verwaltete Profile. Der zugehörige Empfänger wird für jedes Profil gestartet und kann die zugehörigen Daten direkt an SafetyCenterManager senden, ohne dass ein profilübergreifender Aufruf erforderlich ist, es sei denn, der Empfänger oder die App ist singleUser.

  • Die Quelle muss Daten für den Nutzer und alle seine verwalteten Profile bereitstellen. Die Daten für jeden UI-Eintrag können je nach Profil unterschiedlich sein.

Testen

können Sie auf ShadowSafetyCenterManager zugreifen und es in einem Robolectric-Test verwenden.

private static final String MY_SOURCE_ID = "MySourceId";

private final MyClass myClass = ;
private final SafetyCenterManager safetyCenterManager = getApplicationContext().getSystemService(SafetyCenterManager.class);

@Test
public void whenRefreshingData_providesDataToSafetyCenterForMySourceId() {
    shadowOf(safetyCenterManager).setSafetyCenterEnabled(true);
    setupDataForMyClass();

    myClass.refreshData();

    SafetySourceData expectedSafetySourceData = ;
    assertThat(safetyCenterManager.getSafetySourceData(MY_SOURCE_ID)).isEqualTo(expectedSafetySourceData);
    SafetyEvent expectedSafetyEvent = ;
    assertThat(shadowOf(safetyCenterManager).getLastSafetyEvent(MY_SOURCE_ID)).isEqualTo(expectedSafetyEvent);
}

Sie können weitere End-to-End-Tests (E2E) schreiben, aber das wäre in diesem Fall nicht möglich. . Weitere Informationen zum Schreiben dieser E2E-Tests finden Sie unter CTS-Tests (CtsSafetyCenterTestCases)

Test und interne APIs

Die internen APIs und Test-APIs sind für den internen Gebrauch vorgesehen und werden daher nicht beschrieben in in diesem Leitfaden. Wir werden jedoch einige interne APIs in Zukunft möglicherweise erweitern, damit OEMs ihre eigene Benutzeroberfläche erstellen können. Wir aktualisieren dann diesen Leitfaden, um Ihnen die Verwendung zu erläutern.

Berechtigungen

  • MANAGE_SAFETY_CENTER
    • internal|installer|role
    • Wird für die internen Sicherheitscenter-APIs verwendet
    • Nur für PermissionController und Shell gewährt

App "Einstellungen"

Weiterleitung zum Sicherheitscenter

Standardmäßig wird das Sicherheitscenter über die App „Einstellungen“ mit einem neuen Sicherheit und Datenschutzeintrag. Wenn Sie eine andere App für Einstellungen verwenden oder Sie die Einstellungen geändert haben, müssen Sie möglicherweise anpassen, wie das Sicherheitscenter auf die zugegriffen wird.

Wenn das Sicherheitscenter aktiviert ist:

  • Der alte Datenschutzeintrag ist versteckter Code
  • Der Eintrag Sicherheit ist ausgeblendet Code
  • Dem Eintrag Sicherheit und Datenschutz wurde der Code hinzugefügt.
  • Neu: Sicherheit und Der Datenschutzeintrag wird zum Sicherheitscentercode weitergeleitet.
  • android.settings.PRIVACY_SETTINGS und android.settings.SECURITY_SETTINGS Intent-Aktionen werden zum Öffnen des Sicherheitscenters weitergeleitet (Code: Sicherheit, Datenschutz)

Erweiterte Seiten zu Sicherheit und Datenschutz

In den Einstellungen finden Sie unter Weitere Sicherheitseinstellungen und Weitere Datenschutzeinstellungen weitere Einstellungen, die auch im Sicherheitscenter verfügbar sind:

Sicherheitsquellen

Das Sicherheitscenter ist in bestimmte Sicherheitsquellen eingebunden, die von der Einstellungen App bereitgestellt werden:

  • Eine Sicherheitsquelle für den Sperrbildschirm bestätigt, dass ein Sperrbildschirm mit einem Sicherheitscodes oder andere Sicherheitsmechanismen ein, um die privaten Informationen des Nutzers zu schützen. geschützt sind.
  • Eine biometrische Sicherheitsquelle (standardmäßig ausgeblendet) wird angezeigt, um sie in einen Fingerabdruck- oder Gesichtssensor einzubinden.

Der Quellcode für diese Sicherheitscenter-Quellen ist über Android Code Suche. Wenn die Einstellungen-App nicht geändert wird (d. h., es werden keine Änderungen am Paketnamen, am Quellcode oder am Quellcode für den Sperrbildschirm und die biometrischen Funktionen vorgenommen), sollte diese Integration sofort funktionieren. Andernfalls werden einige Änderungen z. B. die Konfigurationsdatei ändern, um das Paket Namen der Einstellungen und der Quellen, die mit dem Sicherheitscenter verknüpft sind, wie und die Integration. Weitere Informationen finden Sie unter Konfigurationsdatei aktualisieren und Integrationseinstellungen.

PendingIntent

Wenn Sie die vorhandene Integration des Safety Centers in der Einstellungen App unter Android 14 oder höher nutzen, wurde der unten beschriebene Fehler behoben. In diesem Fall ist das Lesen dieses Abschnitts nicht erforderlich.

Wenn Sie sicher sind, dass der Fehler nicht mehr auftritt, setzen Sie in den Einstellungen einen booleschen XML-Ressourcenkonfigurationswert von config_isSafetyCenterLockScreenPendingIntentFixed auf true, um die Problemumgehung im Sicherheitscenter zu deaktivieren.

Problemumgehung für PendingIntents

Dieser Fehler wird dadurch verursacht, dass die Einstellungen Intent-Instanz-Extras verwenden, um zu bestimmen, welches Fragment geöffnet werden soll. Weil Intent#equals die Instanz Intent nicht übernimmt die PendingIntent-Instanz für das Zahnradsymbol und den als gleichwertig betrachtet werden, und navigieren zur gleichen Benutzeroberfläche (auch wenn sie eine andere UI aufrufen möchten. Dieses Problem wurde in einem QPR-Release behoben, indem die PendingIntent-Instanzen nach Anfragecode unterschieden wurden. Alternativ kann dies mit Intent#setId unterschieden werden.

Interne Sicherheitsquellen

Einige Sicherheitscenter-Quellen sind intern und werden in der System-App „PermissionController“ im Modul „PermissionController“ implementiert. Diese verhalten sich wie normale Quellen im Sicherheitscenter und erhalten keine besonderen Behandlung. Code für diese Quellen ist über Android-Code verfügbar. Suche.

Dabei handelt es sich hauptsächlich um Datenschutzsignale, z. B.:

  • Bedienungshilfen
  • Berechtigungen für nicht verwendete Apps automatisch widerrufen
  • Standortzugriff
  • Benachrichtigungs-Listener
  • Informationen zu den Arbeitsrichtlinien