Güvenlik Merkezine Yönlendir
Herhangi bir uygulama, android.content.Intent.ACTION_SAFETY_CENTER
işlemini (dize değeri android.intent.action.SAFETY_CENTER
) kullanarak Güvenlik Merkezi'ni açabilir.
Güvenlik Merkezi'ni açmak için Activity
örneğinin içinden arama yapın:
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);
startActivity(openSafetyCenterIntent);
Belirli bir soruna yönlendir
Özel amaç ekstralarını kullanarak belirli bir Güvenlik Merkezi uyarı kartına yönlendirmek de mümkündür. Bu ekstraların üçüncü taraflarca kullanılması amaçlanmamıştır, dolayısıyla bunlar @SystemApi
bir parçası olan SafetyCenterManager
parçasıdır. Bu ekstralara yalnızca sistem uygulamaları erişebilir.
Belirli bir uyarı kartını yönlendiren amaç ekstraları:
-
EXTRA_SAFETY_SOURCE_ID
- Dize değeri:
android.safetycenter.extra.SAFETY_SOURCE_ID
- Dizi türü: İlgili uyarı kartının güvenlik kaynağının kimliğini belirtir
- Soruna yönlendirmenin çalışması için gerekli
- 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
- Soruna yönlendirmenin çalışması için gerekli
- Dize değeri:
-
EXTRA_SAFETY_SOURCE_USER_HANDLE
- Dize değeri:
android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE
-
UserHandle
türü: İlgili uyarı kartı içinUserHandle
belirtir - İsteğe bağlı (varsayılan geçerli kullanıcıdır)
- Dize değeri:
Aşağıdaki kod parçacığı, Güvenlik Merkezi ekranını belirli bir soruna açmak için bir Activity
örneğinin içinden kullanılabilir:
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ı, farklı SafetySourcesGroup
temsil eden birden fazla alt sayfaya bölünmüştür (Android 13'te bu, daraltılabilir girişler olarak gösterilir).
Bu amacı ekstra kullanarak belirli bir alt sayfaya yönlendirmek mümkündür:
-
EXTRA_SAFETY_SOURCES_GROUP_ID
- Dize değeri:
android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID
- Dize türü:
SafetySourcesGroup
kimliğini belirtir - Alt sayfaya yönlendirmenin çalışması için gereklidir
- Dize değeri:
Aşağıdaki kod parçacığı, Güvenlik Merkezi ekranını belirli bir alt sayfaya açmak için bir Activity
örneğinin içinden kullanılabilir:
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID, "TheSafetySourcesGroupId");
startActivity(openSafetyCenterIntent);
Güvenlik Merkezi kaynak API'lerini kullanın
Güvenlik Merkezi kaynak API'leri, SafetyCenterManager
( @SystemApi
olan) kullanılarak kullanılabilir. API yüzeyinin kodu Code Search'te mevcuttur. API'lerin uygulama kodu Code Search'te mevcuttur.
İzinler
Güvenlik Merkezi kaynak API'lerine yalnızca aşağıda listelenen izinleri kullanan izin verilenler listesindeki sistem uygulamaları tarafından erişilebilir. Ek bilgi için bkz. Ayrıcalıklı İzin İzin Verilenler Listesine Ekleme .
-
READ_SAFETY_CENTER_STATUS
-
signature|privileged
-
SafetyCenterManager#isSafetyCenterEnabled()
API'si için kullanılır (Güvenlik Merkezi kaynakları için gerekli değildir, yalnızcaSEND_SAFETY_CENTER_UPDATE
iznine ihtiyaçları vardır) - 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 verilir
-
-
SEND_SAFETY_CENTER_UPDATE
-
internal|privileged
- Etkinleştirilen API ve Güvenlik Kaynakları API'si 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ıdır ve bunları yalnızca ilgili dosyaya (örneğin, Ayarlar uygulaması için com.android.settings.xml
dosyasına) ve uygulamanın AndroidManifest.xml
dosyasına ekleyerek alabilirsiniz. İzin modeli hakkında daha fazla bilgi için protectionLevel
bakın.
SafetyCenterManager'ı edinin
SafetyCenterManager
, Android 13'ten itibaren sistem uygulamalarından erişilebilen bir @SystemApi
sınıfıdır. Bu çağrı, SafetyCenterManager'ın nasıl edinileceğini gösterir:
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 Merkezinin etkin olup olmadığını kontrol edin
Bu çağrı, Güvenlik Merkezi'nin etkin olup olmadığını kontrol eder. Çağrı, READ_SAFETY_CENTER_STATUS
veya SEND_SAFETY_CENTER_UPDATE
iznini gerektirir:
boolean isSafetyCenterEnabled = safetyCenterManager.isSafetyCenterEnabled();
if (isSafetyCenterEnabled) {
// …
} else {
// …
}
Veri sağlamak
Belirtilen String sourceId
sahip Güvenlik Merkezi kaynak verileri, bir kullanıcı arayüzü girişini ve sorunların listesini (uyarı kartları) temsil eden SafetySourceData
nesnesiyle Güvenlik Merkezi'ne sağlanır. Kullanıcı arayüzü girişi ve uyarı kartları, SafetySourceData
sınıfında belirtilen farklı önem derecelerine sahip olabilir:
-
SEVERITY_LEVEL_UNSPECIFIED
- Önem derecesi belirtilmedi
- Renk: Gri veya şeffaf (girişin
SafetySourcesGroup
bağlı olarak) - Kullanıcı arayüzünde statik bir giriş gibi görünen dinamik veriler için 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 öneri
- Yeşil renk
-
SEVERITY_LEVEL_RECOMMENDATION
- Kullanıcıyı riske atabileceği için bu sorunla ilgili işlem yapması önerisi
- Sarı renk
-
SEVERITY_LEVEL_CRITICAL_WARNING
- Risk teşkil ettiğinden kullanıcının bu sorunla ilgili işlem yapması gerektiğine dair kritik uyarı
- Kırmızı renk
SafetySourceData
SafetySourceData
nesnesi bir kullanıcı arayüzü girişi, uyarı kartları ve değişmezlerden oluşur.
- İsteğe bağlı
SafetySourceStatus
örneği (UI girişi) -
SafetySourceIssue
örneklerinin listesi (uyarı kartları) - İsteğe Bağlı
Bundle
ekstraları (14'ten Başlayan) - Değişmezler:
-
SafetySourceIssue
listesi benzersiz tanımlayıcılara sahip sorunlardan oluşmalıdır. -
SafetySourceIssue
örneği, eğer varsaSafetySourceStatus
daha önemli olmamalıdır (SafetySourceStatus
SEVERITY_LEVEL_UNSPECIFIED
olmadığı sürece, bu durumdaSEVERITY_LEVEL_INFORMATION
sorunlarına izin verilir). - API yapılandırmasının zorunlu kıldığı ek gereksinimlerin karşılanması gerekir; örneğin, kaynak yalnızca soruna yönelikse
SafetySourceStatus
örneği sağlamamalıdır.
-
SafetySourceStatus
- Gerekli
CharSequence
başlığı - Gerekli
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, varsaintentAction
kullanır) - İsteğe bağlı
IconAction
(girişte yan simge olarak gösterilir) aşağıdakilerden oluşur:- Aşağıdaki türlerden biri olması gereken gerekli simge türü:
-
ICON_TYPE_GEAR
: Kullanıcı arayüzü girişinin yanında dişli olarak gösterilir -
ICON_TYPE_INFO
: Kullanıcı arayüzü girişinin yanında bir bilgi simgesi olarak gösterilir
-
- Kullanıcıyı başka bir sayfaya yönlendirmek için gerekli
PendingIntent
- Aşağıdaki türlerden biri olması gereken gerekli simge türü:
- Kullanıcı arayüzü girişinin devre dışı olarak işaretlenmesine izin veren ve tıklanabilir olmamasını sağlayan isteğe bağlı boole
enabled
değeri (varsayılantrue
) - Değişmezler:
-
PendingIntent
örnekleri birActivity
örneğini açmalıdır. - Giriş devre dışı bırakılırsa
SEVERITY_LEVEL_UNSPECIFIED
olarak atanmalıdır. - API yapılandırmasının getirdiği ek gereksinimler.
-
SafetySourceIssue
- Gerekli benzersiz
String
tanımlayıcısı - Gerekli
CharSequence
başlığı - İsteğe bağlı
CharSequence
altyazısı - Gerekli
CharSequence
özeti - Gerekli önem düzeyi
- Aşağıdakilerden biri olması gereken isteğe bağlı sorun kategorisi:
-
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 etkiliyor. Bu varsayılandı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 etkiliyor. -
ISSUE_CATEGORY_PERSONAL_SAFETY
(Android 14'ten itibaren): Sorun kullanıcının kişisel güvenliğini etkiliyor.
-
- Kullanıcının bu sorun için gerçekleştirebileceği
Action
öğelerinin listesi; her birAction
örneği şunlardan oluşur:- Gerekli benzersiz
String
tanımlayıcısı - Gerekli
CharSequence
etiketi - Kullanıcıyı başka bir sayfaya yönlendirmek veya eylemi doğrudan Güvenlik Merkezi ekranından işlemek için
PendingIntent
gereklidir - Bu sorunun doğrudan Güvenlik Merkezi ekranından çözülüp çözülemeyeceğini belirtmek için isteğe bağlı boole (varsayılan değer
false
) - Sorun doğrudan Güvenlik Merkezi ekranından başarıyla çözüldüğünde kullanıcıya görüntülenecek isteğe bağlı
CharSequence
başarı mesajı
- Gerekli benzersiz
- Kullanıcı sorunu kapattığında çağrılan isteğe bağlı
PendingIntent
(varsayılan olarak hiçbir şey çağrılmaz) - Gerekli
String
sorun türü tanımlayıcısı; bu, sorun tanımlayıcıya benzer ancak benzersiz olması gerekmez ve günlüğe kaydetme için kullanılır - Tekilleştirme kimliği için İsteğe Bağlı
String
; bu, aynıSafetySourceIssue
farklı kaynaklardan gönderilmesine ve aynıdeduplicationGroup
sahip oldukları varsayılarak kullanıcı arayüzünde yalnızca bir kez gösterilmesine olanak tanır (Android 14'ten itibaren). Belirtilmediği takdirde sorun hiçbir zaman tekilleştirilmez - İ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). BelirtilmemişseSafetySourcesGroup
başlığını kullanır - İsteğe bağlı sorunla ilgili işlem yapılabilirlik (Android 14'ten itibaren): Aşağıdakilerden biri olmalıdır:
-
ISSUE_ACTIONABILITY_MANUAL
: Kullanıcının bu sorunu manuel olarak çözmesi gerekiyor. Bu varsayılandır. -
ISSUE_ACTIONABILITY_TIP
: Bu sorun yalnızca bir ipucudur ve herhangi bir kullanıcı girişi gerektirmeyebilir. -
ISSUE_ACTIONABILITY_AUTOMATIC
: Bu soruna zaten müdahale edildi ve herhangi bir kullanıcı girişi gerektirmeyebilir.
-
- Aşağıdakilerden biri olması gereken isteğe bağlı bildirim davranışı (Android 14'ten itibaren):
-
NOTIFICATION_BEHAVIOR_UNSPECIFIED
: Uyarı kartı için bildirim gerekip gerekmediğine Güvenlik Merkezi karar verecektir. Bu varsayılandır. -
NOTIFICATION_BEHAVIOR_NEVER
: Hiçbir bildirim gönderilmedi. -
NOTIFICATION_BEHAVIOR_DELAYED
: Sorunun ilk rapor edilmesinden bir süre sonra bir bildirim yayınlanır. -
NOTIFICATION_BEHAVIOR_IMMEDIATELY
: Sorun bildirilir bildirilmez bir bildirim gönderilir.
-
- Uyarı kartıyla birlikte özel bir bildirim göstermek için İsteğe Bağlı
Notification
(Android 14'ten itibaren). Belirtilmediği takdirdeNotification
, uyarı kartından türetilir. Oluşan:- Gerekli
CharSequence
başlığı - Gerekli
CharSequence
özeti - Kullanıcının bu bildirim için gerçekleştirebileceği
Action
öğelerinin listesi
- Gerekli
- Değişmezler:
-
Action
örnekleri listesi benzersiz tanımlayıcılara sahip eylemlerden oluşmalıdır -
Action
örnekleri listesi bir veya ikiAction
öğesi içermelidir. İşlem yapılabilirlikISSUE_ACTIONABILITY_MANUAL
değilse sıfırAction
izin verilir. - OnDismiss
PendingIntent
birActivity
örneğini açmamalıdır - API yapılandırmasının getirdiği ek gereksinimler
-
Veriler belirli olaylar üzerine Güvenlik Merkezi'ne sağlanır; bu nedenle, kaynağın SafetySourceData
bir SafetyEvent
örneği sağlamasına neyin sebep olduğunu belirtmek gerekir.
SafetyEvent
- Aşağıdakilerden biri olması gereken gerekli tür:
-
SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
: Kaynağın durumu değişti. -
SAFETY_EVENT_TYPE_REFRESH_REQUESTED
: Güvenlik Merkezi'nden gelen yenileme/yeniden tarama sinyaline yanıt verme; Güvenlik Merkezi'nin yenileme/yeniden tarama isteğini izleyebilmesi içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
yerine bunu kullanın. -
SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
:SafetySourceIssue.Action
doğrudan Güvenlik Merkezi ekranından çözdük; Güvenlik Merkezi'nin çözülmekte olanSafetySourceIssue.Action
izleyebilmesi içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
yerine bunu kullanın. -
SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
:SafetySourceIssue.Action
doğrudan Güvenlik Merkezi ekranından çözmeye çalıştık, ancak bunu başaramadık; Güvenlik Merkezi'ninSafetySourceIssue.Action
takip edebilmesi içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
yerine bunu kullanın. İşlem başarısız oldu. -
SAFETY_EVENT_TYPE_DEVICE_LOCALE_CHANGED
: Cihazın dili değişti, bu nedenle sağlanan verilerin metnini güncelliyoruz; bunun içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
kullanımına izin verilir. -
SAFETY_EVENT_TYPE_DEVICE_REBOOTED
: Güvenlik Merkezi verileri yeniden başlatmalarda kalıcı olmadığından, bu verileri ilk önyüklemenin parçası olarak sağlıyoruz; bunun içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
kullanımına izin verilir.
-
- Yayın kimliğini yenilemek için isteğe bağlı
String
tanımlayıcı. -
SafetySourceIssue
örneği için isteğe bağlıString
tanımlayıcısının çözülmesi. -
SafetySourceIssue.Action
örneğinin isteğe bağlıString
tanımlayıcısı çözümleniyor. - Değişmezler:
- Tür
SAFETY_EVENT_TYPE_REFRESH_REQUESTED
ise yenileme yayın kimliğinin sağlanması gerekir - Tür
SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
veyaSAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
ise sorun ve eylem kimlikleri sağlanmalıdır.
- Tür
Aşağıda bir kaynağın Güvenlik Merkezi'ne nasıl veri sağlayabileceğine ilişkin bir örnek verilmiştir (bu durumda tek bir uyarı kartıyla giriş sağlamaktadı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 verileri alın
Uygulamanıza ait bir kaynak için Güvenlik Merkezi'ne sağlanan son verileri alabilirsiniz. Bunu, kendi kullanıcı arayüzünüzde bir şeyi ortaya çıkarmak, pahalı bir işlem gerçekleştirmeden önce verilerin güncellenmesi gerekip gerekmediğini kontrol etmek veya aynı SafetySourceData
örneğini bazı değişikliklerle veya yeni bir SafetyEvent
örneğiyle Güvenlik Merkezine sağlamak için kullanabilirsiniz. Ayrıca test etmek için de faydalıdır.
Güvenlik Merkezi'ne sağlanan son verileri almak için bu kodu kullanın:
SafetySourceData lastDataProvided = safetyCenterManager.getSafetySourceData("MySourceId");
Hata bildir
SafetySourceData
verilerini toplayamıyorsanız, girişi griye çeviren, önbelleğe alınan verileri temizleyen ve Ayar kontrol edilemedi gibi bir mesaj sağlayan Güvenlik Merkezi'ne hatayı bildirebilirsiniz. SafetySourceIssue.Action
örneğinin çözümlenmesi başarısız olursa da bir hata bildirebilirsiniz; bu durumda önbelleğe alınan veriler temizlenmez ve kullanıcı arayüzü girişi değişmez; ancak kullanıcıya bir şeylerin ters gittiğini bildiren bir mesaj gösterilir.
Aşağıdakilerden oluşan SafetySourceErrorDetails
kullanarak hatayı sağlayabilirsiniz:
-
SafetySourceErrorDetails
: GerekliSafetyEvent
ö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 veriler sağlamak için Güvenlik Merkezinden sinyal alabilirsiniz. Bir yenileme veya yeniden tarama isteğine yanıt vermek, kullanıcının Güvenlik Merkezi'ni açarken ve tarama düğmesine dokunduğunda mevcut durumu görüntülemesini sağlar.
Bu, aşağıdaki eylemi 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 uygulama için güvenlik kaynağının verilerinin yenilenmesine yönelik bir istek gönderdiğinde tetiklendi
- Yalnızca sistem tarafından gönderilebilen korumalı niyet
- Yapılandırma dosyasındaki tüm güvenlik kaynaklarına açık bir amaç olarak gönderilir ve
SEND_SAFETY_CENTER_UPDATE
iznini gerektirir
- Dize değeri:
Bu yayının bir parçası olarak aşağıdaki ekstralar sağlanmaktadır:
-
EXTRA_REFRESH_SAFETY_SOURCE_IDS
- Dize değeri:
android.safetycenter.extra.REFRESH_SAFETY_SOURCE_IDS
- Dize dizi türü (
String[]
), verilen uygulama için yenilenecek kaynak kimliklerini temsil eder
- Dize değeri:
EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE
- Dize değeri:
android.safetycenter.extra.REFRESH_SAFETY_SOURCES_REQUEST_TYPE
- Tamsayı türü,
@IntDef
istek türünü temsil eder - Şunlardan biri olmalı:
-
EXTRA_REFRESH_REQUEST_TYPE_GET_DATA
: Genellikle kullanıcı sayfayı açtığında kaynaktan verileri nispeten hızlı sağlamasını ister -
EXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA
: Genellikle kullanıcı yeniden tarama düğmesine bastığında kaynaktan mümkün olduğu kadar taze veri 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 yenileme için benzersiz bir tanımlayıcıyı 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 bir ön plan hizmetini başlatmasına olanak tanıyan özel BroadcastOptions
ile gönderilir.
BroadcastReceiver
bir 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 BroadcastReceiver
aynı örneği AndroidManifest.xml
dosyasında bildirildi:
<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 bir Güvenlik Merkezi kaynağı, verileri değiştiğinde SafetyCenterManager
çağıracak şekilde uygulanır. Sistem sağlığı nedenleriyle, kullanıcı Güvenlik Merkezini açtığında değil, yalnızca yeniden tarama sinyaline (kullanıcı tarama düğmesine dokunduğunda) yanıt vermenizi öneririz. Bu işlevsellik gerekliyse, bu durumlarda kaynağın teslim edilen 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 Merkezine yanıt verme
Bu amaç eylemini kullanarak Güvenlik Merkezi etkinleştirildiğinde veya devre dışı bırakıldığında 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
- Önyükleme sırasında çağrılmadı (bunun için
ACTION_BOOT_COMPLETED
kullanın) - Yalnızca sistem tarafından gönderilebilen korumalı niyet
- Açık bir amaç olarak yapılandırma dosyasındaki tüm güvenlik kaynaklarına gönderilir,
SEND_SAFETY_CENTER_UPDATE
izni gerektirir -
READ_SAFETY_CENTER_STATUS
iznini gerektiren örtülü bir amaç olarak gönderildi
- Dize değeri:
Bu amaç eylemi, cihazdaki Güvenlik Merkezi ile ilgili özellikleri etkinleştirmek veya devre dışı bırakmak için kullanışlıdır.
Çözüm eylemlerini uygulayın
Çözümleme eylemi, kullanıcının doğrudan Güvenlik Merkezi ekranından çözebileceği bir SafetySourceIssue.Action
örneğidir. Kullanıcı bir eylem düğmesine dokunur ve SafetySourceIssue.Action
PendingIntent
örneğine dokunur. Güvenlik kaynağı tarafından gönderilen eylem tetiklenir; bu, sorunu arka planda çözer ve işlem tamamlandığında Güvenlik Merkezi'ne bilgi verir.
Çözümleme eylemlerini uygulamak için Güvenlik Merkezi kaynağı, işlemin biraz zaman alması bekleniyorsa bir hizmeti ( PendingIntent.getService
) veya bir yayın alıcısını ( PendingIntent.getBroadcast
) kullanabilir.
Güvenlik Merkezi'ne çözüme yönelik bir sorun göndermek için bu 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
eylemi çözer:
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 BroadcastReceiver
aynı örneği AndroidManifest.xml
dosyasında bildirildi:
<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>
İşten çıkarmalara yanıt
Bir SafetySourceIssue
örneği kapatıldığında tetiklenebilecek bir PendingIntent
örneği belirtebilirsiniz. Güvenlik Merkezi bu işten çıkarmalarla ilgilenir:
- Bir kaynak bir sorunu gündeme getirirse kullanıcı, Güvenlik Merkezi ekranında kapat düğmesine (uyarı kartındaki X düğmesi) dokunarak sorunu kapatabilir.
- Kullanıcı bir sorunu kapattığında sorun devam ederse kullanıcı arayüzünde bir daha gösterilmez.
- Aygıtın yeniden başlatılması sırasında diskteki kalıcı kapatmalar devam eder.
- Güvenlik Merkezi kaynağı bir sorun sağlamayı bırakır ve daha sonra sorunu tekrar sağlarsa sorun yeniden ortaya çıkar. Bu, kullanıcının bir uyarı gördüğü, uyarıyı reddettiği, ardından sorunu hafifletecek eylemde bulunduğu ancak daha sonra kullanıcının benzer soruna neden olan bir şey yaptığı durumlara izin vermek içindir. Bu noktada uyarı kartının yeniden ortaya çıkması gerekir.
- Sarı ve kırmızı uyarı kartları, kullanıcı bunları birden çok kez reddetmediği sürece her 180 günde bir yeniden görüntülenir.
Aşağıdaki durumlar haricinde kaynak tarafından ek davranışlara gerek duyulmamalıdır:
- Kaynak bu davranışı farklı bir şekilde uygulamaya çalışır; örneğin, sorunu asla yeniden gündeme getirmez.
- Kaynak bunu, örneğin bilgileri günlüğe kaydetmek için bir geri arama olarak kullanmaya çalışır.
Birden fazla kullanıcı/profil için veri sağlayın
SafetyCenterManager
API'si kullanıcılar ve profiller genelinde kullanılabilir. Daha fazla bilgi için bkz. Çok Kullanıcılı Uygulamalar Oluşturma . SafetyCenterManager
sağlayan Context
nesnesi bir UserHandle
örneğiyle ilişkilidir, böylece döndürülen SafetyCenterManager
örneği, söz konusu UserHandle
örneği için Güvenlik Merkezi ile etkileşime girer. Varsayılan olarak Context
, çalışan kullanıcıyla ilişkilendirilir ancak uygulamanın INTERACT_ACROSS_USERS
ve INTERACT_ACROSS_USERS_FULL
izinlerine sahip olması durumunda başka bir kullanıcı için bir örnek oluşturmak mümkündür. Bu örnek, kullanıcılar/profiller arasında arama yapmayı gösterir:
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 belirli bir kullanıcıyla ilişkili tüm yönetilen profillerin verilerini birleştirir.
Yapılandırma dosyasındaki kaynak için profile="all_profiles"
ayarlandığında aşağıdakiler gerçekleşir:
- Kullanıcı (profil üst öğesi) ve onunla ilişkili tüm yönetilen profiller (
titleForWork
örneklerini kullanan) için bir kullanıcı arayüzü girişi vardır. Profil üst öğesi ve tüm ilişkili yönetilen profiller için yenileme veya yeniden tarama sinyali gönderilir. İlişkili alıcı her profil için başlatılır ve alıcı veya uygulama
singleUser
olmadığı sürece profiller arası çağrı yapılmasına gerek kalmadan ilişkili verileri doğrudanSafetyCenterManager
sağlayabilir.Kaynağın kullanıcıya ve onun yönetilen tüm profillerine veri sağlaması beklenir. Her kullanıcı arayüzü girişinin verileri profile bağlı olarak farklı olabilir.
Test yapmak
ShadowSafetyCenterManager
erişebilir ve bunu bir 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, bu kılavuzun kapsamı dışındadır. Bu E2E testlerini yazma hakkında daha fazla bilgi için bkz. CTS testleri (CtsSafetyCenterTestCases)
Test ve dahili API'ler
Dahili API'ler ve test API'leri dahili kullanıma yönelik olduğundan bu kılavuzda ayrıntılı olarak açıklanmamıştır. Ancak gelecekte bazı dahili API'leri, OEM'lerin kendi kullanıcı arayüzlerini oluşturmalarına olanak tanıyacak şekilde genişletebiliriz ve bu kılavuzu, bunların nasıl kullanılacağına ilişkin rehberlik sağlamak üzere 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 verilir
-
Ayarlar uygulaması
Güvenlik Merkezi yönlendirmesi
Varsayılan olarak Güvenlik Merkezi'ne, yeni Güvenlik ve gizlilik girişiyle Ayarlar uygulaması aracılığıyla erişilir. Farklı bir Ayarlar uygulaması kullanıyorsanız veya Ayarlar uygulamasını değiştirdiyseniz Güvenlik Merkezi'ne nasıl erişileceğini özelleştirmeniz gerekebilir.
Güvenlik Merkezi etkinleştirildiğinde:
- Eski Gizlilik girişi gizli koddur
- Eski Güvenlik girişi gizli koddur
- Yeni Güvenlik ve gizlilik girişi kodu eklendi
- Yeni Güvenlik ve gizlilik girişi Güvenlik Merkezi koduna yönlendiriyor
-
android.settings.PRIVACY_SETTINGS
veandroid.settings.SECURITY_SETTINGS
amaç eylemleri Güvenlik Merkezi'ni açmaya yönlendirilir (kod: güvenlik , gizlilik )
Gelişmiş güvenlik ve gizlilik sayfaları
Ayarlar uygulaması, Güvenlik Merkezi'nde bulunan Diğer güvenlik ayarları ve Diğer gizlilik ayarları başlıkları altında ek ayarlar içerir:
Gelişmiş güvenlik kodu
Gelişmiş gizlilik kodu
Android 14'ten başlayarak, gelişmiş güvenlik ve gelişmiş gizlilik ayarları sayfası, "
"com.android.settings.MORE_SECURITY_PRIVACY_SETTINGS"
Daha Fazla Güvenlik ve Gizlilik" sayfası altında birleştirildi.
Güvenlik kaynakları
Güvenlik Merkezi, Ayarlar uygulaması tarafından sağlanan belirli bir dizi güvenlik kaynağıyla entegre olur:
- Kilit ekranı güvenlik kaynağı, kullanıcının özel bilgilerinin harici erişime karşı güvende tutulmasını sağlamak için kilit ekranının bir parola (veya başka bir güvenlik) ile ayarlandığını doğrular.
- Bir biyometrik güvenlik kaynağı (varsayılan olarak gizlidir), parmak izi veya yüz sensörüyle entegre olacak şekilde yüzeye çıkar.
Bu Güvenlik Merkezi kaynaklarının kaynak koduna Android kod araması yoluyla erişilebilir. Ayarlar uygulaması değiştirilmezse (paket adında, kaynak kodunda veya kilit ekranı ve biyometriyle ilgilenen kaynak kodunda değişiklik yapılmaz), bu entegrasyonun kutudan çıktığı gibi çalışması gerekir. Aksi takdirde, Ayarlar uygulamasının paket adının ve Güvenlik Merkezi ile entegre olan kaynakların ve entegrasyonun değiştirilmesi için yapılandırma dosyasının değiştirilmesi gibi bazı değişiklikler gerekebilir. Daha fazla bilgi için bkz. Yapılandırma dosyasını ve entegrasyon ayarlarını güncelleme.
PendingIntent Hakkında
Android 14 veya sonraki sürümlerde mevcut Ayarlar uygulaması Güvenlik Merkezi entegrasyonunu kullanıyorsanız aşağıda açıklanan hata düzeltilmiştir. Bu durumda bu bölümü okumak gerekli değildir.
Hatanın mevcut olmadığından emin olduğunuzda, Güvenlik Merkezi'ndeki geçici çözümü kapatmak için Ayarlar uygulamasında config_isSafetyCenterLockScreenPendingIntentFixed
XML boole kaynağı yapılandırma değerini true
olarak ayarlayın.
PendingIntent geçici çözümü
Bu hata, Ayarlar'ın hangi parçanın açılacağını belirlemek için Intent
örneği ekstralarını kullanması nedeniyle oluşur. Intent#equals
Intent
örneği ekstralarını dikkate almadığından, dişli menüsü simgesi ve giriş için PendingIntent
örneği eşit kabul edilir ve aynı kullanıcı arayüzüne gider (farklı bir kullanıcı arayüzüne gitmesi amaçlanmış olsa bile). Bu sorun, QPR sürümünde PendingIntent
örneklerinin istek koduna göre farklılaştırılmasıyla düzeltildi. Alternatif olarak bu, Intent#setId
kullanılarak ayırt edilebilir.
Dahili güvenlik kaynakları
Bazı Güvenlik Merkezi kaynakları dahilidir ve PermissionController modülü içindeki PermissionController sistem uygulamasında uygulanır. Bu kaynaklar normal Güvenlik Merkezi kaynakları gibi davranır ve özel bir muamele görmez. Bu kaynakların koduna Android kod arama yoluyla ulaşılabilir.
Bunlar esas olarak gizlilik sinyalleridir, örneğin:
- Ulaşılabilirlik
- Kullanılmayan uygulamaları otomatik olarak iptal edin
- Konum erişimi
- Bildirim dinleyicisi
- İş politikası bilgileri