Güvenlik Merkezi'ne yönlendir
Herhangi bir uygulama, android.content.Intent.ACTION_SAFETY_CENTER
işlemini (android.intent.action.SAFETY_CENTER
dize değeri) kullanarak Güvenlik Merkezi'ni açabilir.
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önlendirme
Belirli intent ekstralarını kullanarak belirli bir Güvenlik Merkezi uyarı kartına da yönlendirme
yapabilirsiniz. Bu ekstra özellikler, üçüncü taraflarca kullanılmak üzere tasarlanmamıştır. Bu nedenle, @SystemApi
bünyesindeki SafetyCenterManager
kapsamındadır. Bu ek özelliklere yalnızca sistem uygulamaları 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 uyarı kartının güvenlik kaynağının kimliğini belirtir
- 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
- Soruna yönlendirmenin çalışması için gereklidir
- Dize değeri:
EXTRA_SAFETY_SOURCE_USER_HANDLE
- Dize değeri:
android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE
UserHandle
türü: İlişkili uyarı kartı içinUserHandle
değerini belirtir- İsteğe bağlı (varsayılan olarak mevcut kullanıcı)
- Dize değeri:
Aşağıdaki kod snippet'i, Güvenlik Merkezi ekranını belirli bir soruna açmak için Activity
örneğin 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
'leri temsil eden birden fazla alt sayfaya bölünmüştür (Android 13'te bu, daraltılabilir girişler olarak gösterilir).
Bu ekstra intent'i kullanarak belirli bir alt sayfaya yönlendirme yapmak mümkündür:
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, Güvenlik Merkezi ekranını belirli bir alt sayfaya açmak için Activity
örneğin 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 kullanma
Güvenlik Merkezi kaynak API'lerine SafetyCenterManager
(@SystemApi
olan bir) kullanılarak erişilebilir. API yüzeyinin kodu, Kod Arama'da bulunabilir.
API'lerin uygulama kodunu Kod Arama'da bulabilirsiniz.
İzinler
Güvenlik Merkezi kaynak API'lerine yalnızca aşağıda listelenen izinleri kullanan izin verilenler listesine eklenmiş sistem uygulamaları tarafından erişilebilir. Daha fazla bilgi için Ayrıcalıklı İzinleri İzin Verilenler Listesine Ekleme bölümüne bakın.
READ_SAFETY_CENTER_STATUS
signature|privileged
SafetyCenterManager#isSafetyCenterEnabled()
API için kullanılır (Güvenlik Merkezi kaynakları için gerekmez, 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 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
Özel izinlere sahip bu izinleri yalnızca ilgili dosyaya (ör. Ayarlar uygulaması için com.android.settings.xml
dosyası ve uygulamanın AndroidManifest.xml
) ekleyerek edinebilirsiniz. İzin modeli hakkında daha fazla bilgi için protectionLevel
sayfasını inceleyin.
SafetyCenterManager'ı alma
SafetyCenterManager
, Android 13 sürümünden itibaren sistem uygulamalarından erişilebilen bir @SystemApi
sınıfıdır. 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 görüşmede, Güvenlik Merkezi'nin etkin olup olmadığı kontrol edilir. Çağrı için READ_SAFETY_CENTER_STATUS
veya SEND_SAFETY_CENTER_UPDATE
izni gerekiyor:
boolean isSafetyCenterEnabled = safetyCenterManager.isSafetyCenterEnabled();
if (isSafetyCenterEnabled) {
// …
} else {
// …
}
Veri sağlayın
Belirtilen String sourceId
öğesine sahip Güvenlik Merkezi kaynak verileri, Güvenlik Merkezi'ne SafetySourceData
nesnesiyle sağlanır. Bu nesne, bir kullanıcı arayüzü girişini ve sorunların listesini (uyarı kartları) temsil eder. Kullanıcı arayüzü girişi ve uyarı kartları, SafetySourceData
sınıfında belirtilen farklı önem düzeylerine sahip olabilir:
SEVERITY_LEVEL_UNSPECIFIED
- Önem düzeyi belirtilmedi
- Renk: Gri veya şeffaf (girişin
SafetySourcesGroup
değerine bağlı olarak) - Kullanıcı arayüzünde statik bir giriş olarak poz veren veya belirtilmemiş bir girişi gösteren dinamik veriler için kullanılır
- Uyarı kartları için kullanılmamalıdır
SEVERITY_LEVEL_INFORMATION
- Temel bilgiler veya küçük öneriler
- Renk: Yeşil
SEVERITY_LEVEL_RECOMMENDATION
- Bu sorun, kendisini riske atabileceği için kullanıcının harekete geçmesi önerilir
- Renk: Sarı
SEVERITY_LEVEL_CRITICAL_WARNING
- Risk teşkil ettiği için kullanıcının bu sorunla ilgili işlem yapması gerektiğine dair kritik uyarı
- Renk: Kırmızı
SafetySourceData
SafetySourceData
nesnesi, kullanıcı arayüzü girişi, uyarı kartları ve değişken değerlerden oluşur.
- İ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) - Sabit değerler:
SafetySourceIssue
listesi, benzersiz tanımlayıcılara sahip sorunlardan oluşmalıdır.SafetySourceIssue
örneği, varsaSafetySourceStatus
değerinden daha büyük olmamalıdır (SafetySourceStatus
SEVERITY_LEVEL_UNSPECIFIED
olduğunda,SEVERITY_LEVEL_INFORMATION
sorunlarına izin verilirse).- API yapılandırmasının uyguladığı ek koşullar karşılanmalıdır. Örneğin kaynak yalnızca soruna yönelikse bir
SafetySourceStatus
örneği sağlamamalıdır.
SafetySourceStatus
- Zorunlu
CharSequence
başlığı - Zorunlu
CharSequence
özeti - Zorunlu ö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ırmadanintentAction
kullanılır) - Şunlardan oluşan isteğe bağlı
IconAction
(girişte yan simge olarak gösterilir):- Aşağıdaki türlerden biri olması gereken simge tü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
gereklidir
- Aşağıdaki türlerden biri olması gereken simge türü:
- Kullanıcı arayüzü girişinin devre dışı olarak işaretlenmesine olanak tanıyan isteğe bağlı Boole
enabled
değeri. Böylece giriş tıklanamaz (varsayılan değertrue
'dur) - Sabit değerler:
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
altyazı - Zorunlu
CharSequence
özeti - Gerekli önem düzeyi
- İsteğe bağlı sorun kategorisi. Aşağıdakilerden 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 etkiliyor. Bu, varsayılan ayardır.ISSUE_CATEGORY_DATA
(Android 14'ten itibaren): Sorunun kullanıcının verilerini etkilemesiISSUE_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 etkiler.
- Kullanıcının bu sorun için kullanabileceği
Action
öğelerinin listesi. HerAction
örneği şunları içerir:- Zorunlu benzersiz
String
tanımlayıcısı - Zorunlu
CharSequence
etiketi - Kullanıcıyı başka bir sayfaya yönlendirmek veya işlemi doğrudan Güvenlik Merkezi ekranından işlemek için
PendingIntent
gereklidir - Bu sorunun doğrudan SafetyCenter ekranından çözülüp çözülemeyeceğini belirtmek için kullanılan isteğe bağlı boole değeri (varsayılan değer:
false
) - Sorun doğrudan Güvenlik Merkezi ekranından başarıyla çözüldüğünde kullanıcıya gösterilecek isteğe bağlı
CharSequence
başarı mesajı
- Zorunlu benzersiz
- İsteğe bağlı
PendingIntent
(Kullanıcı sorunu kapattığında çağrılan) (varsayılan hiçbir şey çağrılmaz) - Zorunlu
String
sorun türü tanımlayıcısı. Bu, sorun tanımlayıcısına benzer ancak 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 seçenek, farklı kaynaklardan aynıSafetySourceIssue
öğesinin gönderilmesine ve aynıdeduplicationGroup
değerine sahip oldukları sürece kullanıcı arayüzünde yalnızca bir kez gösterilmesine olanak tanır (Android 14'ten itibaren). Belirtilmemişse sorun hiçbir zaman tekilleştirilmez. - İlişkilendirme başlığı için isteğe bağlı
CharSequence
. Bu metin, uyarı kartının nereden kaynaklandığını gösterir (Android 14'ten itibaren). BelirtilmezseSafetySourcesGroup
- İsteğe bağlı sorun işlemleri (Android 14'ten itibaren) ve aşağıdakilerden biri olmalıdır:
ISSUE_ACTIONABILITY_MANUAL
: Kullanıcının bu sorunu manuel olarak çözmesi gerekir. Bu, varsayılan seçenektir.ISSUE_ACTIONABILITY_TIP
: Bu sorun yalnızca bir ipucudur ve kullanıcı girişi gerektirmeyebilir.ISSUE_ACTIONABILITY_AUTOMATIC
: Bu sorunla ilgili işlem yapıldıysa kullanıcıdan herhangi bir işlem yapması istenmeyebilir.
- İsteğe bağlı bildirim davranışı (Android 14'ten itibaren) şunlar arasından biri olmalıdır:
NOTIFICATION_BEHAVIOR_UNSPECIFIED
: Uyarı kartı için bildirim gerekip gerekmediğine Güvenlik Merkezi karar verir. Bu, varsayılan ayardır.NOTIFICATION_BEHAVIOR_NEVER
: Hiçbir bildirim yayınlanmaz.NOTIFICATION_BEHAVIOR_DELAYED
: Sorunun ilk kez bildirilmesinden bir süre sonra bildirim gönderilir.NOTIFICATION_BEHAVIOR_IMMEDIATELY
: Sorun bildirilir bildirilmez bir bildirim yayınlanır.
- İsteğe bağlı
Notification
: Uyarı kartıyla birlikte özel bir bildirim göstermek için (Android 14'ten itibaren). BelirtilmezseNotification
, uyarı kartından türetilir. Şunlardan oluşur:- Zorunlu
CharSequence
başlığı - Zorunlu
CharSequence
özeti - Kullanıcının bu bildirim için alabileceği
Action
öğelerinin listesi
- Zorunlu
- Değişmezler:
Action
örnekleri listesi, benzersiz tanımlayıcılara sahip işlemlerden oluşmalıdırAction
örnekleri listesi, bir veya ikiAction
öğesi içermelidir. İşlem yapılabilirlikISSUE_ACTIONABILITY_MANUAL
değilse sıfırAction
değerine izin verilir.- OnKapat
PendingIntent
,Activity
örneğini açmamalıdır - API yapılandırması tarafından zorunlu kılınan ek şartlar
Belirli olaylar olduğunda Güvenlik Merkezi'ne veriler sağlanır. Bu nedenle, kaynağın SafetySourceData
öğesine SafetyEvent
örneği sağlamasının nedenini 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
: Güvenlik Merkezi'nden gelen yenileme/yeniden tarama sinyaline yanıt verme. Yenileme/yeniden tarama isteğini izleyebilmek için, Güvenlik Merkezi'ndeSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
yerine bunu kullanın.SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
:SafetySourceIssue.Action
sorununu doğrudan Güvenlik Merkezi ekranından çözdük.SafetySourceIssue.Action
sorununun çözülmesini izlemek amacıyla Güvenlik Merkezi içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
yerine bunu kullanın.SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
:SafetySourceIssue.Action
sorununu doğrudan Güvenlik Merkezi ekranından çözmeye çalıştık ancak bunu başaramadık. Güvenlik Merkezi'ninSafetySourceIssue.Action
sorununun çözülmediğini takip edebilmesi içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
yerine bunu kullanın.SAFETY_EVENT_TYPE_DEVICE_LOCALE_CHANGED
: Cihazın dili değiştiği için sağlanan verilerin metnini güncelliyoruz. Bu işlem içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
kullanmasına izin verilmektedir.SAFETY_EVENT_TYPE_DEVICE_REBOOTED
: Güvenlik Merkezi verileri yeniden başlatma işlemi sırasında saklanmadığı için bu verileri ilk başlatma işleminin bir parçası olarak sağlıyoruz. Bu işlem içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
kullanılmasına izin verilir.
- Yenileme yayın kimliği için isteğe bağlı
String
tanımlayıcısı. SafetySourceIssue
örneği için isteğe bağlıString
tanımlayıcısının çözümlenmesi.SafetySourceIssue.Action
örneği için isteğe bağlıString
tanımlayıcısı çözümleniyor.- Sabit değerler:
- Tür
SAFETY_EVENT_TYPE_REFRESH_REQUESTED
ise yenileme yayını kimliği sağlanmalıdır - Tür
SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
veyaSAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
ise sorun ve işlem kimlikleri sağlanmalıdır
- Tü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 verileri alma
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 şeyler göstermek, 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 ya da yeni bir SafetyEvent
örneğiyle Güvenlik Merkezi'ne 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, bir SafetySourceIssue.Action
örneği çözümlenemezse de hata bildirebilirsiniz. Bu durumda, önbelleğe alınan veriler silinmez ve kullanıcı arayüzü girişi değişmez ancak kullanıcıya bir hata oluştuğunu bildiren bir mesaj gösterilir.
Hatayı, şunlardan oluşan SafetySourceErrorDetails
kullanarak 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. Yenileme veya yeniden tarama isteğine yanıt vermek, kullanıcının Güvenlik Merkezi'ni açtığında ve tarama düğmesine dokunduğunda mevcut durumu görmesini sağlar.
Bu, aşağıdaki işlemle bir yayın alarak gerçekleştirilir:
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 verilerini yenileme isteği gönderdiğinde tetiklenir
- Yalnızca sistem tarafından gönderilebilen Protected intent
- Yapılandırma dosyasında açık bir intent olarak tüm güvenlik kaynaklarına gönderilir ve
SEND_SAFETY_CENTER_UPDATE
iznini gerektirir
- 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[]
), belirli bir 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
- Tam sayı türü,
@IntDef
istek türünü temsil eder - Şunlardan biri olmalıdır:
EXTRA_REFRESH_REQUEST_TYPE_GET_DATA
: Kaynağın, verileri nispeten hızlı sağlamasını ister. Bu 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 yenileme için benzersiz bir tanımlayıcıyı temsil eder
- Dize değeri:
Güvenlik Merkezi'nden sinyal almak için BroadcastReceiver
örneği uygulayın. Yayın, alıcının ön plan hizmeti başlatmasını sağlayan ö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 örnekteki BroadcastReceiver
örneği, AndroidManifest.xml
içinde de tanımlanmıştır:
<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
yöntemini çağıracak şekilde uygulanır. Sistem sağlığı açısından, kullanıcı Güvenlik Merkezi'ni açtığında değil, yalnızca yeniden tarama sinyaline (kullanıcı tarama düğmesine dokunduğunda) yanıt vermenizi öneririz. 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
- Güvenlik Merkezi cihaz çalışırken etkinleştirildiğinde veya devre dışı bırakıldığında tetiklenir
- Başlatma sırasında çağrılmaz (bunun için
ACTION_BOOT_COMPLETED
kullanın) - Yalnızca sistem tarafından gönderilebilen korumalı intent
- Yapılandırma dosyasındaki tüm güvenlik kaynaklarına açık bir amaç olarak
gönderilir,
SEND_SAFETY_CENTER_UPDATE
izni gerekir READ_SAFETY_CENTER_STATUS
iznini gerektiren örtülü bir amaç olarak gönderilir
- 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üm işlemlerini uygulama
Çözümleme 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ı (PendingIntent.getService
) veya yayın alıcısı (PendingIntent.getBroadcast
) yapması bekleniyorsa çözümleme işlemlerini uygulamak için bir hizmeti 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 AndroidManifest.xml
içinde de tanımlanmıştır:
<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 işlemlerine yanıt verme
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 bir sorun bildirirse kullanıcı, kapatma düğmesine (uyarı kartındaki X düğmesi) dokunarak Güvenlik Merkezi ekranında bu kaynağı kapatabilir.
- Kullanıcı bir sorunu kapattığında sorun devam ederse kullanıcı arayüzünde tekrar gösterilmez.
- Cihaz yeniden başlatılırken diskteki kalıcı kapatmalar kalır.
- Güvenlik Merkezi kaynağı bir sorunu bildirmeyi bırakıp daha sonra tekrar bildirirse sorun yeniden ortaya çıkar. Bu, kullanıcının bir uyarı gördüğü, uyarıyı kapattığı, ardından sorunu hafifletecek bir işlem yaptığı ancak kullanıcının tekrar benzer bir soruna neden olan bir işlem yaptığı durumlara izin vermektir. Bu noktada uyarı kartı yeniden gösterilir.
- Sarı ve kırmızı uyarı kartları, kullanıcı tarafından birden çok kez kapatılmadığı sürece her 180 günde bir yeniden gösterilir.
Aşağıdaki durumlar hariç olmak üzere kaynak için ek davranışlar gerekmez:
- Kaynak, bu davranışı farklı bir şekilde uygulamaya çalışır. Örneğin, sorun hiçbir zaman tekrar gösterilmez.
- Kaynak, bu işlevi geri çağırma işlevi 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. SafetyCenterManager
sağlayan Context
nesnesi bir UserHandle
örneğiyle ilişkilendirilir. Bu nedenle, döndürülen SafetyCenterManager
örneği, ilgili UserHandle
örneğinin Güvenlik Merkezi ile etkileşim kurar. Varsayılan olarak Context
, çalışan kullanıcıyla ilişkilendirilir ancak uygulama INTERACT_ACROSS_USERS
ve INTERACT_ACROSS_USERS_FULL
izinlerine sahipse başka bir kullanıcı için bir örnek oluşturabilirsiniz. Bu örnekte, kullanıcılar/profiller arasında arama yapma gösterilmektedir:
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ında kaynak için profile="all_profiles"
ayarlandığında aşağıdakiler gerçekleşir:
- Kullanıcı (profil üst öğesi) ve ilişkili tüm yönetilen profilleri (
titleForWork
örneklerini kullanan) için bir UI girişi vardır. Yenileme veya yeniden tarama sinyali, ana profil ve ilişkili tüm yönetilen profiller için 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ı yapmak zorunda kalmadan ilişkili verileri doğrudanSafetyCenterManager
'ye sağlayabilir.Kaynağın, kullanıcı ve kullanıcının tüm yönetilen profilleri için veri sağlaması beklenir. Her kullanıcı arayüzü girişine ait veriler, profile bağlı olarak farklı olabilir.
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 testler bu kılavuzun kapsamı dışındadır. Bu uçtan uca testleri yazma hakkında daha fazla bilgi için CTS testleri (CtsSafetyCenterTestCases) konusuna bakın.
Test ve dahili API'ler
Dahili API'ler ve test API'leri dahili kullanım içindir. Bu nedenle, bu kılavuzda ayrıntılı olarak açıklanmamıştır. 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 yeni bir Güvenlik ve gizlilik girişiyle Ayarlar uygulamasından erişilir. 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 kod eklendi
- Yeni Güvenlik ve gizlilik girişi, Güvenlik Merkezi koduna yönlendiriyor
android.settings.PRIVACY_SETTINGS
veandroid.settings.SECURITY_SETTINGS
intent işlemleri, Güvenlik Merkezi'ni açmak üzere yönlendirilir (kod: güvenlik, gizlilik)
Gelişmiş güvenlik ve gizlilik sayfaları
Ayarlar uygulaması, Güvenlik Merkezi'nde bulunan Daha fazla güvenlik ayarı ve Diğer gizlilik ayarı başlıkları altında ek ayarlar içerir:
Gelişmiş güvenlik kodu
Gelişmiş gizlilik kodu
Android 14'ten itibaren gelişmiş güvenlik ve gelişmiş gizlilik ayarları sayfası, intent işlemi ile "Daha Fazla Güvenlik ve Gizlilik" sayfası altında birleştirildi.
"com.android.settings.MORE_SECURITY_PRIVACY_SETTINGS"
Güvenlik kaynakları
Güvenlik Merkezi, Ayarlar uygulaması tarafından sağlanan belirli güvenlik kaynaklarıyla entegredir:
- Kilit ekranı güvenlik kaynağı, kullanıcının gizli bilgilerinin harici erişime karşı korunmasını sağlamak için kilit ekranının şifre koduyla (veya başka bir güvenlikle) ayarlandığını doğrular.
- Parmak izi veya yüz sensörüyle entegre edilecek bir biyometrik güvenlik kaynağı (varsayılan olarak gizlidir) gösterilir.
Bu Güvenlik Merkezi kaynaklarının kaynak koduna Android kod araması ile erişilebilir. Ayarlar uygulamasında değişiklik yapılmamışsa (paket adı, kaynak kodu veya kilit ekranı ve biyometri ile ilgili kaynak kodunda değişiklik yapılmamışsa) bu entegrasyon kullanıma hazır olacaktır. Aksi takdirde, Ayarlar uygulamasının paket adını ve Güvenlik Merkezi ile entegre olan kaynakların yanı sıra entegrasyonu değiştirmek için yapılandırma dosyasını değiştirmek gibi bazı değişiklikler gerekebilir. Daha fazla bilgi için Yapılandırma dosyasını güncelleme ve entegrasyon ayarları bölümlerine bakın.
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üzeltildi. Bu durumda bu bölümü okumanız 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 farklılaştırarak QPR sürümünde düzeltilmiştir. Alternatif olarak, Intent#setId
kullanılarak da farklılaştırılabilir.
Dahili güvenlik kaynakları
Bazı Güvenlik Merkezi kaynakları dahilidir ve PermissionController modülündeki ConsentController sistem uygulamasında uygulanır. Bu kaynaklar, normal Güvenlik Merkezi kaynakları gibi davranır ve özel muameleye tabi değildir. Bu kaynakların kodlarına Android kodu arama özelliği aracılığıyla ulaşabilirsiniz.
Bunlar genellikle gizlilik sinyalleridir. Örneğin:
- Erişilebilirlik
- Kullanılmayan uygulamaların izinlerini otomatik olarak iptal etme
- Konum erişimi
- Bildirim dinleyici
- İş politikası bilgileri