Güvenlik Merkezi ile etkileşimde bulunun

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.
  • 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
  • EXTRA_SAFETY_SOURCE_USER_HANDLE
    • Dize değeri: android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE
    • UserHandle türü: İlişkili uyarı kartı için UserHandle değerini belirtir
    • İsteğe bağlı (varsayılan olarak mevcut kullanıcı)

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

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ızca SEND_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, varsa SafetySourceStatus 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ırmadan intentAction 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österilir
      • ICON_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
  • 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ğer true'dur)
  • Sabit değerler:
    • PendingIntent örnekleri bir Activity ö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 etkilemesi
    • 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 etkiler.
  • Kullanıcının bu sorun için kullanabileceği Action öğelerinin listesi. Her Action ö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ı
  • İ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). Belirtilmezse SafetySourcesGroup
  • İ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). Belirtilmezse Notification, 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
  • Değişmezler:
    • Action örnekleri listesi, benzersiz tanımlayıcılara sahip işlemlerden oluşmalıdır
    • Action örnekleri listesi, bir veya iki Action öğesi içermelidir. İşlem yapılabilirlik ISSUE_ACTIONABILITY_MANUAL değilse sıfır Action 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'nde SAFETY_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çin SAFETY_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'nin SafetySourceIssue.Action sorununun çözülmediğini takip edebilmesi için SAFETY_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çin SAFETY_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çin SAFETY_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 veya SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED ise sorun ve işlem kimlikleri sağlanmalıdır

Aşağıda, bir kaynağın Güvenlik Merkezi&#39;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: Zorunlu SafetyEvent ö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

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
  • 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ığında
      • EXTRA_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.
  • 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

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

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&#39;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ğrudan SafetyCenterManager'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 ve android.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:

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