Reindirizza al Centro per la sicurezza online
Qualsiasi app può aprire il Centro per la sicurezza online utilizzando
Azione android.content.Intent.ACTION_SAFETY_CENTER
(valore stringa
android.intent.action.SAFETY_CENTER
).
Per aprire il Centro per la sicurezza online, effettua una chiamata da un'istanza Activity
:
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);
startActivity(openSafetyCenterIntent);
Reindirizza a un problema specifico
È anche possibile reindirizzare a una scheda di avviso del Centro per la sicurezza online specifica utilizzando
e intenti extra specifici. Questi extra non sono destinati a essere utilizzati da terze parti, pertanto
ma fanno parte di SafetyCenterManager
, che fa parte di @SystemApi
. Solo
le app di sistema
possono accedere a questi extra.
Extra di intent che reindirizzano una scheda di avviso specifica:
EXTRA_SAFETY_SOURCE_ID
- Valore stringa:
android.safetycenter.extra.SAFETY_SOURCE_ID
- Tipo di stringa: specifica l'ID della fonte di sicurezza dell'elemento associato scheda di avviso
- Obbligatorio affinché il reindirizzamento al problema funzioni
- Valore stringa:
EXTRA_SAFETY_SOURCE_ISSUE_ID
- Valore stringa:
android.safetycenter.extra.SAFETY_SOURCE_ISSUE_ID
- Tipo di stringa: specifica l'ID scheda di avviso
- Obbligatorio affinché il reindirizzamento al problema funzioni
- Valore stringa:
EXTRA_SAFETY_SOURCE_USER_HANDLE
- Valore stringa:
android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE
- Tipo di
UserHandle
: specificaUserHandle
per l'avviso associato carta - Facoltativo (il valore predefinito è l'utente corrente)
- Valore stringa:
Lo snippet di codice seguente può essere utilizzato dall'interno di un'istanza Activity
per aprire
schermata Centro per la sicurezza online a un problema specifico:
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);
Reindirizzare a una pagina secondaria specifica (a partire da Android 14)
In Android 14 o versioni successive, la pagina Centro per la sicurezza online è suddivisa
in più pagine secondarie che rappresentano i diversi SafetySourcesGroup
(in
Android 13, viene mostrato come voci comprimibili.
È possibile reindirizzare a una pagina secondaria specifica utilizzando questo intent aggiuntivo:
EXTRA_SAFETY_SOURCES_GROUP_ID
- Valore stringa:
android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID
- Tipo di stringa: specifica l'ID dell'attributo
SafetySourcesGroup
- Obbligatorio affinché il reindirizzamento alla pagina secondaria funzioni
- Valore stringa:
Lo snippet di codice seguente può essere utilizzato dall'interno di un'istanza Activity
per aprire
dalla schermata Centro per la sicurezza online a una pagina secondaria specifica:
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID, "TheSafetySourcesGroupId");
startActivity(openSafetyCenterIntent);
Utilizzare le API di origine del Centro per la sicurezza online
Le API di origine del Centro per la sicurezza online sono disponibili
SafetyCenterManager
(che è un @SystemApi
). Il codice per la piattaforma API è disponibile in
Codice
Ricerca.
Il codice di implementazione delle API è disponibile in Codice
Ricerca.
Autorizzazioni
Le API di origine del Centro per la sicurezza online sono accessibili solo dalle app di sistema incluse nella lista consentita usando le autorizzazioni elencate di seguito. Per ulteriori informazioni, vedi Con privilegi Autorizzazione alla lista consentita.
READ_SAFETY_CENTER_STATUS
signature|privileged
- Utilizzata per l'API
SafetyCenterManager#isSafetyCenterEnabled()
(non necessari alle fonti del Centro per la sicurezza online, hanno bisogno solo autorizzazioneSEND_SAFETY_CENTER_UPDATE
) - Usato dalle app di sistema che verificano se il Centro per la sicurezza online è attivo
- Concessa solo alle app di sistema incluse nella lista consentita
SEND_SAFETY_CENTER_UPDATE
internal|privileged
- Utilizzato per l'API abilitata e l'API Safety Source
- Usato solo dalle fonti di sicurezza
- Concessa solo alle app di sistema incluse nella lista consentita
Queste autorizzazioni sono privilegiate e puoi acquisirle soltanto aggiungendole
il file pertinente, ad esempio
com.android.settings.xml
per l'app Impostazioni e al file AndroidManifest.xml
dell'app. Consulta
protectionLevel
per ulteriori informazioni sul modello di autorizzazione.
Scarica SafetyCenterManager
SafetyCenterManager
è un corso @SystemApi
accessibile dalle app di sistema
a partire da Android 13. Questa chiamata mostra come
get SafetyCenterManager:
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;
}
Controllare se il Centro per la sicurezza online è attivo
Questa chiamata verifica se il Centro per la sicurezza online è attivo. La chiamata richiede
READ_SAFETY_CENTER_STATUS
o l'autorizzazione SEND_SAFETY_CENTER_UPDATE
:
boolean isSafetyCenterEnabled = safetyCenterManager.isSafetyCenterEnabled();
if (isSafetyCenterEnabled) {
// …
} else {
// …
}
Fornisci dati
I dati della fonte del Centro per la sicurezza online con l'elemento String sourceId
specificato vengono forniti al team per la sicurezza online
Centra con l'oggetto SafetySourceData
, che rappresenta una voce nell'interfaccia utente e un
elenco dei problemi (schede di avviso). La voce dell'interfaccia utente e le schede di avviso possono contenere
diversi livelli di gravità specificati nella classe SafetySourceData
:
SEVERITY_LEVEL_UNSPECIFIED
- Nessuna gravità specificata
- Colore: grigio o trasparente (in base a
SafetySourcesGroup
del voce) - Utilizzato per i dati dinamici che rappresentano una voce statica nell'interfaccia utente o per mostrare una voce non specificata
- Non deve essere utilizzato per le schede di avviso
SEVERITY_LEVEL_INFORMATION
- Informazioni di base o suggerimento di minore entità
- Colore: verde
SEVERITY_LEVEL_RECOMMENDATION
- Suggerimento che l'utente dovrebbe intervenire in merito a questo problema, poiché potrebbero metterli a rischio
- Colore: giallo
SEVERITY_LEVEL_CRITICAL_WARNING
- Avviso critico che informa che l'utente deve intervenire in merito a questo problema, poiché comporta un rischio
- Colore: rosso
SafetySourceData
L'oggetto SafetySourceData
è composto da una voce nell'interfaccia utente, schede di avviso e
invarianti.
- Istanza
SafetySourceStatus
facoltativa (voce UI) - Elenco di
SafetySourceIssue
istanze (schede di avviso) - Extra facoltativi di
Bundle
(a partire dal 14° anniversario) - Invarianti:
- L'elenco
SafetySourceIssue
deve essere composto da problemi con o identificatori univoci. - L'istanza
SafetySourceIssue
non deve essere di maggiore importanza diSafetySourceStatus
se disponibile (a meno che non siaSafetySourceStatus
SEVERITY_LEVEL_UNSPECIFIED
, in questo casoSEVERITY_LEVEL_INFORMATION
sono consentiti). - Devono essere soddisfatti requisiti aggiuntivi imposti dalla configurazione API.
Ad esempio, se l'origine è esclusivamente relativa al problema, non deve fornire un
SafetySourceStatus
istanza.
- L'elenco
SafetySourceStatus
- Titolo
CharSequence
obbligatorio - Riepilogo
CharSequence
obbligatorio - Livello di gravità richiesto
- Facoltativo
PendingIntent
per reindirizzare l'utente alla pagina corretta (per impostazione predefinita usaintentAction
dalla configurazione, se presente) IconAction
facoltativo (visualizzato come icona laterale nella voce) composto da:- Tipo di icona obbligatorio, che deve essere uno dei seguenti:
ICON_TYPE_GEAR
: visualizzata come un ingranaggio accanto alla voce nell'interfaccia utenteICON_TYPE_INFO
: visualizzata come icona delle informazioni accanto alla voce nell'interfaccia utente
- Obbligatorie
PendingIntent
per reindirizzare l'utente a un'altra pagina.
- Tipo di icona obbligatorio, che deve essere uno dei seguenti:
- Valore booleano facoltativo
enabled
che consente di contrassegnare la voce UI come disattivata, quindi non è possibile fare clic (il valore predefinito ètrue
) - Invarianti:
PendingIntent
istanze devono aprire un'istanzaActivity
.- Se la voce è disabilitata, deve essere designata
SEVERITY_LEVEL_UNSPECIFIED
. - Requisiti aggiuntivi imposti dalla configurazione API.
SafetySourceIssue
- Identificatore univoco
String
obbligatorio - Titolo
CharSequence
obbligatorio - Sottotitolo
CharSequence
facoltativo - Riepilogo
CharSequence
obbligatorio - Livello di gravità richiesto
- Categoria di problema facoltativa, che deve essere una delle seguenti:
ISSUE_CATEGORY_DEVICE
: il problema riguarda il dispositivo dell'utente.ISSUE_CATEGORY_ACCOUNT
: il problema riguarda gli account dell'utente.ISSUE_CATEGORY_GENERAL
: il problema influisce sulla sicurezza generale dell'utente. Questa è l'impostazione predefinita.ISSUE_CATEGORY_DATA
(a partire da Android 14): Il problema riguarda i dati dell'utente.ISSUE_CATEGORY_PASSWORDS
(a partire da Android 14). Il problema riguarda la password.ISSUE_CATEGORY_PERSONAL_SAFETY
(a partire da Android 14). Il problema riguarda le informazioni personali dell'utente sicurezza.
- Elenco di
Action
elementi che l'utente può utilizzare per questo problema, ciascunoAction
istanza composta da:- Identificatore univoco
String
obbligatorio - Etichetta
CharSequence
obbligatoria - Obbligatorie
PendingIntent
reindirizzare l'utente a un'altra pagina o elaborare l'azione direttamente da schermata Centro per la sicurezza online - Variabile booleana facoltativa per specificare se il problema può essere risolto direttamente da
schermata Centro sicurezza (l'impostazione predefinita è
false
) - Messaggio di riuscita di
CharSequence
, facoltativo, da mostrare all'utente quando il problema viene risolto direttamente dal Centro per la sicurezza online. schermata
- Identificatore univoco
- Facoltativo
PendingIntent
viene chiamato quando l'utente ignora il problema (l'impostazione predefinita è: "Niente è chiamato) - Identificatore del tipo di problema
String
obbligatorio; è un problema simile a questo ma non deve essere univoco e viene utilizzato per il logging String
facoltativo per l'ID di deduplicazione, consente di pubblicare lo stessoSafetySourceIssue
provenienti da fonti diverse e che lo mostrano solo una volta in UI presupponendo lo stessodeduplicationGroup
(a partire da Android 14). Se non specificato, il problema non viene mai deduplicatoCharSequence
(facoltativo) per il titolo dell'attribuzione. Questo è un testo che mostra da dove ha avuto origine la scheda di avviso (a partire da Android 14). Se non specificato, viene utilizzato il titolo dell'eventoSafetySourcesGroup
- Azioni facoltative per i problemi (a partire da Android 14)
che deve essere uno dei seguenti:
ISSUE_ACTIONABILITY_MANUAL
: l'utente deve risolvere questo problema manualmente. Questa è l'impostazione predefinita.ISSUE_ACTIONABILITY_TIP
: Questo problema è solo un suggerimento e potrebbe non richiedere qualsiasi input utente.ISSUE_ACTIONABILITY_AUTOMATIC
: questo problema è già stato risolto e potrebbero non richiedere alcun input dell'utente.
- Comportamento facoltativo delle notifiche (a partire da Android
14), che deve essere uno dei seguenti:
NOTIFICATION_BEHAVIOR_UNSPECIFIED
: il Centro per la sicurezza online deciderà se un è necessaria una notifica per la scheda di avviso. Questa è l'impostazione predefinita.NOTIFICATION_BEHAVIOR_NEVER
: non viene pubblicata nessuna notifica.NOTIFICATION_BEHAVIOR_DELAYED
: viene pubblicata una notifica da un po' di tempo dopo la prima segnalazione del problema.NOTIFICATION_BEHAVIOR_IMMEDIATELY
: viene pubblicata una notifica non appena viene segnalato il problema.
Notification
facoltativa, per mostrare una notifica personalizzata con la scheda di avviso (A partire da Android 14). Se non specificato, il parametroNotification
deriva dalla scheda di avviso. Composto da:- Titolo
CharSequence
obbligatorio - Riepilogo
CharSequence
obbligatorio - Elenco di
Action
elementi che l'utente può utilizzare per questa notifica
- Titolo
- Invarianti:
- L'elenco di
Action
istanze deve essere composto da azioni con valori identificatori - L'elenco di istanze
Action
deve contenere una o due istanzeAction
elementi. Se l'azione non èISSUE_ACTIONABILITY_MANUAL
, con zeroAction
è consentito. - L'istanza OnIgnora
PendingIntent
non deve aprire un'istanzaActivity
- Requisiti aggiuntivi imposti dalla configurazione API
- L'elenco di
I dati vengono forniti al Centro per la sicurezza online su determinati eventi, quindi è necessario
specificare il motivo per cui l'origine ha fornito a SafetySourceData
un
SafetyEvent
istanza.
SafetyEvent
- Tipo obbligatorio, che deve essere uno dei seguenti:
SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
: lo stato dell'origine è è cambiato.SAFETY_EVENT_TYPE_REFRESH_REQUESTED
: risposta a un aggiornamento/una nuova scansione segnale dal Centro per la sicurezza online; usa questo invece diSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
affinché il Centro per la sicurezza online possa tenere traccia della richiesta di aggiornamento/nuova scansione.SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
: abbiamo risoltoSafetySourceIssue.Action
direttamente dalla schermata del Centro per la sicurezza online. utilizzare questo anzichéSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
per la sicurezza Center per poter monitorareSafetySourceIssue.Action
in fase di risoluzione.SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
: abbiamo tentato di risolvere il problemaSafetySourceIssue.Action
direttamente dalla schermata del Centro per la sicurezza online, ma non è riuscito a farlo; usa questo invece diSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
affinché il Centro per la sicurezza online possa tracciaSafetySourceIssue.Action
non riuscita.SAFETY_EVENT_TYPE_DEVICE_LOCALE_CHANGED
: la lingua del dispositivo è cambiato, quindi stiamo aggiornando il testo dei dati forniti; è che possono utilizzareSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
a questo scopo.SAFETY_EVENT_TYPE_DEVICE_REBOOTED
: forniamo questi dati nell'ambito di un avvio iniziale, poiché i dati del Centro per la sicurezza online non sono resi persistenti su si riavvia. è consentito utilizzareSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
per questo scopo.
- Identificatore facoltativo
String
per l'ID trasmissione di aggiornamento. - Identificatore facoltativo
String
per l'istanzaSafetySourceIssue
che ottiene risolto. - Identificatore facoltativo
String
per l'istanzaSafetySourceIssue.Action
essere risolto. - Invarianti:
- È necessario fornire l'ID trasmissione di aggiornamento se il tipo è
SAFETY_EVENT_TYPE_REFRESH_REQUESTED
- Gli ID problema e azione devono essere forniti se il tipo è
SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
oSAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
- È necessario fornire l'ID trasmissione di aggiornamento se il tipo è
Di seguito è riportato un esempio di come una fonte potrebbe fornire dati al Centro per la sicurezza online (in questo caso stia fornendo una voce con un'unica scheda di avviso):
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);
Recupera gli ultimi dati forniti
Puoi recuperare gli ultimi dati forniti al Centro per la sicurezza online per una fonte di proprietà del tuo
dell'app. Puoi utilizzarlo per visualizzare qualcosa nella tua UI, per verificare se i dati
deve essere aggiornato prima di eseguire un'operazione costosa o per fornire
stessa istanza SafetySourceData
al Centro per la sicurezza online con alcune modifiche o con un
nuova istanza SafetyEvent
. È utile anche per i test.
Usa questo codice per recuperare gli ultimi dati forniti al Centro per la sicurezza online:
SafetySourceData lastDataProvided =
safetyCenterManager.getSafetySourceData("MySourceId");
Segnalare un errore
Se non riesci a raccogliere i dati di SafetySourceData
, puoi segnalare l'errore al team di sicurezza
Center, che cambia la voce in grigio, cancella i dati memorizzati nella cache e fornisce una
con un messaggio simile a Impossibile verificare l'impostazione. Puoi anche segnalare un errore se
un'istanza di SafetySourceIssue.Action
non viene risolta, nel qual caso
i dati memorizzati nella cache non vengono cancellati e la voce dell'interfaccia utente non viene modificata; ma un messaggio è
mostrati all'utente per informarlo che si è verificato un problema.
Puoi fornire l'errore utilizzando SafetySourceErrorDetails
, che è composto
di:
SafetySourceErrorDetails
: istanzaSafetyEvent
obbligatoria:
// 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);
Rispondere a una richiesta di aggiornamento o nuova scansione
Puoi ricevere un segnale dal Centro per la sicurezza online per fornire nuovi dati. Rispondere a un la richiesta di aggiornamento o nuova scansione assicura che l'utente visualizzi lo stato corrente quando aprire il Centro per la sicurezza online e toccare il pulsante di scansione.
A questo scopo, si riceve una trasmissione con la seguente azione:
ACTION_REFRESH_SAFETY_SOURCES
- Valore stringa:
android.safetycenter.action.REFRESH_SAFETY_SOURCES
- Si attiva quando il Centro per la sicurezza online invia una richiesta di aggiornamento dei dati di la fonte di sicurezza per una determinata app
- Intent protetto che può essere inviato solo dal sistema
- Inviato a tutte le fonti di sicurezza nel file di configurazione come esplicito
e richiede l'autorizzazione
SEND_SAFETY_CENTER_UPDATE
- Valore stringa:
In questa trasmissione sono inclusi i seguenti extra:
EXTRA_REFRESH_SAFETY_SOURCE_IDS
- Valore stringa:
android.safetycenter.extra.REFRESH_SAFETY_SOURCE_IDS
- Il tipo di array di stringhe (
String[]
) rappresenta gli ID origine per i quali aggiornare l'app in questione
- Valore stringa:
EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE
- Valore stringa:
android.safetycenter.extra.REFRESH_SAFETY_SOURCES_REQUEST_TYPE
- Tipo intero, rappresenta una richiesta di tipo
@IntDef
- Deve essere uno dei seguenti:
EXTRA_REFRESH_REQUEST_TYPE_GET_DATA
: richiede l'origine a Fornire i dati in modo relativamente rapido, in genere quando l'utente apre la paginaEXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA
: richiede la fonte di fornire dati il più aggiornati possibile, in genere quando l'utente preme il pulsante Nuova scansione
- Valore stringa:
EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID
- Valore stringa:
android.safetycenter.extra.REFRESH_SAFETY_SOURCES_BROADCAST_ID
- Tipo di stringa, che rappresenta un identificatore univoco per l'aggiornamento richiesto
- Valore stringa:
Per ricevere un segnale dal Centro per la sicurezza online, implementa una
BroadcastReceiver
in esecuzione in un'istanza Compute Engine. La trasmissione viene inviata con l'elemento BroadcastOptions
speciale che consente
per avviare un servizio in primo piano.
BroadcastReceiver
risponde a una richiesta di aggiornamento:
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;
}
}
La stessa istanza di BroadcastReceiver
nell'esempio precedente è dichiarata in
AndroidManifest.xml
:
<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>
Idealmente, una fonte del Centro per la sicurezza online sia implementata in modo tale da chiamare
SafetyCenterManager
quando i relativi dati cambiano. Per motivi di integrità del sistema,
consiglia di rispondere solo al segnale di nuova scansione (quando l'utente tocca il pulsante
pulsante) e non quando l'utente apre il Centro per la sicurezza online. Se questa funzionalità è
obbligatorio, il campo refreshOnPageOpenAllowed="true"
del file di configurazione
deve essere impostato per consentire alla sorgente di ricevere la trasmissione pubblicata in questi casi.
Rispondere al Centro per la sicurezza online (se attivato o disattivato)
Puoi rispondere a quando il Centro per la sicurezza online viene attivato o disattivato utilizzando questo azione intenzionale:
ACTION_SAFETY_CENTER_ENABLED_CHANGED
- Valore stringa:
android.safetycenter.action.SAFETY_CENTER_ENABLED_CHANGED
- Si attiva quando il Centro per la sicurezza online viene attivato o disattivato mentre dispositivo in esecuzione
- Non chiamato all'avvio (usa
ACTION_BOOT_COMPLETED
per questo) - Intent protetto che può essere inviato solo dal sistema
- Inviato a tutte le fonti di sicurezza nel file di configurazione come esplicito
per intent, richiede l'autorizzazione
SEND_SAFETY_CENTER_UPDATE
- Inviato come intent implicito che richiede l'elemento
READ_SAFETY_CENTER_STATUS
. autorizzazione
- Valore stringa:
Questa azione intent è utile per attivare o disattivare le funzionalità correlate a: Centro per la sicurezza online sul dispositivo.
Implementa le azioni di risoluzione
Un'azione di risoluzione è un'istanza SafetySourceIssue.Action
che un utente può
risolvere il problema direttamente dalla schermata del Centro per la sicurezza online. L'utente tocca un pulsante di azione.
e l'istanza PendingIntent
su SafetySourceIssue.Action
inviata
viene attivata la fonte di sicurezza, che risolve il problema in background
invia una notifica al Centro per la sicurezza online al termine dell'operazione.
Per implementare le azioni di risoluzione, la fonte del Centro per la sicurezza online può utilizzare un servizio se
L'operazione dovrebbe richiedere del tempo (PendingIntent.getService
) o
broadcast receiver (PendingIntent.getBroadcast
).
Usa questo codice per inviare un problema al Centro per la sicurezza online:
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
risolve l'azione:
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).
}
}
La stessa istanza di BroadcastReceiver
nell'esempio precedente è dichiarata in
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>
Rispondere alla chiusura di un problema
Puoi specificare un'istanza PendingIntent
che può essere attivata quando viene eseguita una
SafetySourceIssue
istanza è stata ignorata. Il Centro per la sicurezza online gestisce questo problema
rifiuti:
- Se una fonte invia un problema, un utente può ignorarlo nel Centro per la sicurezza online schermo toccando il pulsante Ignora (un pulsante X nella scheda di avviso).
- Quando un utente ignora un problema, se il problema persiste, non verrà mostrato. di nuovo nella UI.
- Le chiusure permanenti su un disco rimangono durante i riavvii del dispositivo.
- Se la fonte del Centro per la sicurezza online non segnala più un problema e poi fornisce di nuovo in un secondo momento, il problema si ripresenta. Ciò consente di situazioni in cui un utente vede un avviso, lo ignora e in seguito esegue un'azione per dovrebbe risolvere il problema, ma poi l'utente fa nuovamente qualcosa che causa un problema simile. A questo punto, la scheda di avviso dovrebbe riapparire.
- Le schede di avviso gialle e rosse riappaiono ogni 180 giorni, a meno che l'utente non abbia li ha ignorati più volte.
L'origine non dovrebbe richiedere ulteriori comportamenti, a meno che:
- L'origine cerca di implementare questo comportamento in modo diverso, ad esempio, mai risolvere il problema.
- La sorgente tenta di utilizzarlo come callback, ad esempio, per registrare informazioni.
Fornisci dati per più utenti/profili
L'API SafetyCenterManager
può essere utilizzata tra più utenti e profili. Per ulteriori informazioni
consulta la sezione Building Multiuser-Aware
App. Context
che fornisce SafetyCenterManager
è associato a un UserHandle
dell'istanza, quindi l'istanza SafetyCenterManager
restituita interagisce con
Centro per la sicurezza online per l'istanza UserHandle
. Per impostazione predefinita, il valore di Context
è
associate all'utente in esecuzione, ma è possibile creare un'istanza
a un altro utente se l'app contiene INTERACT_ACROSS_USERS
e
Autorizzazioni INTERACT_ACROSS_USERS_FULL
. Questo esempio mostra come fare una chiamata
tra utenti/profili:
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
Ogni utente sul dispositivo può avere più profili gestiti. Centro per la sicurezza online fornisce dati diversi per ogni utente, ma unisce i dati di tutte le profili associati a un determinato utente.
Se nel file di configurazione è impostata l'opzione profile="all_profiles"
per l'origine,
si verifica quanto segue:
- È presente una voce UI per l'utente (principale del profilo) e tutte le relative voci
profili gestiti (che utilizzano istanze
titleForWork
). L'indicatore di aggiornamento o nuova scansione viene inviato per il genitore del profilo e per tutti i e i profili gestiti associati. Il ricevitore associato viene avviato per ogni profilo e può fornire i dati associati direttamente
SafetyCenterManager
senza dover effettuare una chiamata tra più profili, a meno che non venga ricevitore o l'appsingleUser
L'origine dovrebbe fornire dati per l'utente e tutti i suoi dati gestiti profili. I dati per ogni voce nell'interfaccia utente potrebbero essere diversi a seconda profilo.
Test
puoi accedere a ShadowSafetyCenterManager
e utilizzarlo in un test robotico.
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);
}
Puoi scrivere altri test end-to-end (E2E), ma questo non rientra nell'ambito di questo guida. Per ulteriori informazioni sulla scrittura di questi test E2E, consulta Test CTS (CtsSafetyCenterTestCases)
API interne e di test
Le API interne e le API di test sono per uso interno, pertanto non sono descritte in questa guida. Tuttavia, in futuro potremmo estendere alcune API interne per consentire agli OEM di creare la propria UI. Aggiorneremo questa guida per fornire e indicazioni su come utilizzarli.
Autorizzazioni
MANAGE_SAFETY_CENTER
internal|installer|role
- Utilizzato per le API interne del Centro per la sicurezza online
- Concesso solo a PermissionController e alla shell
App Impostazioni
Reindirizzamento al Centro per la sicurezza online
Per impostazione predefinita, il Centro per la sicurezza online è accessibile tramite l'app Impostazioni con una nuova Sicurezza e privacy. Se utilizzi un'app Impostazioni diversa o se hai modificato l'app Impostazioni, potresti dover personalizzare il modo in cui il Centro per la sicurezza online a cui si accede.
Quando il Centro per la sicurezza online è attivo:
- La voce precedente Privacy è nascosta codice
- La voce Sicurezza legacy è nascosta codice
- Novità Sicurezza e privacy aggiunta codice
- Novità Sicurezza e la voce sulla privacy reindirizza al codice del Centro per la sicurezza online
android.settings.PRIVACY_SETTINGS
eandroid.settings.SECURITY_SETTINGS
le azioni intent vengono reindirizzate al Centro per la sicurezza online aperto (codice: sicurezza, privacy)
Pagine avanzate sulla sicurezza e la privacy
L'app Impostazioni contiene impostazioni aggiuntive in Altre impostazioni di sicurezza e Altre impostazioni della privacy, disponibili nel Centro per la sicurezza online:
Codice di sicurezza avanzato
Codice privacy avanzato
A partire da Android 14, le funzionalità delle impostazioni avanzate della privacy sono riunite in un unico elenco privacy" pagina con azione intent
"com.android.settings.MORE_SECURITY_PRIVACY_SETTINGS"
Fonti di sicurezza
Il Centro per la sicurezza online si integra con un insieme specifico di fonti di sicurezza fornite dal App Impostazioni:
- Una fonte di sicurezza nella schermata di blocco verifica che sia stata configurata una schermata di blocco con un passcode (o altri metodi di sicurezza), per garantire che le informazioni private dell'utente è protetto da accessi esterni.
- Una fonte di sicurezza biometrica (nascosta per impostazione predefinita) viene visualizzata per l'integrazione con sensore di impronte digitali o di riconoscimento facciale.
Il codice sorgente di queste fonti del Centro per la sicurezza online è accessibile tramite Android codice ricerca. Se l'app Impostazioni non viene modificata (il nome del pacchetto non viene modificato, codice sorgente o il codice sorgente che si occupa di schermata di blocco e biometria), questa integrazione dovrebbe funzionare subito. Altrimenti, alcune modifiche potrebbe essere necessario cambiare il file di configurazione per cambiare il pacchetto il nome dell'app Impostazioni e le fonti che si integrano con il Centro per la sicurezza online, come così come l'integrazione. Per ulteriori informazioni, consulta Aggiornamento della configurazione file e integrazione impostazioni.
Informazioni su PendingIntent
Se utilizzi l'integrazione esistente del Centro per la sicurezza online dell'app Impostazioni in Android 14 o versioni successive, il bug descritto di seguito è stato risolto. In questo caso non è necessario leggere questa sezione.
Quando hai la certezza che il bug non esista, imposta una risorsa booleana XML
di configurazione nell'app Impostazioni
config_isSafetyCenterLockScreenPendingIntentFixed
a true
per disattivare
soluzione alternativa nel Centro per la sicurezza online.
Soluzione alternativa PendingIntent
Questo bug è causato dal fatto che le impostazioni utilizzano gli extra di Intent
istanza per determinare quale
del frammento da aprire. Perché Intent#equals
non utilizza l'istanza Intent
per gli extra, l'istanza PendingIntent
per l'icona del menu a forma di ingranaggio e
vengono considerate uguali e consentono di accedere alla stessa UI (anche se sono
per passare a un'altra UI). Questo problema è stato risolto in una release QPR da
differenziando le istanze PendingIntent
per codice di richiesta. In alternativa,
questo potrebbe essere differenziato utilizzando Intent#setId
.
Fonti di sicurezza interne
Alcune fonti del Centro per la sicurezza online sono interne e sono implementate nel App di sistema PermissionController all'interno del modulo PermissionController. Questi le fonti si comportano come le normali fonti del Centro per la sicurezza online e non ricevono informazioni trattamento. Il codice per queste sorgenti è disponibile tramite Codice Android ricerca.
Si tratta principalmente di indicatori relativi alla privacy, ad esempio:
- Accessibilità
- Revoca automaticamente le app inutilizzate
- Accesso alla posizione
- Listener di notifica
- Informazioni sulle norme di lavoro