Güvenlik Merkezi'ne yönlendir
Herhangi bir uygulama, Güvenlik Merkezi'ni şunu kullanarak açabilir:
android.content.Intent.ACTION_SAFETY_CENTER
işlemi (dize değeri
android.intent.action.SAFETY_CENTER
) tıklayın.
Güvenlik Merkezi'ni açmak için bir Activity
örneğinden arama yapın:
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);
startActivity(openSafetyCenterIntent);
Belirli bir soruna yönlendir
Alternatif olarak,
özel amaç ekstraları. Bu ekstra özellikler, üçüncü taraflarca kullanılmak üzere tasarlanmamıştır.
bunlar @SystemApi
bünyesindeki SafetyCenterManager
içinde yer alıyor. Yalnızca
sistem uygulamaları bu ek özelliklere erişebilir.
Belirli bir uyarı kartına yönlendiren intent ekstraları:
EXTRA_SAFETY_SOURCE_ID
- Dize değeri:
android.safetycenter.extra.SAFETY_SOURCE_ID
- Dize türü: İlişkili öğenin güvenlik kaynağının kimliğini belirtir uyarı kartı
- Sorunun yönlendirilmesinin çalışması için zorunludur.
- Dize değeri:
EXTRA_SAFETY_SOURCE_ISSUE_ID
- Dize değeri:
android.safetycenter.extra.SAFETY_SOURCE_ISSUE_ID
- Dize türü: Uyarı kartı kimliğini belirtir
- Sorunun yönlendirilmesinin çalışması için zorunludur.
- Dize değeri:
EXTRA_SAFETY_SOURCE_USER_HANDLE
- Dize değeri:
android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE
UserHandle
türü: İlişkili uyarı içinUserHandle
değerini belirtir kart- İsteğe bağlı (Varsayılan değer, geçerli kullanıcıdır)
- Dize değeri:
Aşağıdaki kod snippet'i, Activity
örneğin içinden kullanılabilir.
uyarısını kontrol edin:
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);
Belirli bir alt sayfaya yönlendirme (Android 14'ten itibaren)
Android 14 veya sonraki sürümlerde Güvenlik Merkezi sayfası bölünüyor
gösteren birden çok alt sayfaya ayırarak SafetySourcesGroup
(
Android 13'te bu, daraltılabilir girişler olarak gösterilir).
Bu ek intent'i kullanarak belirli bir alt sayfaya yönlendirme yapabilirsiniz:
EXTRA_SAFETY_SOURCES_GROUP_ID
- Dize değeri:
android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID
- Dize türü:
SafetySourcesGroup
öğesinin kimliğini belirtir - Alt sayfaya yönlendirmenin çalışması için gereklidir
- Dize değeri:
Aşağıdaki kod snippet'i, Activity
örneğin içinden kullanılabilir.
Güvenlik Merkezi ekranını belirli bir alt sayfaya
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID, "TheSafetySourcesGroupId");
startActivity(openSafetyCenterIntent);
Güvenlik Merkezi kaynak API'lerini kullanma
Safety Center kaynak API'leri SafetyCenterManager
(@SystemApi
) kullanılarak kullanılabilir. API yüzeyinin kodu Code Search'te mevcuttur.
API'lerin uygulama kodunu Code Search'te bulabilirsiniz.
İzinler
Safety Center kaynak API'lerine yalnızca aşağıda listelenen izinleri kullanarak izin verilenler listesindeki sistem uygulamaları erişebilir. Daha fazla bilgi için bkz. Özel İzin Verilenler Listesine Ekleme.
READ_SAFETY_CENTER_STATUS
signature|privileged
SafetyCenterManager#isSafetyCenterEnabled()
API için kullanılır (Safety Center kaynakları için gerekli değildir, bu kaynaklarda yalnızcaSEND_SAFETY_CENTER_UPDATE
izni gerekir)- Güvenlik Merkezi'nin etkin olup olmadığını kontrol eden sistem uygulamaları tarafından kullanılır.
- Yalnızca izin verilenler listesindeki sistem uygulamalarına izin verilir
SEND_SAFETY_CENTER_UPDATE
internal|privileged
- Etkin API ve Safety Resources API için kullanılır
- Yalnızca güvenlik kaynakları tarafından kullanılır
- Yalnızca izin verilenler listesindeki sistem uygulamalarına verilir
Bu izinler ayrıcalıklı olduğundan yalnızca ilgili dosyaya (ör. Ayarlar uygulamasının com.android.settings.xml
dosyası ve uygulamanın AndroidManifest.xml
dosyası) ekleyerek edinebilirsiniz. Görüntüleyin
protectionLevel
sayfasına bakın.
SafetyCenterManager'ı alma
SafetyCenterManager
, sistem uygulamalarından erişilebilen bir @SystemApi
sınıfıdır
Android 13'ten itibaren. Bu çağrıda, SafetyCenterManager'ın nasıl alınacağı gösterilmektedir:
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;
}
Güvenlik Merkezi'nin etkin olup olmadığını kontrol edin
Bu çağrı, Güvenlik Merkezi'nin etkin olup olmadığını kontrol eder. Çağrı için
READ_SAFETY_CENTER_STATUS
veya SEND_SAFETY_CENTER_UPDATE
izni:
boolean isSafetyCenterEnabled = safetyCenterManager.isSafetyCenterEnabled();
if (isSafetyCenterEnabled) {
// …
} else {
// …
}
Veri sağlayın
Belirtilen String sourceId
ile Güvenlik Merkezi kaynak verileri Güvenlik ekibine sağlanır
Bir kullanıcı arayüzü girişini ve birSafetySourceData
sorun listesi (uyarı kartları). Kullanıcı arayüzü girişi ve uyarı kartları, SafetySourceData
sınıfında farklı önem düzeylerine sahip olabilir:
SEVERITY_LEVEL_UNSPECIFIED
- Önem derecesi belirtilmedi
- Renk: Gri veya şeffaf (öğenin
SafetySourcesGroup
girişi) - Kullanıcı arayüzünde statik giriş gibi görünen dinamik veriler veya belirtilmemiş bir girişi göstermek için kullanılır
- Uyarı kartları için kullanılmamalıdır
SEVERITY_LEVEL_INFORMATION
- Temel bilgiler veya küçük bir öneri
- Renk: Yeşil
SEVERITY_LEVEL_RECOMMENDATION
- Kullanıcının bu sorunla ilgili işlem yapması önerilir çünkü onları riske atabilir
- Renk: Sarı
SEVERITY_LEVEL_CRITICAL_WARNING
- Kullanıcının bu sorunla ilgili işlem yapması gerektiğine dair kritik uyarı risk teşkil eder
- Renk: Kırmızı
SafetySourceData
SafetySourceData
nesnesi, bir kullanıcı arayüzü girişinden, uyarı kartlarından ve
sabit değerleri girin.
- İsteğe bağlı
SafetySourceStatus
örneği (kullanıcı arayüzü girişi) SafetySourceIssue
örnekleri listesi (uyarı kartları)- İsteğe bağlı
Bundle
ekstralar (14'ten itibaren) - Değişmezler:
SafetySourceIssue
listesi, benzersiz tanımlayıcılar.SafetySourceIssue
örneği şu değerden daha büyük olmamalıdır: VarsaSafetySourceStatus
(SafetySourceStatus
SEVERITY_LEVEL_UNSPECIFIED
(bu durumdaSEVERITY_LEVEL_INFORMATION
) sorunlara izin verilir).- API yapılandırması tarafından zorunlu kılınan ek koşullar karşılanmalıdır. Örneğin, kaynak yalnızca sorun içeriyorsa
SafetySourceStatus
örneği sağlamamalıdır.
SafetySourceStatus
- Zorunlu
CharSequence
başlığı - Zorunlu
CharSequence
özeti - Gerekli önem düzeyi
- Kullanıcıyı doğru sayfaya yönlendirmek için isteğe bağlı
PendingIntent
örneği (varsayılan olarak yapılandırmadakiintentAction
kullanılır) - Şunlardan oluşan isteğe bağlı
IconAction
(girişte yan simge olarak gösterilir):- Zorunlu simge türü. Aşağıdaki türlerden biri olmalıdır:
ICON_TYPE_GEAR
: Kullanıcı arayüzü girişinin yanında dişli olarak gösterilirICON_TYPE_INFO
: Kullanıcı arayüzü girişinin yanında bilgi simgesi olarak gösterilir
- Kullanıcıyı başka bir sayfaya yönlendirmek için
PendingIntent
gerekiyor
- Zorunlu simge türü. Aşağıdaki türlerden biri olmalıdır:
- Kullanıcı arayüzü girişinin şu şekilde işaretlenmesine izin veren isteğe bağlı boole
enabled
değeri devre dışı olduğu için tıklanamıyor (varsayılan değertrue
) - Değişmezler:
PendingIntent
örnekleri birActivity
örneği açmalıdır.- Giriş devre dışıysa
SEVERITY_LEVEL_UNSPECIFIED
olarak belirtilmelidir. - API yapılandırması tarafından zorunlu kılınan ek şartlar.
SafetySourceIssue
- Zorunlu benzersiz
String
tanımlayıcısı - Zorunlu
CharSequence
başlığı - İsteğe bağlı
CharSequence
alt başlığı - Zorunlu
CharSequence
özeti - Gerekli önem düzeyi
- İsteğe bağlı sorun kategorisi. Bu kategori şunlardan biri olmalıdır:
ISSUE_CATEGORY_DEVICE
: Sorun, kullanıcının cihazını etkiliyor.ISSUE_CATEGORY_ACCOUNT
: Sorun, kullanıcının hesaplarını etkiliyor.ISSUE_CATEGORY_GENERAL
: Sorun, kullanıcının genel güvenliğini etkiler. Bu, varsayılan ayardır.ISSUE_CATEGORY_DATA
(Android 14'ten itibaren): Sorun, kullanıcının verilerini etkiliyor.ISSUE_CATEGORY_PASSWORDS
(Android 14'ten itibaren): Sorun, kullanıcının şifrelerini etkiler.ISSUE_CATEGORY_PERSONAL_SAFETY
(Android 14'ten itibaren): Sorun, kullanıcının kişisel güvenliğini etkiler.
- Her biri bu sorun için kullanıcının alabileceği
Action
öğelerinin listesi Şunlardan oluşanAction
örnek:- Zorunlu benzersiz
String
tanımlayıcısı - Zorunlu
CharSequence
etiketi - Zorunluluk
PendingIntent
kullanıcıyı başka bir sayfaya yönlendirmek veya eylemi doğrudan Güvenlik Merkezi ekranı - Bu sorunun doğrudan şuradan çözülüp çözülemeyeceği belirtilecek boole değeri
SafetyCenter ekranı (varsayılan değer:
false
) - Kullanıcıya gösterilecek isteğe bağlı
CharSequence
başarı mesajı Sorun doğrudan Güvenlik Merkezi'nden başarıyla çözüldüğünde ekran
- Zorunlu benzersiz
- Kullanıcı sorunu kapattığında çağrılan isteğe bağlı
PendingIntent
(varsayılan olarak hiçbir şey çağrılmaz) - Zorunlu
String
sorun türü tanımlayıcısı; bu soruna benziyor benzersiz olması gerekmez ve günlük kaydı için kullanılır - Tekilleştirme kimliği için isteğe bağlı
String
. Bu, aynıSafetySourceIssue
'nin farklı kaynaklardan yayınlanmasına ve aynıdeduplicationGroup
'ye sahip oldukları varsayılarak kullanıcı arayüzünde yalnızca bir kez gösterilmesine olanak tanır (Android 14'ten itibaren). Belirtilmezse sorun hiçbir zaman tekilleştirilmiş - İlişkilendirme başlığı için isteğe bağlı
CharSequence
. Bu, uyarı kartının nereden geldiğini gösteren bir metindir (Android 14'ten itibaren). BelirtilmezseSafetySourcesGroup
. - İsteğe bağlı sorun işlemleri (Android 14'ten itibaren),
Bu değer şunlardan biri olmalıdır:
ISSUE_ACTIONABILITY_MANUAL
: Kullanıcının bu sorunu manuel olarak çözmesi gerekir. Bu, varsayılan ayardır.ISSUE_ACTIONABILITY_TIP
: Bu sorun yalnızca bir ipucu niteliğindedir ve kullanıcıdan herhangi bir giriş gerekmeyebilir.ISSUE_ACTIONABILITY_AUTOMATIC
: Bu sorun için zaten işlem yapıldı ve kullanıcı girişi gerektirmeyebilir.
- İsteğe bağlı bildirim davranışı (Android 14'ten itibaren) şunlar arasından biri olmalıdır:
NOTIFICATION_BEHAVIOR_UNSPECIFIED
: Güvenlik Merkezi, uyarı kartı için bildirim gerekir. Bu, varsayılan seçenektir.NOTIFICATION_BEHAVIOR_NEVER
: Hiçbir bildirim yayınlanmaz.NOTIFICATION_BEHAVIOR_DELAYED
: Sorun ilk kez bildirildikten bir süre sonra bildirim yayınlanır.NOTIFICATION_BEHAVIOR_IMMEDIATELY
: Sorun bildirilir bildirilmez bir bildirim yayınlanır.
- İsteğe bağlı
Notification
: Uyarı kartıyla birlikte özel bir bildirim gösterilmesi için (Android 14'ten itibaren). BelirtilmezseNotification
, uyarı kartından türetildi. Şunlardan oluşur:- Zorunlu
CharSequence
başlığı - Zorunlu
CharSequence
özeti - Kullanıcının bu bildirim için alabileceği
Action
öğelerinin listesi
- Zorunlu
- Sabit değerler:
Action
örnekleri listesi, benzersiz tanımlayıcılara sahip işlemlerden oluşmalıdırAction
örnekleri listesi bir veya ikiAction
içermelidir öğeler. İşlem yapılabilirlikISSUE_ACTIONABILITY_MANUAL
değilseAction
değerinin sıfır olmasına izin verilir.- OnDismiss
PendingIntent
,Activity
örneği açmamalıdır - API yapılandırmasının getirdiği ek koşullar
Veriler, belirli etkinliklerin ardından Güvenlik Merkezi'ne sağlanır. Bu nedenle, kaynağın SafetySourceData
için SafetyEvent
örneği sağlamasına neyin neden olduğunu belirtmeniz gerekir.
SafetyEvent
- Zorunlu tür. Aşağıdakilerden biri olmalıdır:
SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
: Kaynağın durumu değişti.SAFETY_EVENT_TYPE_REFRESH_REQUESTED
: Yenileme/yeniden tarama işlemine yanıt verme Güvenlik Merkezi'nden gelen sinyal; yerine bunu kullanın Güvenlik Merkezi'nin şunları yapması içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
: yenileme/yeniden tarama isteğini izler.SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
:SafetySourceIssue.Action
sorununu doğrudan Güvenlik Merkezi ekranından çözdük.SafetySourceIssue.Action
sorununun çözülmesini takip etmek için Güvenlik Merkezi'ndeSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
yerine bunu kullanın.SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
: Şu sorunu çözmeye çalıştık: doğrudan Güvenlik Merkezi ekranındanSafetySourceIssue.Action
, ancak işlemi gerçekleştiremediyse; yerine bunu kullanın Güvenlik Merkezi'nin şu özellikleri taşıması için:SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
SafetySourceIssue.Action
adlı parça başarısız oldu.SAFETY_EVENT_TYPE_DEVICE_LOCALE_CHANGED
: Cihazın dili değiştiği için sağlanan verilerin metnini güncelliyoruz. Bunun içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
kullanılmasına izin verilir.SAFETY_EVENT_TYPE_DEVICE_REBOOTED
: Bu verileri, bir ilk başlatmanın temel bileşenidir. yeniden başlatma;SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
kullanılmasına izin verilir bazı ipuçları vereceğim.
- Yenileme yayın kimliği için isteğe bağlı
String
tanımlayıcısı. - Alınan
SafetySourceIssue
örneği için isteğe bağlıString
tanımlayıcısı çözüme ulaştırıldı. SafetySourceIssue.Action
örneği için isteğe bağlıString
tanımlayıcısı çözülüyor.- Değişmezler:
- Tür aşağıdaki gibiyse yenileme yayını kimliği sağlanmalıdır:
SAFETY_EVENT_TYPE_REFRESH_REQUESTED
. - Tür şunlardan biri ise sorun ve işlem kimlikleri sağlanmalıdır:
SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
veyaSAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
- Tür aşağıdaki gibiyse yenileme yayını kimliği sağlanmalıdır:
Aşağıda, bir kaynağın Güvenlik Merkezi'ne nasıl veri sağlayabileceğine dair bir örnek verilmiştir (bu örnekte tek bir uyarı kartı içeren bir giriş sağlanmaktadır):
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);
Sağlanan son veriyi al
Uygulamanızın sahibi olduğu bir kaynak için Safety Center'a sağlanan son verileri alabilirsiniz. Bu verileri kendi kullanıcı arayüzünüzde bir öğeyi göstermek, pahalı bir işlem gerçekleştirmeden önce verilerin güncellenmesi gerekip gerekmediğini kontrol etmek veya aynı SafetySourceData
örneğini Safety Center'a bazı değişikliklerle ya da yeni bir SafetyEvent
örneğiyle sağlamak için kullanabilirsiniz. Bu işlem, test için de yararlı olabilir.
Güvenlik Merkezi'ne sağlanan son veriyi almak için şu kodu kullanın:
SafetySourceData lastDataProvided =
safetyCenterManager.getSafetySourceData("MySourceId");
Hata bildirme
SafetySourceData
verilerini toplayamazsanız hatayı Güvenlik Merkezi'ne bildirebilirsiniz. Bu durumda giriş gri renk olur, önbelleğe alınan veriler temizlenir ve Ayarı kontrol edilemedi gibi bir mesaj gösterilir. Ayrıca, şu durumlarda da hata bildirebilirsiniz:
SafetySourceIssue.Action
örneği çözümlenemez. Bu durumda
önbelleğe alınan veriler temizlenmez ve kullanıcı arayüzü girişi değiştirilmez; ancak mesaj,
mesajı gösterilir.
Aşağıdakilerden oluşan SafetySourceErrorDetails
öğesini kullanarak hatayı sağlayabilirsiniz:
SafetySourceErrorDetails
: ZorunluSafetyEvent
örneği:
// 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);
Yenileme veya yeniden tarama isteğine yanıt verme
Yeni veri sağlamak için Güvenlik Merkezi'nden sinyal alabilirsiniz. Cevap verme yenileme veya yeniden tarama isteği, aşağıdaki durumlarda kullanıcının geçerli durumu görüntülemesini Güvenlik Merkezi'ni açarak ve tara düğmesine dokunduklarında.
Bu işlem, aşağıdaki işlemi içeren bir yayın alınarak yapılır:
ACTION_REFRESH_SAFETY_SOURCES
- Dize değeri:
android.safetycenter.action.REFRESH_SAFETY_SOURCES
- Güvenlik Merkezi, belirli bir uygulamanın güvenlik kaynağının verilerini yenileme isteği gönderdiğinde tetiklenir.
- Yalnızca sistem tarafından gönderilebilen Protected intent
- Yapılandırma dosyasındaki tüm güvenlik kaynaklarına açık olarak gönderilir
intent ve
SEND_SAFETY_CENTER_UPDATE
iznini gerektiriyor
- Dize değeri:
Bu yayın kapsamında aşağıdaki ekstralar sunulur:
EXTRA_REFRESH_SAFETY_SOURCE_IDS
- Dize değeri:
android.safetycenter.extra.REFRESH_SAFETY_SOURCE_IDS
- Dize dizisi türü (
String[]
), yenilenecek kaynak kimliklerini temsil eder belirtilen uygulama
- Dize değeri:
EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE
- Dize değeri:
android.safetycenter.extra.REFRESH_SAFETY_SOURCES_REQUEST_TYPE
. - Tam sayı türü, bir istek türünü temsil eder
@IntDef
- Aşağıdakilerden biri olmalıdır:
EXTRA_REFRESH_REQUEST_TYPE_GET_DATA
: Kaynağı şuna ister: nispeten hızlı bir şekilde veri sağlar (genellikle kullanıcı sayfayı açtığındaEXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA
: Genellikle kullanıcı yeniden tarama düğmesine bastığında kaynağın mümkün olduğunca güncel veriler sağlamasını ister.
- Dize değeri:
EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID
- Dize değeri:
android.safetycenter.extra.REFRESH_SAFETY_SOURCES_BROADCAST_ID
. - Dize türü, istenen yenilemenin benzersiz tanımlayıcısını temsil eder
- Dize değeri:
Güvenlik Merkezi'nden sinyal almak için bir BroadcastReceiver
örneği uygulayın. Yayın, alıcının ön plan hizmetini başlatmasına olanak tanıyan özel BroadcastOptions
ile gönderilir.
BroadcastReceiver
, yenileme isteğine yanıt verir:
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;
}
}
Yukarıdaki örnekte aynı BroadcastReceiver
örneği şurada açıklanmıştır:
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>
İdeal olarak, Güvenlik Merkezi kaynağı, verileri değiştiğinde SafetyCenterManager
işlevini çağıracak şekilde uygulanır. Sistem sağlığıyla ilgili nedenlerle
yalnızca yeniden tarama sinyaline yanıt vermeyi öner (kullanıcı, taramaya dokunduğunda
düğmesi) gösterilir. Kullanıcı Güvenlik Merkezi'ni açtığında değil. Bu işlev gerekliyse kaynağın bu durumlarda yayınlanan yayını alması için yapılandırma dosyasındaki refreshOnPageOpenAllowed="true"
alanının ayarlanması gerekir.
Etkinleştirildiğinde veya devre dışı bırakıldığında Güvenlik Merkezi'ne yanıt ver
Güvenlik Merkezi'nin etkinleştirilmesine veya devre dışı bırakılmasına aşağıdaki intent işlemini kullanarak yanıt verebilirsiniz:
ACTION_SAFETY_CENTER_ENABLED_CHANGED
- Dize değeri:
android.safetycenter.action.SAFETY_CENTER_ENABLED_CHANGED
. - Cihaz çalışırken Güvenlik Merkezi etkinleştirildiğinde veya devre dışı bırakıldığında tetiklenir
- Açılışta çağrılmaz (
ACTION_BOOT_COMPLETED
ekleyin) - Yalnızca sistem tarafından gönderilebilen korumalı amaç
- Yapılandırma dosyasındaki tüm güvenlik kaynaklarına açık olarak gönderilir
intent,
SEND_SAFETY_CENTER_UPDATE
iznini gerektirir READ_SAFETY_CENTER_STATUS
gerektiren örtülü bir amaç olarak gönderilir izin
- Dize değeri:
Bu intent işlemi, cihazdaki Güvenlik Merkezi ile ilgili özellikleri etkinleştirmek veya devre dışı bırakmak için kullanışlıdır.
Çözümleme işlemlerini uygulama
Çözüm işlemi, kullanıcının doğrudan Güvenlik Merkezi ekranından çözebileceği bir SafetySourceIssue.Action
örneğidir. Kullanıcı bir işlem düğmesine dokunur ve güvenlik kaynağı tarafından gönderilen SafetySourceIssue.Action
üzerindeki PendingIntent
örneği tetiklenir. Bu işlem, sorunu arka planda çözer ve tamamlandığında Güvenlik Merkezi'ne bildirim gönderir.
Güvenlik Merkezi kaynağı, işlemin biraz zaman almasının beklenmesi durumunda (PendingIntent.getService
) çözüm işlemlerini uygulamak için bir hizmet veya yayın alıcı (PendingIntent.getBroadcast
) kullanabilir.
Çözüme ulaştırılan bir sorunu Güvenlik Merkezi'ne göndermek için şu kodu kullanın:
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
, işlemi sonlandırır:
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).
}
}
Yukarıdaki örnekte aynı BroadcastReceiver
örneği şurada açıklanmıştır:
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>
Sorunları kapatma isteklerine yanıt verme
Bir SafetySourceIssue
örneği kapatıldığında tetiklenebilecek bir PendingIntent
örneği belirtebilirsiniz. Güvenlik Merkezi, aşağıdaki sorun kapatma işlemlerini gerçekleştirir:
- Bir kaynak tarafından gönderilen bir sorunu kullanıcı, Güvenlik Merkezi ekranında kapat düğmesine (uyarı kartında X düğmesi) dokunarak kapatabilir.
- Kullanıcı bir sorunu kapattığında sorun devam ederse görünmez tekrarlıyorum.
- Diskteki kalıcı reddedmeler, cihaz yeniden başlatılırken kalır.
- Güvenlik Merkezi kaynağı bir sorunu bildirmeyi bırakıp daha sonra tekrar bildirirse sorun yeniden ortaya çıkar. Bu izin, Kullanıcının bir uyarı gördüğü, uyarıyı kapattığı ve daha sonra yardımcı olan bir uygulamadır ancak kullanıcı, benzer bir soruna neden olur. Bu noktada uyarı kartı yeniden gösterilir.
- Sarı ve kırmızı uyarı kartları, kullanıcının herhangi bir işlem yapmaması durumunda her 180 günde bir işlemi birden fazla kez kapattı.
Aşağıdaki durumlar hariç olmak üzere kaynak için ek davranışlar gerekmez:
- Kaynak, bu davranışı farklı bir şekilde uygulamaya çalışır (ör. sorunu hiçbir zaman tekrar göstermez).
- Kaynak, bu işlevi geri çağırma olarak kullanmaya çalışır (ör. bilgileri günlüğe kaydetmek için).
Birden çok kullanıcı/profil için veri sağlama
SafetyCenterManager
API, kullanıcılar ve profiller genelinde kullanılabilir. Daha fazla bilgi için Çok kullanıcılı uygulamalar oluşturma başlıklı makaleyi inceleyin. Context
SafetyCenterManager
sağlayan nesne bir UserHandle
ile ilişkilendirilmiş
Bu şekilde, döndürülen SafetyCenterManager
örneği
Bu UserHandle
örneği için Güvenlik Merkezi. Varsayılan olarak Context
ilişkilidir ancak isteğe bağlı olarak farklı türde
Uygulama INTERACT_ACROSS_USERS
ve
INTERACT_ACROSS_USERS_FULL
izinleri. Bu örnekte, telefon etme gösterilmektedir
kullanıcılar/profiller arasında:
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
Cihazdaki her kullanıcının birden fazla yönetilen profili olabilir. Güvenlik Merkezi Her kullanıcı için farklı veriler sağlar ancak yönetilen tüm kullanıcı hesaplarının verilerini birleştirir. belirli bir kullanıcı ile ilişkili profildir.
Yapılandırma dosyasında kaynak için profile="all_profiles"
ayarlandığında aşağıdakiler gerçekleşir:
- Kullanıcı (profil ebeveyni) ve ilişkili tüm yönetilen profiller (
titleForWork
örneklerini kullanan) için bir kullanıcı arayüzü girişi vardır. Yenileme veya yeniden tarama sinyali, profil üst öğesi ve ilişkili yönetilen profiller. Her biri için ilişkili alıcı başlatılır. sağlar ve ilişkilendirilen verileri doğrudan
SafetyCenterManager
muhatabınıza ait olmayansingleUser
Kaynağın, kullanıcı ve tüm yönetilenleri için veri sağlaması beklenir profil. Her kullanıcı arayüzü girişine ait veriler, girişe bağlı olarak, seçin.
Test
ShadowSafetyCenterManager
dosyasına erişebilir ve bu dosyayı Robolectric testinde kullanabilirsiniz.
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);
}
Daha fazla uçtan uca (E2E) test yazabilirsiniz, ancak bu test bu testin kapsamı dışındadır rehberini inceleyin. Bu E2E testlerini yazmayla ilgili daha fazla bilgi için CTS testlerine bakın (CtsSafetyCenterTestCases)
Test ve dahili API'ler
Dahili API'ler ve test API'leri dahili kullanım içindir; bu nedenle, bazı ayrıntıları burada bulabilirsiniz. Ancak OEM'lerin kendi kullanıcı arayüzlerini oluşturmasına izin vermek için gelecekte bazı dahili API'leri genişletebiliriz. Bu durumda, bu kılavuzu bu API'lerin nasıl kullanılacağıyla ilgili yönergeler sağlayacak şekilde güncelleyeceğiz.
İzinler
MANAGE_SAFETY_CENTER
internal|installer|role
- Dahili Güvenlik Merkezi API'leri için kullanılır
- Yalnızca PermissionController'a ve kabuğa verildi
Ayarlar uygulaması
Güvenlik Merkezi yönlendirmesi
Varsayılan olarak, Güvenlik Merkezi'ne Ayarlar uygulamasından yeni bir Güvenlik ve gizlilik girişinden emin olun. Farklı bir Ayarlar uygulaması kullanıyorsanız veya Ayarlar uygulamasında değişiklik yaptıysanız Güvenlik Merkezi'ne erişme şeklini özelleştirmeniz gerekebilir.
Güvenlik Merkezi etkinleştirildiğinde:
- Eski Gizlilik girişi gizlendi kodu
- Eski Güvenlik girişi gizli kod
- Yeni Güvenlik ve gizlilik girişi eklendi kod
- Yeni Güvenlik ve gizlilik girişi, Güvenlik Merkezi koduna yönlendiriyor
android.settings.PRIVACY_SETTINGS
android.settings.SECURITY_SETTINGS
intent işlemleri, Açık Güvenlik Merkezi'ne yönlendirilir (kod: security gizlilik)
Gelişmiş güvenlik ve gizlilik sayfaları
Ayarlar uygulamasında, Güvenlik Merkezi'nden erişilebilen Diğer güvenlik ayarları ve Diğer gizlilik ayarları başlıkları altında ek ayarlar bulunur:
Gelişmiş güvenlik kodu
Gelişmiş gizlilik kodu
Android 14'ten itibaren, gelişmiş güvenlik ve gelişmiş gizlilik ayarları sayfasının "Daha Fazla Güvenlik ve Gizlilik" intent işlemi içeren sayfa
"com.android.settings.MORE_SECURITY_PRIVACY_SETTINGS"
.
Güvenlik kaynakları
Güvenlik Merkezi, Google Cloud Platform tarafından sağlanan belirli güvenlik kaynakları grubuyla Ayarlar uygulaması:
- Kilit ekranı güvenlik kaynağı, kilit ekranının şifre kodu (veya başka bir güvenlik ayarı) kullanarak, kullanıcının özel bilgilerinin güvenli bir şekilde saklanır.
- Bir biyometri güvenlik kaynağı (varsayılan olarak gizlidir) Parmak izi veya yüz sensörü olabilir.
Bu Güvenlik Merkezi kaynaklarının kaynak koduna Android kod arama. Ayarlar uygulamasında değişiklik yapılmazsa (paket adında değişiklik yapılmazsa) kilit ekranı ve biyometri ile ilgili kaynak kodu), bu entegrasyon kullanıma hazırdır. Aksi halde, bazı değişiklikler veya paketi değiştirmek için yapılandırma dosyasını değiştirmek gibi Güvenlik Merkezi ile entegre olan kaynakların adını ve üzerinde duracağız. Daha fazla bilgi için Yapılandırma dosyasını güncelleme ve entegrasyon ayarlarını inceleyin.
PendingIntent hakkında
Android'deki mevcut Ayarlar uygulaması Güvenlik Merkezi entegrasyonunu kullanıyorsanız 14 veya sonraki sürümlerde açıklandığı gibi aşağıda açıklanan hata düzeltilmiştir. Bu durumda bu bölümün okunması gerekmez.
Hatanın olmadığından emin olduğunuzda Güvenlik Merkezi'ndeki geçici çözümü devre dışı bırakmak için Ayarlar uygulamasında XML boole kaynak yapılandırma değerini config_isSafetyCenterLockScreenPendingIntentFixed
olarak true
ayarlayın.
PendingIntent geçici çözümü
Bu hata, Ayarlar'ın hangi parçanın açılacağını belirlemek için Intent
örnek ekstralarını kullanmasından kaynaklanır. Intent#equals
, Intent
örneğinin ekstralarını hesaba katmadığı için dişli menü simgesi ve giriş için PendingIntent
örneği eşit kabul edilir ve farklı bir kullanıcı arayüzüne gitmek için tasarlanmış olsalar bile aynı kullanıcı arayüzüne yönlendirir. Bu sorun, PendingIntent
örneklerini istek koduna göre ayırarak bir QPR sürümünde düzeltildi. Alternatif olarak:
bu, Intent#setId
ile ayırt edilebilir.
Dahili güvenlik kaynakları
Bazı Güvenlik Merkezi kaynakları dahilidir ve PermissionController modülündeki PermissionController sistem uygulaması. Bu kaynaklar normal Güvenlik Merkezi kaynakları gibi davranır ve özel kaynaklar almaz ele alacağız. Bu kaynakların koduna Android kod arama üzerinden ulaşabilirsiniz.
Bunlar temel olarak gizlilik sinyalleridir. Örneğin:
- Erişilebilirlik
- Kullanılmayan uygulamaların izinlerini otomatik olarak iptal etme
- Konum erişimi
- Bildirim dinleyici
- İş politikası bilgileri