Alihkan ke Pusat Keamanan
Semua aplikasi dapat membuka Pusat Keamanan menggunakan
Tindakan android.content.Intent.ACTION_SAFETY_CENTER
(nilai string
android.intent.action.SAFETY_CENTER
).
Untuk membuka Pusat Keamanan, lakukan panggilan dari dalam instance Activity
:
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);
startActivity(openSafetyCenterIntent);
Mengalihkan ke masalah tertentu
Anda juga dapat mengalihkan ke kartu peringatan Pusat Keamanan tertentu menggunakan
tambahan intent tertentu. Tambahan ini tidak dimaksudkan untuk
digunakan oleh pihak ketiga jadi
itu adalah bagian dari SafetyCenterManager
, yang merupakan bagian dari @SystemApi
. Hanya
aplikasi sistem dapat
mengakses tambahan ini.
Tambahan intent yang mengalihkan kartu peringatan tertentu:
EXTRA_SAFETY_SOURCE_ID
- Nilai string:
android.safetycenter.extra.SAFETY_SOURCE_ID
- Jenis string: Menentukan ID sumber keamanan dari elemen kartu peringatan
- Wajib agar pengalihan ke masalah dapat berfungsi
- Nilai string:
EXTRA_SAFETY_SOURCE_ISSUE_ID
- Nilai string:
android.safetycenter.extra.SAFETY_SOURCE_ISSUE_ID
- Jenis string: Menentukan ID kartu peringatan
- Wajib agar pengalihan ke masalah dapat berfungsi
- Nilai string:
EXTRA_SAFETY_SOURCE_USER_HANDLE
- Nilai string:
android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE
- Jenis
UserHandle
: MenentukanUserHandle
untuk peringatan terkait kartu - Opsional (default-nya adalah pengguna saat ini)
- Nilai string:
Cuplikan kode di bawah ini dapat digunakan dari dalam instance Activity
untuk membuka
layar Pusat Keamanan untuk masalah tertentu:
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);
Mengalihkan ke subhalaman tertentu (Mulai Android 14)
Di Android 14 atau yang lebih baru, halaman Pusat Keamanan dibagi
menjadi beberapa subhalaman yang mewakili SafetySourcesGroup
yang berbeda (di
Android 13, ditampilkan sebagai entri yang dapat diciutkan).
Anda dapat mengalihkan ke subhalaman spesifik menggunakan ekstra intent ini:
EXTRA_SAFETY_SOURCES_GROUP_ID
- Nilai string:
android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID
- Jenis string: Menentukan ID
SafetySourcesGroup
- Wajib agar pengalihan ke subhalaman berfungsi
- Nilai string:
Cuplikan kode di bawah ini dapat digunakan dari dalam instance Activity
untuk membuka
ke layar Pusat Keamanan ke subhalaman tertentu:
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID, "TheSafetySourcesGroupId");
startActivity(openSafetyCenterIntent);
Menggunakan API sumber Pusat Keamanan
API sumber Pusat Keamanan tersedia menggunakan
SafetyCenterManager
(yaitu @SystemApi
). Kode untuk platform API tersedia di
Kode
Telusuri.
Kode implementasi API tersedia di Kode
Telusuri.
Izin
API sumber Pusat Keamanan hanya dapat diakses oleh aplikasi sistem yang telah masuk daftar yang diizinkan menggunakan izin yang tercantum di bawah ini. Untuk informasi tambahan, lihat Hak istimewa Pemberian Izin yang Diizinkan.
READ_SAFETY_CENTER_STATUS
signature|privileged
- Digunakan untuk
SafetyCenterManager#isSafetyCenterEnabled()
API (bukan yang diperlukan untuk sumber Pusat Keamanan, mereka hanya memerlukanSEND_SAFETY_CENTER_UPDATE
) - Digunakan oleh aplikasi sistem yang memeriksa apakah Pusat Keamanan diaktifkan atau tidak
- Hanya diberikan ke aplikasi sistem yang diizinkan
SEND_SAFETY_CENTER_UPDATE
internal|privileged
- Digunakan untuk API yang diaktifkan dan Safety Sources API
- Hanya digunakan oleh sumber keamanan
- Hanya diberikan ke aplikasi sistem yang diizinkan
Izin-izin ini diberi hak istimewa dan Anda dapat
memperolehnya hanya dengan menambahkannya ke
file yang relevan, misalnya,
com.android.settings.xml
untuk aplikasi Setelan, dan ke file AndroidManifest.xml
aplikasi. Lihat
protectionLevel
untuk informasi selengkapnya
tentang model izin.
Mendapatkan SafetyCenterManager
SafetyCenterManager
adalah class @SystemApi
yang dapat diakses dari aplikasi sistem
mulai Android 13. Panggilan ini menunjukkan cara
dapatkan 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;
}
Periksa apakah Pusat Keamanan diaktifkan
Panggilan ini memeriksa apakah Pusat Keamanan diaktifkan. Panggilan memerlukan
Izin READ_SAFETY_CENTER_STATUS
atau SEND_SAFETY_CENTER_UPDATE
:
boolean isSafetyCenterEnabled = safetyCenterManager.isSafetyCenterEnabled();
if (isSafetyCenterEnabled) {
// …
} else {
// …
}
Menyediakan data
Data sumber Pusat Keamanan dengan String sourceId
tertentu diberikan untuk Keselamatan
Pusatkan dengan objek SafetySourceData
, yang mewakili entri UI dan
daftar masalah (kartu peringatan). Entri UI dan kartu peringatan dapat memiliki
berbagai tingkat keparahan yang ditentukan dalam class SafetySourceData
:
SEVERITY_LEVEL_UNSPECIFIED
- Tidak ada tingkat keparahan yang ditentukan
- Warna: Abu-abu atau transparan (bergantung pada
SafetySourcesGroup
entri) - Digunakan untuk data dinamis yang tampil sebagai entri statis di UI atau untuk ditampilkan entri yang belum ditentukan
- Tidak boleh digunakan untuk kartu peringatan
SEVERITY_LEVEL_INFORMATION
- Informasi dasar atau saran kecil
- Warna: Green
SEVERITY_LEVEL_RECOMMENDATION
- Rekomendasi agar pengguna mengambil tindakan terhadap masalah ini, karena masalah ini dapat membahayakan mereka
- Warna: Kuning
SEVERITY_LEVEL_CRITICAL_WARNING
- Peringatan penting bahwa pengguna harus mengambil tindakan terhadap masalah ini, karena menimbulkan risiko
- Warna: Red
SafetySourceData
Objek SafetySourceData
terdiri dari entri UI, kartu peringatan, dan
dan invarian.
- Instance
SafetySourceStatus
opsional (entri UI) - Daftar instance
SafetySourceIssue
(kartu peringatan) - Tambahan
Bundle
opsional (Mulai 14) - Invarian:
- Daftar
SafetySourceIssue
harus terdiri dari masalah terkait pengenal. - Instance
SafetySourceIssue
tidak boleh lebih penting dariSafetySourceStatus
jika ada (kecuali jikaSafetySourceStatus
SEVERITY_LEVEL_UNSPECIFIED
, dalam hal iniSEVERITY_LEVEL_INFORMATION
masalah diizinkan). - Persyaratan tambahan yang diberlakukan oleh konfigurasi API harus dipenuhi,
misalnya, jika sumbernya hanya masalah, sumber tidak boleh memberikan
Instance
SafetySourceStatus
.
- Daftar
SafetySourceStatus
CharSequence
judul wajib diisi- Ringkasan
CharSequence
yang diperlukan - Tingkat keparahan yang diperlukan
- Opsional
PendingIntent
untuk mengalihkan pengguna ke halaman yang tepat (default-nya menggunakanintentAction
dari konfigurasi, jika ada) IconAction
opsional (ditampilkan sebagai ikon samping pada entri) yang terdiri dari:- Jenis ikon yang diperlukan, yang harus berupa salah satu jenis berikut:
ICON_TYPE_GEAR
: Ditampilkan sebagai roda gigi di samping entri UIICON_TYPE_INFO
: Ditampilkan sebagai ikon informasi di samping entri UI
- Wajib diisi
PendingIntent
untuk mengalihkan pengguna ke halaman lain
- Jenis ikon yang diperlukan, yang harus berupa salah satu jenis berikut:
- Nilai
enabled
boolean opsional yang memungkinkan penandaan entri UI sebagai dinonaktifkan, sehingga tidak dapat diklik (default-nya adalahtrue
) - Invarian:
- Instance
PendingIntent
harus membuka instanceActivity
. - Jika dinonaktifkan, entri harus ditetapkan
SEVERITY_LEVEL_UNSPECIFIED
. - Persyaratan tambahan yang diberlakukan oleh konfigurasi API.
- Instance
SafetySourceIssue
- ID unik
String
yang diperlukan CharSequence
judul wajib diisi- Subtitel
CharSequence
opsional - Ringkasan
CharSequence
yang diperlukan - Tingkat keparahan yang diperlukan
- Kategori masalah opsional, yang harus berupa salah satu dari:
ISSUE_CATEGORY_DEVICE
: Masalah ini memengaruhi perangkat pengguna.ISSUE_CATEGORY_ACCOUNT
: Masalah ini memengaruhi akun pengguna.ISSUE_CATEGORY_GENERAL
: Masalah ini memengaruhi keselamatan umum pengguna. Ini adalah defaultnya.ISSUE_CATEGORY_DATA
(Mulai Android 14): Masalah tersebut memengaruhi data pengguna.ISSUE_CATEGORY_PASSWORDS
(Memulai Android 14): Masalah ini memengaruhi preferensi pengguna {i>password<i}.ISSUE_CATEGORY_PERSONAL_SAFETY
(Memulai Android 14): Masalah ini memengaruhi ciri-ciri pribadi pengguna keamanan.
- Daftar elemen
Action
yang dapat diambil pengguna untuk masalah ini, masing-masing InstanceAction
terdiri dari:- ID unik
String
yang diperlukan - Label
CharSequence
wajib diisi - Wajib diisi
PendingIntent
untuk mengalihkan pengguna ke halaman lain atau memproses tindakan langsung dari layar Pusat Keamanan - Boolean opsional untuk menentukan apakah masalah ini dapat diselesaikan secara langsung dari
layar Pusat Keamanan (default-nya adalah
false
) - Pesan berhasil
CharSequence
opsional, yang akan ditampilkan kepada pengguna jika masalah berhasil diselesaikan langsung dari Pusat Keamanan layar
- ID unik
- Opsional
PendingIntent
yang dipanggil saat pengguna menutup masalah ({i>default-<i}nya adalah dipanggil) - ID jenis masalah
String
yang diperlukan; ini mirip dengan masalah tetapi tidak harus unik dan digunakan untuk logging String
opsional untuk ID penghapusan duplikat, ini memungkinkan postingan yang samaSafetySourceIssue
dari berbagai sumber dan hanya menampilkannya sekali dalam UI dengan asumsi mereka memilikideduplicationGroup
yang sama (Memulai Android 14.) Jika tidak ditentukan, masalah tidak akan pernah dihapus duplikatnyaCharSequence
opsional untuk judul atribusi, ini adalah teks yang ditampilkan tempat kartu peringatan berasal (Memulai Android 14.) Jika tidak ditentukan, gunakan judulSafetySourcesGroup
- Kemampuan untuk ditindaklanjuti masalah opsional (Mulai Android 14),
yang harus berupa salah satu dari:
ISSUE_ACTIONABILITY_MANUAL
: Pengguna harus menyelesaikan masalah ini secara manual Ini adalah defaultnya.ISSUE_ACTIONABILITY_TIP
: Masalah ini hanyalah tips dan mungkin tidak memerlukan input pengguna apa pun.ISSUE_ACTIONABILITY_AUTOMATIC
: Masalah ini telah ditindaklanjuti dan mungkin tidak memerlukan input pengguna.
- Perilaku notifikasi opsional (Memulai Android
14), yang harus berupa salah satu dari:
NOTIFICATION_BEHAVIOR_UNSPECIFIED
: Pusat Keamanan akan memutuskan apakah notifikasi diperlukan untuk kartu peringatan. Ini adalah defaultnya.NOTIFICATION_BEHAVIOR_NEVER
: Tidak ada notifikasi yang diposting.NOTIFICATION_BEHAVIOR_DELAYED
: Notifikasi diposting beberapa saat setelah masalah pertama kali dilaporkan.NOTIFICATION_BEHAVIOR_IMMEDIATELY
: Notifikasi diposting segera setelah masalah tersebut dilaporkan.
Notification
opsional, untuk menampilkan notifikasi kustom dengan kartu peringatan (Memulai Android 14). Jika tidak ditentukan,Notification
berasal dari kartu peringatan. Terdiri dari:CharSequence
judul wajib diisi- Ringkasan
CharSequence
yang diperlukan - Daftar elemen
Action
yang dapat diambil pengguna untuk notifikasi ini
- Invarian:
- Daftar instance
Action
harus terdiri dari tindakan dengan pengenal - Daftar instance
Action
harus berisi satu atau duaAction
yang kurang penting. Jika kemampuan tindak lanjut bukanISSUE_ACTIONABILITY_MANUAL
, memiliki nolAction
diperbolehkan. PendingIntent
OnDismiss tidak boleh membuka instanceActivity
- Persyaratan tambahan yang diberlakukan oleh konfigurasi API
- Daftar instance
Data diberikan terkait peristiwa tertentu ke Pusat Keamanan, jadi Anda harus
menentukan penyebab sumber menyediakan SafetySourceData
Instance SafetyEvent
.
SafetyEvent
- Jenis wajib, yang harus berupa salah satu dari:
SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
: Status sumber memiliki ubah.SAFETY_EVENT_TYPE_REFRESH_REQUESTED
: Merespons refresh/pemindaian ulang mendapatkan sinyal dari Pusat Keamanan; menggunakan ini daripadaSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
agar Pusat Keamanan dapat melacak permintaan refresh/pemindaian ulang.SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
: Kami telah menyelesaikanSafetySourceIssue.Action
langsung dari layar Pusat Keamanan; penggunaan ini alih-alihSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
untuk Keselamatan Center agar dapat melacakSafetySourceIssue.Action
yang diselesaikan.SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
: Kami mencoba menyelesaikanSafetySourceIssue.Action
langsung dari layar Pusat Keamanan, tetapi gagal melakukannya; menggunakan ini daripadaSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
agar Pusat Keamanan dapat trekSafetySourceIssue.Action
gagal.SAFETY_EVENT_TYPE_DEVICE_LOCALE_CHANGED
: Bahasa perangkat telah berubah, jadi kami memperbarui teks dari data yang disediakan; ini diizinkan menggunakanSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
untuk aktivitas ini.SAFETY_EVENT_TYPE_DEVICE_REBOOTED
: Kami memberikan data ini sebagai bagian booting awal karena data Pusat Keamanan tidak disimpan di melakukan {i>reboot<i}; Anda boleh menggunakanSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
untuk hal ini.
- ID
String
opsional untuk ID siaran refresh. - ID
String
opsional untuk instanceSafetySourceIssue
yang mendapatkan diselesaikan. - ID
String
opsional untuk instanceSafetySourceIssue.Action
menyelesaikan masalah. - Invarian:
- ID siaran pembaruan harus diberikan jika jenisnya
SAFETY_EVENT_TYPE_REFRESH_REQUESTED
- ID masalah dan tindakan harus diberikan jika jenisnya adalah
SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
atauSAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
- ID siaran pembaruan harus diberikan jika jenisnya
Berikut contoh bagaimana sumber dapat memberikan data ke Pusat Keamanan (dalam hal ini jika memberikan entri dengan satu kartu peringatan):
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);
Dapatkan data terakhir yang diberikan
Anda bisa mendapatkan data terakhir yang disediakan ke Pusat Keamanan untuk sumber yang dimiliki oleh
. Anda dapat menggunakannya untuk memunculkan sesuatu di UI Anda sendiri, untuk memeriksa apakah data
perlu diperbarui sebelum melakukan operasi yang mahal, atau untuk menyediakan
instance SafetySourceData
yang sama ke Pusat Keamanan dengan beberapa perubahan atau
instance SafetyEvent
baru. Hal ini juga berguna untuk pengujian.
Gunakan kode ini untuk mendapatkan data terakhir yang diberikan ke Pusat Keamanan:
SafetySourceData lastDataProvided =
safetyCenterManager.getSafetySourceData("MySourceId");
Melaporkan error
Jika Anda tidak dapat mengumpulkan data SafetySourceData
, Anda dapat melaporkan error ini ke bagian Keselamatan
, yang mengubah entri menjadi abu-abu, menghapus data yang di-cache, dan memberikan
mengirim pesan seperti Tidak dapat memeriksa setelan. Anda juga dapat melaporkan kesalahan jika
instance SafetySourceIssue.Action
gagal di-resolve, dalam hal ini
data yang di-cache tidak akan dihapus dan entri UI tidak diubah; tetapi sebuah pesan
ditampilkan kepada pengguna untuk memberi
tahu bahwa ada sesuatu yang salah.
Anda dapat menyertakan error menggunakan SafetySourceErrorDetails
, yang disusun
seperti:
SafetySourceErrorDetails
: InstanceSafetyEvent
yang diperlukan:
// 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);
Merespons permintaan refresh atau pemindaian ulang
Anda bisa mendapatkan sinyal dari Pusat Keamanan untuk memberikan data baru. Merespons permintaan pembaruan atau pemindaian ulang memastikan bahwa pengguna melihat status saat ini ketika membuka Pusat Keamanan dan saat mereka mengetuk tombol pindai.
Langkah ini dilakukan dengan menerima siaran dengan tindakan berikut:
ACTION_REFRESH_SAFETY_SOURCES
- Nilai string:
android.safetycenter.action.REFRESH_SAFETY_SOURCES
- Dipicu saat Pusat Keamanan mengirim permintaan untuk memperbarui data sumber keamanan untuk aplikasi tertentu
- Intent yang dilindungi yang hanya dapat dikirim oleh sistem
- Dikirim ke semua sumber keamanan dalam file konfigurasi sebagai eksplisit
dan memerlukan izin
SEND_SAFETY_CENTER_UPDATE
- Nilai string:
Tambahan berikut disediakan sebagai bagian dari siaran ini:
EXTRA_REFRESH_SAFETY_SOURCE_IDS
- Nilai string:
android.safetycenter.extra.REFRESH_SAFETY_SOURCE_IDS
- Jenis array string (
String[]
), mewakili ID sumber yang akan dimuat ulang aplikasi yang diberikan
- Nilai string:
EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE
- Nilai string:
android.safetycenter.extra.REFRESH_SAFETY_SOURCES_REQUEST_TYPE
- Jenis bilangan bulat, mewakili jenis permintaan
@IntDef
- Harus berupa salah satu dari:
EXTRA_REFRESH_REQUEST_TYPE_GET_DATA
: Meminta sumber untuk menyediakan data dengan relatif cepat, biasanya saat pengguna membuka halamanEXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA
: Meminta sumber untuk memberikan data terbaru, biasanya saat pengguna menekan tombol pindai ulang
- Nilai string:
EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID
- Nilai string:
android.safetycenter.extra.REFRESH_SAFETY_SOURCES_BROADCAST_ID
- Jenis string, mewakili ID unik untuk pembaruan yang diminta
- Nilai string:
Untuk mendapatkan sinyal dari Pusat Keamanan, terapkan
BroadcastReceiver
di instance Compute Engine. Siaran dikirim dengan BroadcastOptions
khusus yang memungkinkan
untuk memulai layanan latar depan.
BroadcastReceiver
merespons permintaan refresh:
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;
}
}
Instance BroadcastReceiver
yang sama dalam contoh di atas dideklarasikan di
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>
Idealnya, sumber Pusat Keamanan diimplementasikan sedemikian rupa sehingga memanggil
SafetyCenterManager
saat datanya berubah. Untuk alasan kesehatan sistem, kami
sarankan untuk hanya menanggapi sinyal pemindaian ulang (saat pengguna mengetuk pemindaian
bukan saat pengguna membuka Pusat Keamanan. Jika fungsi ini
wajib diisi, kolom refreshOnPageOpenAllowed="true"
di file konfigurasi
harus ditetapkan agar sumber dapat menerima siaran yang dikirimkan dalam kasus ini.
Respons Pusat Keamanan saat diaktifkan atau dinonaktifkan
Anda dapat merespons saat Pusat Keamanan diaktifkan atau dinonaktifkan dengan menggunakan intent:
ACTION_SAFETY_CENTER_ENABLED_CHANGED
- Nilai string:
android.safetycenter.action.SAFETY_CENTER_ENABLED_CHANGED
- Dipicu jika Pusat Keamanan diaktifkan atau dinonaktifkan saat perangkat sedang berjalan
- Tidak dipanggil saat booting (gunakan
ACTION_BOOT_COMPLETED
untuk itu) - Intent yang dilindungi yang hanya dapat dikirim oleh sistem
- Dikirim ke semua sumber keamanan dalam file konfigurasi sebagai eksplisit
intent, memerlukan izin
SEND_SAFETY_CENTER_UPDATE
- Dikirim sebagai intent implisit yang memerlukan
READ_SAFETY_CENTER_STATUS
izin
- Nilai string:
Tindakan intent ini berguna untuk mengaktifkan atau menonaktifkan fitur yang terkait dengan Pusat Keamanan di perangkat.
Mengimplementasikan tindakan penyelesaian
Tindakan penyelesaian adalah instance SafetySourceIssue.Action
yang dapat dilakukan pengguna
selesaikan langsung dari layar Pusat Keamanan. Pengguna mengetuk tombol tindakan
dan instance PendingIntent
di SafetySourceIssue.Action
yang dikirim oleh
sumber keamanan akan terpicu, yang menyelesaikan
masalah di latar belakang dan
memberi tahu Pusat Keamanan saat selesai.
Untuk menerapkan tindakan penyelesaian, sumber Pusat Keamanan dapat menggunakan layanan jika
operasi diperkirakan akan memerlukan waktu beberapa saat (PendingIntent.getService
) atau
penerima siaran (PendingIntent.getBroadcast
).
Gunakan kode ini untuk mengirim masalah penyelesaian ke Pusat Keamanan:
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
menyelesaikan tindakan:
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).
}
}
Instance BroadcastReceiver
yang sama dalam contoh di atas dideklarasikan di
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>
Menanggapi penutupan masalah
Anda dapat menentukan instance PendingIntent
yang dapat dipicu saat
Instance SafetySourceIssue
ditutup. Pusat Keamanan menangani masalah ini
penolakan:
- Jika sumber mendorong masalah, pengguna dapat menutupnya di Pusat Keamanan dengan mengetuk tombol singkirkan (tombol X pada kartu peringatan).
- Saat pengguna menutup masalah, masalah tersebut tidak akan muncul lagi di UI lagi.
- Penutupan persisten pada disk akan tetap ada selama reboot perangkat.
- Jika sumber Pusat Keamanan berhenti menampilkan masalah, lalu menyediakan masalah itu lagi di lain waktu, masalah tersebut akan muncul kembali. Hal ini untuk memungkinkan situasi ketika pengguna melihat peringatan, mengabaikannya, lalu mengambil tindakan seharusnya meringankan masalah, tetapi kemudian pengguna melakukan sesuatu yang menyebabkan masalah serupa. Pada tahap ini, kartu peringatan akan muncul kembali.
- Kartu peringatan kuning dan merah muncul kembali setiap 180 hari kecuali jika pengguna menutupnya berkali-kali.
Perilaku tambahan tidak akan diperlukan oleh sumber kecuali:
- Sumber mencoba menerapkan perilaku ini dengan cara yang berbeda, misalnya, tidak pernah memunculkan kembali masalahnya.
- Sumber mencoba menggunakan ini sebagai callback, misalnya, untuk mencatat log tidak akurat atau tidak sesuai.
Berikan data untuk beberapa pengguna/profil
SafetyCenterManager
API dapat digunakan di semua pengguna dan profil. Untuk selengkapnya
informasi tambahan, lihat Membangun Multiuser-Aware
Aplikasi. Context
objek yang menyediakan SafetyCenterManager
dikaitkan dengan UserHandle
sehingga instance SafetyCenterManager
yang ditampilkan berinteraksi dengan
Pusat Keamanan untuk instance UserHandle
tersebut. Secara default, Context
adalah
yang terkait dengan pengguna yang sedang berjalan, tetapi kita bisa membuat instance untuk
pengguna lain jika aplikasi menyimpan INTERACT_ACROSS_USERS
dan
Izin INTERACT_ACROSS_USERS_FULL
. Contoh ini menunjukkan cara melakukan panggilan
pada seluruh pengguna/profil:
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
Setiap pengguna di perangkat dapat memiliki beberapa profil terkelola. Pusat Keamanan menyediakan data berbeda untuk setiap pengguna, tetapi menggabungkan profil yang terkait dengan pengguna tertentu.
Jika profile="all_profiles"
ditetapkan untuk sumber dalam file konfigurasi,
hal berikut akan terjadi:
- Ada entri UI untuk pengguna (induk profil) dan semua yang terkait
profil terkelola (yang menggunakan instance
titleForWork
). Sinyal refresh atau pemindaian ulang dikirim untuk induk profil dan semua profil terkelola yang terkait. Penerima yang terkait akan dimulai untuk setiap dan dapat memberikan data terkait secara langsung kepada
SafetyCenterManager
tanpa harus melakukan panggilan antar-profil, kecuali jika penerima atau aplikasisingleUser
.Sumber diharapkan menyediakan data untuk pengguna dan semua data terkelola untuk profil. Data untuk setiap entri UI mungkin berbeda bergantung pada untuk profil.
Pengujian
Anda dapat mengakses ShadowSafetyCenterManager
dan menggunakannya dalam uji Robolectric.
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);
}
Anda dapat menulis lebih banyak pengujian {i>end-to-end<i} (E2E), tetapi hal itu di luar cakupan pengujian kami. Untuk informasi selengkapnya tentang cara menulis pengujian E2E ini, lihat Pengujian CTS (CtsSafetyCenterTestCases)
API pengujian dan internal
API internal dan API pengujian ditujukan untuk penggunaan internal sehingga tidak dijelaskan di dalam panduan ini. Namun, kami mungkin memperluas beberapa API internal di masa mendatang memungkinkan OEM membuat UI mereka sendiri dan kami akan memperbarui panduan ini untuk memberikan panduan tentang cara menggunakannya.
Izin
MANAGE_SAFETY_CENTER
internal|installer|role
- Digunakan untuk API Pusat Keamanan internal
- Hanya diberikan ke PermissionController dan shell
Aplikasi Setelan
Pengalihan Pusat Keamanan
Secara default, Pusat Keamanan diakses melalui aplikasi Setelan dengan Keamanan & privasi. Jika Anda menggunakan aplikasi {i>Settings<i} yang berbeda atau jika Anda telah mengubah aplikasi Setelan, Anda mungkin perlu menyesuaikan cara Pusat Keamanan diakses.
Jika Pusat Keamanan diaktifkan:
- Entri Privacy lama disembunyikan code
- Entri Security lama adalah code tersembunyi
- Baru Security & entri privacy ditambahkan code
- Baru Security & entri privacy dialihkan ke kode Pusat Keamanan
android.settings.PRIVACY_SETTINGS
danandroid.settings.SECURITY_SETTINGS
tindakan intent akan dialihkan ke membuka Pusat Keamanan (kode: keamanan, privasi)
Halaman keamanan dan privasi lanjutan
Aplikasi Setelan berisi setelan tambahan di bagian Setelan keamanan lainnya dan judul Setelan privasi lainnya, yang tersedia dari Pusat Keamanan:
Kode keamanan lanjutan
Kode privasi lanjutan
Mulai Android 14, keamanan tingkat lanjut dan halaman setelan privasi lanjutan digabungkan menjadi satu "Keamanan Lainnya & Privasi" halaman dengan tindakan intent
"com.android.settings.MORE_SECURITY_PRIVACY_SETTINGS"
Sumber keamanan
Pusat Keamanan terintegrasi dengan serangkaian sumber keamanan khusus yang disediakan oleh Aplikasi Pengaturan:
- Sumber keamanan layar kunci memverifikasi bahwa layar kunci telah disiapkan dengan kode sandi (atau keamanan lainnya), untuk memastikan bahwa informasi pribadi pengguna tetap aman dari akses eksternal.
- Sumber keamanan biometrik (tersembunyi secara default) untuk diintegrasikan dengan sidik jari atau sensor wajah.
Kode sumber untuk sumber Pusat Keamanan ini dapat diakses melalui Android kode melakukan penelusuran. Jika aplikasi Setelan tidak diubah (perubahan tidak dilakukan pada nama paket, dari kode sumber atau kode sumber yang berhubungan dengan layar kunci dan biometrik), maka integrasi ini akan bekerja secara langsung. Atau, beberapa modifikasi mungkin diperlukan seperti mengubah file konfigurasi untuk mengubah paket nama aplikasi Setelan dan sumber yang terintegrasi dengan Pusat Keamanan, seperti serta integrasinya. Untuk informasi selengkapnya, lihat Memperbarui konfigurasi file dan integrasi setelan.
Tentang PendingIntent
Jika Anda mengandalkan integrasi Pusat Keamanan aplikasi Setelan yang ada di Android 14 atau yang lebih baru, bug yang dijelaskan di bawah telah diperbaiki. Dalam kasus ini, bagian ini tidak perlu dibaca.
Setelah Anda yakin bahwa bug tidak ada, tetapkan resource boolean XML
nilai konfigurasi di aplikasi Settings
config_isSafetyCenterLockScreenPendingIntentFixed
ke true
untuk menonaktifkan
solusi alternatif dalam Pusat Keamanan.
Solusi PendingIntent
Bug ini disebabkan oleh Setelan yang menggunakan tambahan instance Intent
untuk menentukan
fragmen untuk dibuka. Karena Intent#equals
tidak mengambil instance Intent
tambahan, instance PendingIntent
untuk ikon menu roda gigi dan
entri dianggap sama dan menavigasi ke UI yang sama (meskipun keduanya
yang ditujukan untuk menavigasi ke UI yang berbeda). Masalah ini telah diperbaiki dalam rilis QPR oleh
membedakan instance PendingIntent
berdasarkan kode permintaan. Sebagai alternatif,
dapat dibedakan menggunakan Intent#setId
.
Sumber keamanan internal
Beberapa sumber Pusat Keamanan bersifat internal dan diimplementasikan dalam Aplikasi sistem PermissionController di dalam modul PermissionController. Ini berfungsi seperti sumber Pusat Keamanan reguler dan tidak menerima perlakuan. Kode untuk sumber ini tersedia melalui kode Android melakukan penelusuran.
Hal ini utamanya adalah sinyal privasi, misalnya:
- Aksesibilitas
- Cabut otomatis aplikasi yang tidak digunakan
- Akses lokasi
- Pendengar pemberitahuan
- Info kebijakan kerja