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 çağrı 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ını 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ı
- Soruna yönlendirmenin çalışması için gereklidir
- 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ı 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 ekstra 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
Güvenlik Merkezi kaynak API'leri
SafetyCenterManager
(@SystemApi
olan). API yüzeyinin kodunu şurada bulabilirsiniz:
Kod
Arama.
API'lerin uygulama kodunu Kod bölümünde bulabilirsiniz:
Arama.
İzinler
Güvenlik Merkezi kaynak API'lerine yalnızca izin verilenler listesindeki sistem uygulamaları tarafından erişilebilir kullanabilirsiniz. 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 (kullanılmaz Güvenlik Merkezi kaynakları için yalnızca gerekli olanlarSEND_SAFETY_CENTER_UPDATE
izni)- Güvenlik Merkezi'nin etkinleştirilip etkinleştirilmediğini 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 izin verilir
Bu izinler ayrıcalıklıdır ve yalnızca
alakalı dosya, örneğin,
com.android.settings.xml
dosyası olarak indirin.AndroidManifest.xml
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 görüşmede, kampanyalarınızın
SafetyCenterManager'ı alın:
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:
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şinde ve uyarı kartlarında
SafetySourceData
sınıfında belirtilen farklı önem düzeyleri:
SEVERITY_LEVEL_UNSPECIFIED
- Önem derecesi belirtilmedi
- Renk: Gri veya şeffaf (öğenin
SafetySourcesGroup
giriş) - Kullanıcı arayüzünde statik bir giriş olarak poz veren dinamik veriler için kullanılır. belirtilmemiş bir giriş
- 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
örneğin listesi (uyarı kartları)- İsteğe bağlı
Bundle
ekstraları (14'ten itibaren) - Sabit değerler:
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ının gerektirdiği ek koşullar karşılanmalıdır.
Örneğin kaynak yalnızca soruna yönelikse,
SafetySourceStatus
örneği.
SafetySourceStatus
- Zorunlu
CharSequence
başlığı - Zorunlu
CharSequence
özeti - Zorunlu önem düzeyi
- İsteğe bağlı
PendingIntent
kullanıcıyı doğru sayfaya yönlendirmek için örnek (varsayılan olarakintentAction
kullanılır) yapılandırmadan (varsa) - Şunlardan oluşan isteğe bağlı
IconAction
(girişte yan simge olarak gösterilir):- Aşağıdaki türlerden biri olması gereken zorunlu 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
- Zorunluluk
PendingIntent
Kullanıcıyı başka bir sayfaya yönlendirmek için
- Aşağıdaki türlerden biri olması gereken zorunlu simge tü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
) - Sabit değerler:
PendingIntent
örneğinin birActivity
örneğini açması gerekir.- Giriş devre dışıysa atanmalıdır.
SEVERITY_LEVEL_UNSPECIFIED
- API yapılandırmasının getirdiği ek koşullar.
SafetySourceIssue
- Zorunlu benzersiz
String
tanımlayıcısı - Zorunlu
CharSequence
başlığı - İsteğe bağlı
CharSequence
alt başlığı - Zorunlu
CharSequence
özeti - Zorunlu ö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 etkiliyor. Bu, varsayılan ayardır.ISSUE_CATEGORY_DATA
(Android 14'ten itibaren): Sorun, kullanıcının verilerini etkiliyor.ISSUE_CATEGORY_PASSWORDS
(Android'den itibaren) 14): Sorun, kullanıcının şifreler.ISSUE_CATEGORY_PERSONAL_SAFETY
(Android'den itibaren) 14): Sorun, kullanıcının kişisel yardımcı olur.
- 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
- İsteğe bağlı
PendingIntent
kullanıcı sorunu kapattığında çağrılan (varsayılan ayar, çağrıldı) - 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ı Farklı kaynaklardanSafetySourceIssue
içeriyor ve bunu şurada yalnızca bir kez gösteriyor: AynıdeduplicationGroup
değerine sahip oldukları varsayılan kullanıcı arayüzü (Android'den itibaren) 14). Belirtilmezse sorun hiçbir zaman tekilleştirilmiş - Atıf başlığı için isteğe bağlı
CharSequence
. Bu, atıf başlığı için uyarı kartının oluşturulduğu yer (Android'i başlatma) 14). 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 çözmesi gerekiyor manuel olarak ekleyin. Bu, varsayılan ayardır.ISSUE_ACTIONABILITY_TIP
: Bu sorun yalnızca bir ipucudur ve aşağıdakileri gerektirmeyebilir olmasını sağlayabilirsiniz.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'den itibaren
14) olmalıdır. Bu değer aşağıdakilerden biri olmalıdır:
NOTIFICATION_BEHAVIOR_UNSPECIFIED
: Güvenlik Merkezi, uyarı kartı için bildirim gerekir. Bu, varsayılan ayardır.NOTIFICATION_BEHAVIOR_NEVER
: Hiçbir bildirim yayınlanmaz.NOTIFICATION_BEHAVIOR_DELAYED
: Biraz bildirim yayınlanır sorun ilk bildirildikten sonra gelir.NOTIFICATION_BEHAVIOR_IMMEDIATELY
: Ardından bildirim gönderilir sorunun bildirilir.
- İ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
örnek listesi, benzersiz ve benzersiz tanımlayıcılarAction
örnekleri listesi bir veya ikiAction
içermelidir öğeler. İşlem yapılabilirlikISSUE_ACTIONABILITY_MANUAL
değilseAction
değerinin sıfır olmasına izin verilir.- OnKapat
PendingIntent
,Activity
örneğini açmamalıdır - API yapılandırmasının getirdiği ek koşullar
Belirli olaylarla birlikte Güvenlik Merkezi'ne veriler sağlanır. Bu nedenle,
kaynağın neden SafetySourceData
tanımlayıcısını sağlaması gerektiğini belirtin
SafetyEvent
örneği.
SafetyEvent
- Zorunlu tür. Aşağıdakilerden biri olmalıdır:
SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
: Kaynağın durumu değiştirildi.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
: Şu ana kadar doğrudan Güvenlik Merkezi ekranındanSafetySourceIssue.Action
; kullan Güvenlik içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
yerine bu Center'ı kullanarakSafetySourceIssue.Action
çözümlenmekte olan sorunu izleyebilirsiniz.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, bu nedenle sağlanan verilerin metnini güncelliyoruz; bu bunun içinSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
kullanmasına izin verildi.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.- Sabit değerler:
- 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 ilişkin bir örnek verilmiştir (bu bağlantıda (tek bir uyarı kartı ile bir giriş sağlıyorsa):
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
Size ait bir kaynak için Güvenlik Merkezi'ne sağlanan son verileri alabilirsiniz:
uygulamasını indirin. Bunu kendi kullanıcı arayüzünüzde bir şeyler göstermek, verilerin
pahalı bir işlem yapmadan önce güncellenmesi gerekir;
aynı SafetySourceData
örneğini Güvenlik Merkezi'ne ileterek bazı değişikliklerle veya
yeni SafetyEvent
örneği. Test için de yararlıdır.
Güvenlik Merkezi'ne sağlanan son veriyi almak için şu kodu kullanın:
SafetySourceData lastDataProvided =
safetyCenterManager.getSafetySourceData("MySourceId");
Hata bildirin
SafetySourceData
verilerini toplayamazsanız hatayı Güvenlik ekibine bildirebilirsiniz
önbellekteki verileri temizleyen ve önbellekteki verileri gösteren bir
Ayar kontrol edilemedi gibi bir mesaj alırsınız. 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.
Hatayı, oluşturulan SafetySourceErrorDetails
bileşenini 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. 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, 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, hesabınıza ait verileri yenilemek için istek gönderdiğinde tetiklenir belirli bir uygulamanın güvenlik kaynağı
- 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 ek özellikler sağlanmıştır:
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ü,
@IntDef
istek türünü temsil eder - Şunlardan 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
: Kaynağı ister olabildiğince güncel veriler sağlamak için, genellikle kullanıcı yeniden tarama düğmesine basar
- 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
kullanır. Yayın, şunlara izin veren özel BroadcastOptions
ile gönderilir:
alıcıyı kontrol edebilirsiniz.
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 bir Güvenlik Merkezi kaynağı,
SafetyCenterManager
verileri değiştiğinde. 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
yapılandırma dosyasındaki refreshOnPageOpenAllowed="true"
alanı
bu durumlarda teslim edilen yayını almak için kaynağın ayarlanması gerekir.
Etkinleştirildiğinde veya devre dışı bırakıldığında Güvenlik Merkezi'ne yanıt ver
Güvenlik Merkezi etkinleştirildiğinde veya devre dışı bırakıldığında yanıt vermek için bu bağlantıyı kullanabilirsiniz intent işlemi:
ACTION_SAFETY_CENTER_ENABLED_CHANGED
- Dize değeri:
android.safetycenter.action.SAFETY_CENTER_ENABLED_CHANGED
. - Güvenlik Merkezi, cihaz çalışıyor
- 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, alakalı özellikleri etkinleştirmek veya devre dışı bırakmak için Cihazdaki Güvenlik Merkezi.
Çözümleme işlemlerini uygulama
Çözümleme işlemi, bir kullanıcının SafetySourceIssue.Action
doğrudan Güvenlik Merkezi ekranından çözebilirsiniz. Kullanıcı bir işlem düğmesine dokunur
ve SafetySourceIssue.Action
üzerindeki PendingIntent
örneği
devreye giren güvenlik kaynağı devreye girer ve bu da sorunu arka planda
işlem tamamlandığında Güvenlik Merkezi'ni bilgilendirir.
Güvenlik Merkezi kaynağı, çözümleme işlemlerini uygulamak için aşağıdaki durumlarda bir hizmeti kullanabilir
işlemin biraz zaman alması (PendingIntent.getService
) veya
yayın alıcı (PendingIntent.getBroadcast
).
Çözümlenen bir sorunu Güvenlik Merkezi'ne 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
, 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>
Reddedilen sorunlara yanıt verme
Aşağıdaki durumlarda tetiklenebilecek bir PendingIntent
örneği belirtebilirsiniz:
SafetySourceIssue
örneği kapatıldı. Güvenlik Merkezi şu sorunları ele alır:
kapatmalar:
- Bir kaynak bir sorun aktarırsa kullanıcı bunu Güvenlik Merkezi'nde kapatabilir ekranında kapatma düğmesine (uyarı kartındaki X düğmesi) dokunun.
- Kullanıcı bir sorunu kapattığında sorun devam ederse görünmez tekrarlıyorum.
- Cihaz yeniden başlatılırken diskteki kalıcı kapatmalar kalır.
- Güvenlik Merkezi kaynağı sorun sağlamayı durdurup ardından bu sorun yeniden gündeme gelir. 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ı tekrar 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 durumlarda kaynak, ek davranışlara ihtiyaç duymamalıdır:
- Kaynak, bu davranışı farklı bir şekilde uygulamaya çalışır. Örneğin, ve sorunu yeniden gözler önüne serer.
- Kaynak, bunu bir geri çağırma olarak kullanmaya çalışır. Örneğin, ekleyebilirsiniz.
Birden çok kullanıcı/profil için veri sağlama
SafetyCenterManager
API, kullanıcılar ve profiller genelinde kullanılabilir. Daha fazla
daha fazla bilgi için Çoklu Kullanıcı Duyarlılığı Oluşturma
Uygulamalar'a gidin. 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 bir 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ındaki kaynak için profile="all_profiles"
ayarlandığında,
aşağıdakiler gerçekleşir:
- Kullanıcı (profil üst öğesi) ve ilişkili tüm öğeleri için bir UI girişi vardır
yönetilen profiller (
titleForWork
örnekleri kullanı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şkili verileri doğrudan
SafetyCenterManager
muhatap olarak değil,singleUser
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
öğesine 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 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 ileride bazı dahili API'lerin kapsamını genişletebiliriz. kendi kullanıcı arayüzünü oluşturmalarına olanak tanımak için bu kılavuzu, konusunda yol gösterici olabilir.
İ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ını değiştirdiyseniz, Güvenlik Merkezi'nin çalışma şeklini emin olun.
Güvenlik Merkezi etkinleştirildiğinde:
- Eski Gizlilik girişi gizli kod
- Eski Güvenlik girişi gizli kod
- Yeni Güvenlik ve privacy girişi eklendi kod
- Yeni Güvenlik ve privacy 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ı, Daha fazla güvenlik ayarı altında ek ayarlar içerir ve Güvenlik Merkezi'ndeki Diğer gizlilik ayarları başlıklarına göz atabilirsiniz:
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ü yoktur.
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 edinmek için Yapılandırmayı güncelleme dosyası ve entegrasyon Ayarlar'da bulabilirsiniz.
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 bulunmadığından emin olduğunuzda XML boole kaynağı ayarlayın
Ayarlar uygulamasındaki yapılandırma değeri
Kapatmak için true
konumuna config_isSafetyCenterLockScreenPendingIntentFixed
güvenlik Merkezi'ndeki geçici bir çözümdür.
PendingIntent geçici çözümü
Bu hata, hangi ayarların kullanıldığını belirlemek için Intent
örnek ekstralarını kullanan Ayarlar'dan kaynaklanmaktadır.
parçasını da içerir. Intent#equals
, Intent
örneğini almadığı için
için PendingIntent
örneği ve dişli menü simgesi ve
her girişin eşit olduğu kabul edilir ve aynı arayüze
ayrı bir kullanıcı arayüzüne gidin). Bu sorun, QPR sürümünde şu tarihe kadar düzeltilmiştir:
PendingIntent
örneklerini istek koduna göre ayırt etme. 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 kodu Android kodu ile kullanılabilir arama.
Bunlar temel olarak gizlilik sinyalleridir. Örneğin:
- Erişilebilirlik
- Kullanılmayan uygulamaları otomatik olarak iptal et
- Konum erişimi
- Bildirim dinleyici
- İş politikası bilgileri