Güvenlik Merkezi ile etkileşime gir

Güvenlik Merkezine Yönlendir

Herhangi bir uygulama, android.content.Intent.ACTION_SAFETY_CENTER işlemini (dize değeri android.intent.action.SAFETY_CENTER ) kullanarak Güvenlik Merkezi'ni açabilir.

Güvenlik Merkezi'ni açmak için Activity örneğinin içinden arama yapın:

Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);

startActivity(openSafetyCenterIntent);

Belirli bir soruna yönlendir

Özel amaç ekstralarını kullanarak belirli bir Güvenlik Merkezi uyarı kartına yönlendirmek de mümkündür. Bu ekstraların üçüncü taraflarca kullanılması amaçlanmamıştır, dolayısıyla bunlar @SystemApi bir parçası olan SafetyCenterManager parçasıdır. Bu ekstralara yalnızca sistem uygulamaları erişebilir.

Belirli bir uyarı kartını yönlendiren amaç ekstraları:

  • EXTRA_SAFETY_SOURCE_ID
    • Dize değeri: android.safetycenter.extra.SAFETY_SOURCE_ID
    • Dizi türü: İlgili uyarı kartının güvenlik kaynağının kimliğini belirtir
    • Soruna yönlendirmenin çalışması için gerekli
  • EXTRA_SAFETY_SOURCE_ISSUE_ID
    • Dize değeri: android.safetycenter.extra.SAFETY_SOURCE_ISSUE_ID
    • Dize türü: Uyarı kartı kimliğini belirtir
    • Soruna yönlendirmenin çalışması için gerekli
  • EXTRA_SAFETY_SOURCE_USER_HANDLE
    • Dize değeri: android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE
    • UserHandle türü: İlgili uyarı kartı için UserHandle belirtir
    • İsteğe bağlı (varsayılan geçerli kullanıcıdır)

Aşağıdaki kod parçacığı, Güvenlik Merkezi ekranını belirli bir soruna açmak için bir Activity örneğinin içinden kullanılabilir:

UserHandle theUserHandleThisIssueCameFrom = …;

Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_ID, "TheSafetySourceIdThisIssueCameFrom")
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_ISSUE_ID, "TheSafetySourceIssueIdToRedirectTo")
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_USER_HANDLE, theUserHandleThisIssueCameFrom);

startActivity(openSafetyCenterIntent);

Belirli bir alt sayfaya yönlendirme (Android 14'ten itibaren)

Android 14 veya sonraki sürümlerde Güvenlik Merkezi sayfası, farklı SafetySourcesGroup temsil eden birden fazla alt sayfaya bölünmüştür (Android 13'te bu, daraltılabilir girişler olarak gösterilir).

Bu amacı ekstra kullanarak belirli bir alt sayfaya yönlendirmek mümkündür:

  • EXTRA_SAFETY_SOURCES_GROUP_ID
    • Dize değeri: android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID
    • Dize türü: SafetySourcesGroup kimliğini belirtir
    • Alt sayfaya yönlendirmenin çalışması için gereklidir

Aşağıdaki kod parçacığı, Güvenlik Merkezi ekranını belirli bir alt sayfaya açmak için bir Activity örneğinin içinden kullanılabilir:

Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID, "TheSafetySourcesGroupId");

startActivity(openSafetyCenterIntent);

Güvenlik Merkezi kaynak API'lerini kullanın

Güvenlik Merkezi kaynak API'leri, SafetyCenterManager ( @SystemApi olan) kullanılarak kullanılabilir. API yüzeyinin kodu Code Search'te mevcuttur. API'lerin uygulama kodu Code Search'te mevcuttur.

İzinler

Güvenlik Merkezi kaynak API'lerine yalnızca aşağıda listelenen izinleri kullanan izin verilenler listesindeki sistem uygulamaları tarafından erişilebilir. Ek bilgi için bkz. Ayrıcalıklı İzin İzin Verilenler Listesine Ekleme .

  • READ_SAFETY_CENTER_STATUS
    • signature|privileged
    • SafetyCenterManager#isSafetyCenterEnabled() API'si için kullanılır (Güvenlik Merkezi kaynakları için gerekli değildir, yalnızca SEND_SAFETY_CENTER_UPDATE iznine ihtiyaçları vardır)
    • Güvenlik Merkezi'nin etkin olup olmadığını kontrol eden sistem uygulamaları tarafından kullanılır
    • Yalnızca izin verilenler listesindeki sistem uygulamalarına verilir
  • SEND_SAFETY_CENTER_UPDATE
    • internal|privileged
    • Etkinleştirilen API ve Güvenlik Kaynakları API'si için kullanılır
    • Yalnızca güvenlik kaynakları tarafından kullanılır
    • Yalnızca izin verilenler listesindeki sistem uygulamalarına verilir

Bu izinler ayrıcalıklıdır ve bunları yalnızca ilgili dosyaya (örneğin, Ayarlar uygulaması için com.android.settings.xml dosyasına) ve uygulamanın AndroidManifest.xml dosyasına ekleyerek alabilirsiniz. İzin modeli hakkında daha fazla bilgi için protectionLevel bakın.

SafetyCenterManager'ı edinin

SafetyCenterManager , Android 13'ten itibaren sistem uygulamalarından erişilebilen bir @SystemApi sınıfıdır. Bu çağrı, SafetyCenterManager'ın nasıl edinileceğini gösterir:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
  // Must be on T or above to interact with Safety Center.
  return;
}
SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
if (safetyCenterManager == null) {
  // Should not be null on T.
  return;
}

Güvenlik Merkezinin etkin olup olmadığını kontrol edin

Bu çağrı, Güvenlik Merkezi'nin etkin olup olmadığını kontrol eder. Çağrı, READ_SAFETY_CENTER_STATUS veya SEND_SAFETY_CENTER_UPDATE iznini gerektirir:

boolean isSafetyCenterEnabled = safetyCenterManager.isSafetyCenterEnabled();
if (isSafetyCenterEnabled) {
  // …
} else {
  // …
}

Veri sağlamak

Belirtilen String sourceId sahip Güvenlik Merkezi kaynak verileri, bir kullanıcı arayüzü girişini ve sorunların listesini (uyarı kartları) temsil eden SafetySourceData nesnesiyle Güvenlik Merkezi'ne sağlanır. Kullanıcı arayüzü girişi ve uyarı kartları, SafetySourceData sınıfında belirtilen farklı önem derecelerine sahip olabilir:

  • SEVERITY_LEVEL_UNSPECIFIED
    • Önem derecesi belirtilmedi
    • Renk: Gri veya şeffaf (girişin SafetySourcesGroup bağlı olarak)
    • Kullanıcı arayüzünde statik bir giriş gibi görünen dinamik veriler için veya belirtilmemiş bir girişi göstermek için kullanılır
    • Uyarı kartları için kullanılmamalıdır
  • SEVERITY_LEVEL_INFORMATION
    • Temel bilgiler veya küçük öneri
    • Yeşil renk
  • SEVERITY_LEVEL_RECOMMENDATION
    • Kullanıcıyı riske atabileceği için bu sorunla ilgili işlem yapması önerisi
    • Sarı renk
  • SEVERITY_LEVEL_CRITICAL_WARNING
    • Risk teşkil ettiğinden kullanıcının bu sorunla ilgili işlem yapması gerektiğine dair kritik uyarı
    • Kırmızı renk

SafetySourceData

SafetySourceData nesnesi bir kullanıcı arayüzü girişi, uyarı kartları ve değişmezlerden oluşur.

  • İsteğe bağlı SafetySourceStatus örneği (UI girişi)
  • SafetySourceIssue örneklerinin listesi (uyarı kartları)
  • İsteğe Bağlı Bundle ekstraları (14'ten Başlayan)
  • Değişmezler:
    • SafetySourceIssue listesi benzersiz tanımlayıcılara sahip sorunlardan oluşmalıdır.
    • SafetySourceIssue örneği, eğer varsa SafetySourceStatus daha önemli olmamalıdır ( SafetySourceStatus SEVERITY_LEVEL_UNSPECIFIED olmadığı sürece, bu durumda SEVERITY_LEVEL_INFORMATION sorunlarına izin verilir).
    • API yapılandırmasının zorunlu kıldığı ek gereksinimlerin karşılanması gerekir; örneğin, kaynak yalnızca soruna yönelikse SafetySourceStatus örneği sağlamamalıdır.

SafetySourceStatus

  • Gerekli CharSequence başlığı
  • Gerekli CharSequence özeti
  • Gerekli önem düzeyi
  • Kullanıcıyı doğru sayfaya yönlendirmek için isteğe bağlı PendingIntent örneği (varsayılan, varsa intentAction kullanır)
  • İsteğe bağlı IconAction (girişte yan simge olarak gösterilir) aşağıdakilerden oluşur:
    • Aşağıdaki türlerden biri olması gereken gerekli simge türü:
      • ICON_TYPE_GEAR : Kullanıcı arayüzü girişinin yanında dişli olarak gösterilir
      • ICON_TYPE_INFO : Kullanıcı arayüzü girişinin yanında bir bilgi simgesi olarak gösterilir
    • Kullanıcıyı başka bir sayfaya yönlendirmek için gerekli PendingIntent
  • Kullanıcı arayüzü girişinin devre dışı olarak işaretlenmesine izin veren ve tıklanabilir olmamasını sağlayan isteğe bağlı boole enabled değeri (varsayılan true )
  • Değişmezler:
    • PendingIntent örnekleri bir Activity örneğini açmalıdır.
    • Giriş devre dışı bırakılırsa SEVERITY_LEVEL_UNSPECIFIED olarak atanmalıdır.
    • API yapılandırmasının getirdiği ek gereksinimler.

SafetySourceIssue

  • Gerekli benzersiz String tanımlayıcısı
  • Gerekli CharSequence başlığı
  • İsteğe bağlı CharSequence altyazısı
  • Gerekli CharSequence özeti
  • Gerekli önem düzeyi
  • Aşağıdakilerden biri olması gereken isteğe bağlı sorun kategorisi:
    • ISSUE_CATEGORY_DEVICE : Sorun kullanıcının cihazını etkiliyor.
    • ISSUE_CATEGORY_ACCOUNT : Sorun, kullanıcının hesaplarını etkiliyor.
    • ISSUE_CATEGORY_GENERAL : Sorun kullanıcının genel güvenliğini etkiliyor. Bu varsayılandır.
    • ISSUE_CATEGORY_DATA (Android 14'ten itibaren): Sorun, kullanıcının verilerini etkiliyor.
    • ISSUE_CATEGORY_PASSWORDS (Android 14'ten itibaren): Sorun, kullanıcının şifrelerini etkiliyor.
    • ISSUE_CATEGORY_PERSONAL_SAFETY (Android 14'ten itibaren): Sorun kullanıcının kişisel güvenliğini etkiliyor.
  • Kullanıcının bu sorun için gerçekleştirebileceği Action öğelerinin listesi; her bir Action örneği şunlardan oluşur:
    • Gerekli benzersiz String tanımlayıcısı
    • Gerekli CharSequence etiketi
    • Kullanıcıyı başka bir sayfaya yönlendirmek veya eylemi doğrudan Güvenlik Merkezi ekranından işlemek için PendingIntent gereklidir
    • Bu sorunun doğrudan Güvenlik Merkezi ekranından çözülüp çözülemeyeceğini belirtmek için isteğe bağlı boole (varsayılan değer false )
    • Sorun doğrudan Güvenlik Merkezi ekranından başarıyla çözüldüğünde kullanıcıya görüntülenecek isteğe bağlı CharSequence başarı mesajı
  • Kullanıcı sorunu kapattığında çağrılan isteğe bağlı PendingIntent (varsayılan olarak hiçbir şey çağrılmaz)
  • Gerekli String sorun türü tanımlayıcısı; bu, sorun tanımlayıcıya benzer ancak benzersiz olması gerekmez ve günlüğe kaydetme için kullanılır
  • Tekilleştirme kimliği için İsteğe Bağlı String ; bu, aynı SafetySourceIssue farklı kaynaklardan gönderilmesine ve aynı deduplicationGroup sahip oldukları varsayılarak kullanıcı arayüzünde yalnızca bir kez gösterilmesine olanak tanır (Android 14'ten itibaren). Belirtilmediği takdirde sorun hiçbir zaman tekilleştirilmez
  • İlişkilendirme başlığı için isteğe bağlı CharSequence ; bu, uyarı kartının nereden geldiğini gösteren bir metindir (Android 14'ten itibaren). Belirtilmemişse SafetySourcesGroup başlığını kullanır
  • İsteğe bağlı sorunla ilgili işlem yapılabilirlik (Android 14'ten itibaren): Aşağıdakilerden biri olmalıdır:
    • ISSUE_ACTIONABILITY_MANUAL : Kullanıcının bu sorunu manuel olarak çözmesi gerekiyor. Bu varsayılandır.
    • ISSUE_ACTIONABILITY_TIP : Bu sorun yalnızca bir ipucudur ve herhangi bir kullanıcı girişi gerektirmeyebilir.
    • ISSUE_ACTIONABILITY_AUTOMATIC : Bu soruna zaten müdahale edildi ve herhangi bir kullanıcı girişi gerektirmeyebilir.
  • Aşağıdakilerden biri olması gereken isteğe bağlı bildirim davranışı (Android 14'ten itibaren):
    • NOTIFICATION_BEHAVIOR_UNSPECIFIED : Uyarı kartı için bildirim gerekip gerekmediğine Güvenlik Merkezi karar verecektir. Bu varsayılandır.
    • NOTIFICATION_BEHAVIOR_NEVER : Hiçbir bildirim gönderilmedi.
    • NOTIFICATION_BEHAVIOR_DELAYED : Sorunun ilk rapor edilmesinden bir süre sonra bir bildirim yayınlanır.
    • NOTIFICATION_BEHAVIOR_IMMEDIATELY : Sorun bildirilir bildirilmez bir bildirim gönderilir.
  • Uyarı kartıyla birlikte özel bir bildirim göstermek için İsteğe Bağlı Notification (Android 14'ten itibaren). Belirtilmediği takdirde Notification , uyarı kartından türetilir. Oluşan:
    • Gerekli CharSequence başlığı
    • Gerekli CharSequence özeti
    • Kullanıcının bu bildirim için gerçekleştirebileceği Action öğelerinin listesi
  • Değişmezler:
    • Action örnekleri listesi benzersiz tanımlayıcılara sahip eylemlerden 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 izin verilir.
    • OnDismiss PendingIntent bir Activity örneğini açmamalıdır
    • API yapılandırmasının getirdiği ek gereksinimler

Veriler belirli olaylar üzerine Güvenlik Merkezi'ne sağlanır; bu nedenle, kaynağın SafetySourceData bir SafetyEvent örneği sağlamasına neyin sebep olduğunu belirtmek gerekir.

SafetyEvent

  • Aşağıdakilerden biri olması gereken gerekli tür:
    • SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED : Kaynağın durumu değişti.
    • SAFETY_EVENT_TYPE_REFRESH_REQUESTED : Güvenlik Merkezi'nden gelen yenileme/yeniden tarama sinyaline yanıt verme; Güvenlik Merkezi'nin yenileme/yeniden tarama isteğini izleyebilmesi için SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED yerine bunu kullanın.
    • SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED : SafetySourceIssue.Action doğrudan Güvenlik Merkezi ekranından çözdük; Güvenlik Merkezi'nin çözülmekte olan SafetySourceIssue.Action izleyebilmesi için SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED yerine bunu kullanın.
    • SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED : SafetySourceIssue.Action doğrudan Güvenlik Merkezi ekranından çözmeye çalıştık, ancak bunu başaramadık; Güvenlik Merkezi'nin SafetySourceIssue.Action takip edebilmesi için SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED yerine bunu kullanın. İşlem başarısız oldu.
    • SAFETY_EVENT_TYPE_DEVICE_LOCALE_CHANGED : Cihazın dili değişti, bu nedenle sağlanan verilerin metnini güncelliyoruz; bunun için SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED kullanımına izin verilir.
    • SAFETY_EVENT_TYPE_DEVICE_REBOOTED : Güvenlik Merkezi verileri yeniden başlatmalarda kalıcı olmadığından, bu verileri ilk önyüklemenin parçası olarak sağlıyoruz; bunun için SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED kullanımına izin verilir.
  • Yayın kimliğini yenilemek için isteğe bağlı String tanımlayıcı.
  • SafetySourceIssue örneği için isteğe bağlı String tanımlayıcısının çözülmesi.
  • SafetySourceIssue.Action örneğinin isteğe bağlı String tanımlayıcısı çözümleniyor.
  • Değişmezler:
    • Tür SAFETY_EVENT_TYPE_REFRESH_REQUESTED ise yenileme yayın kimliğinin sağlanması gerekir
    • Tür SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED veya SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED ise sorun ve eylem kimlikleri 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 durumda tek bir uyarı kartıyla giriş sağlamaktadır):

PendingIntent redirectToMyScreen =
    PendingIntent.getActivity(
        context, requestCode, redirectToMyScreenIntent, PendingIntent.FLAG_IMMUTABLE);
SafetySourceData safetySourceData =
    new SafetySourceData.Builder()
        .setStatus(
            new SafetySourceStatus.Builder(
                    "title", "summary", SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION)
                .setPendingIntent(redirectToMyScreen)
                .build())
        .addIssue(
            new SafetySourceIssue.Builder(
                    "MyIssueId",
                    "title",
                    "summary",
                    SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION,
                    "MyIssueTypeId")
                .setSubtitle("subtitle")
                .setIssueCategory(SafetySourceIssue.ISSUE_CATEGORY_DEVICE)
                .addAction(
                    new SafetySourceIssue.Action.Builder(
                            "MyIssueActionId", "label", redirectToMyScreen)
                        .build())
                .build())
        .build();
SafetyEvent safetyEvent = new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
safetyCenterManager.setSafetySourceData("MySourceId", safetySourceData, safetyEvent);

Sağlanan son verileri alın

Uygulamanıza ait bir kaynak için Güvenlik Merkezi'ne sağlanan son verileri alabilirsiniz. Bunu, kendi kullanıcı arayüzünüzde bir şeyi ortaya çıkarmak, pahalı bir işlem gerçekleştirmeden önce verilerin güncellenmesi gerekip gerekmediğini kontrol etmek veya aynı SafetySourceData örneğini bazı değişikliklerle veya yeni bir SafetyEvent örneğiyle Güvenlik Merkezine sağlamak için kullanabilirsiniz. Ayrıca test etmek için de faydalıdır.

Güvenlik Merkezi'ne sağlanan son verileri almak için bu kodu kullanın:

SafetySourceData lastDataProvided = safetyCenterManager.getSafetySourceData("MySourceId");

Hata bildir

SafetySourceData verilerini toplayamıyorsanız, girişi griye çeviren, önbelleğe alınan verileri temizleyen ve Ayar kontrol edilemedi gibi bir mesaj sağlayan Güvenlik Merkezi'ne hatayı bildirebilirsiniz. SafetySourceIssue.Action örneğinin çözümlenmesi başarısız olursa da bir hata bildirebilirsiniz; bu durumda önbelleğe alınan veriler temizlenmez ve kullanıcı arayüzü girişi değişmez; ancak kullanıcıya bir şeylerin ters gittiğini bildiren bir mesaj gösterilir.

Aşağıdakilerden oluşan SafetySourceErrorDetails kullanarak hatayı sağlayabilirsiniz:

  • SafetySourceErrorDetails : Gerekli 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 veriler sağlamak için Güvenlik Merkezinden sinyal alabilirsiniz. Bir yenileme veya yeniden tarama isteğine yanıt vermek, kullanıcının Güvenlik Merkezi'ni açarken ve tarama düğmesine dokunduğunda mevcut durumu görüntülemesini sağlar.

Bu, aşağıdaki eylemi içeren bir yayın alınarak yapılır:

  • ACTION_REFRESH_SAFETY_SOURCES
    • Dize değeri: android.safetycenter.action.REFRESH_SAFETY_SOURCES
    • Güvenlik Merkezi belirli bir uygulama için güvenlik kaynağının verilerinin yenilenmesine yönelik bir istek gönderdiğinde tetiklendi
    • Yalnızca sistem tarafından gönderilebilen korumalı niyet
    • Yapılandırma dosyasındaki tüm güvenlik kaynaklarına açık bir amaç olarak gönderilir ve SEND_SAFETY_CENTER_UPDATE iznini gerektirir

Bu yayının bir parçası olarak aşağıdaki ekstralar sağlanmaktadır:

  • EXTRA_REFRESH_SAFETY_SOURCE_IDS
    • Dize değeri: android.safetycenter.extra.REFRESH_SAFETY_SOURCE_IDS
    • Dize dizi türü ( String[] ), verilen uygulama için yenilenecek kaynak kimliklerini temsil eder
  • EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE

    • Dize değeri: android.safetycenter.extra.REFRESH_SAFETY_SOURCES_REQUEST_TYPE
    • Tamsayı türü, @IntDef istek türünü temsil eder
    • Şunlardan biri olmalı:
      • EXTRA_REFRESH_REQUEST_TYPE_GET_DATA : Genellikle kullanıcı sayfayı açtığında kaynaktan verileri nispeten hızlı sağlamasını ister
      • EXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA : Genellikle kullanıcı yeniden tarama düğmesine bastığında kaynaktan mümkün olduğu kadar taze veri sağlamasını ister
  • 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 bir BroadcastReceiver örneği uygulayın. Yayın, alıcının bir ön plan hizmetini başlatmasına olanak tanıyan özel BroadcastOptions ile gönderilir.

BroadcastReceiver bir yenileme isteğine yanıt verir:

public final class SafetySourceReceiver extends BroadcastReceiver {
  // All the safety sources owned by this application.
  private static final String[] ALL_SAFETY_SOURCES = new String[] {"MySourceId1", "…"};
  @Override
  public void onReceive(Context context, Intent intent) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
      // Must be on T or above to interact with Safety Center.
      return;
    }
    String action = intent.getAction();
    if (!SafetyCenterManager.ACTION_REFRESH_SAFETY_SOURCES.equals(action)) {
      return;
    }
    String refreshBroadcastId =
        intent.getStringExtra(SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID);
    if (refreshBroadcastId == null) {
      // Should always be provided.
      return;
    }
    String[] sourceIds =
        intent.getStringArrayExtra(SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCE_IDS);
    if (sourceIds == null) {
      sourceIds = ALL_SAFETY_SOURCES;
    }
    int requestType =
        intent.getIntExtra(
            SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE,
            SafetyCenterManager.EXTRA_REFRESH_REQUEST_TYPE_GET_DATA);
    SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
    if (safetyCenterManager == null) {
      // Should not be null on T.
      return;
    }
    if (!safetyCenterManager.isSafetyCenterEnabled()) {
      // Preferably, no Safety Source code should be run if Safety Center is disabled.
      return;
    }
    SafetyEvent refreshSafetyEvent =
        new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_REFRESH_REQUESTED)
            .setRefreshBroadcastId(refreshBroadcastId)
            .build();
    for (String sourceId : sourceIds) {
      SafetySourceData safetySourceData = getSafetySourceDataFor(sourceId, requestType);
      // Set the data (or report an error with reportSafetySourceError, if something went wrong).
      safetyCenterManager.setSafetySourceData(sourceId, safetySourceData, refreshSafetyEvent);
    }
  }
  private SafetySourceData getSafetySourceDataFor(String sourceId, int requestType) {
    switch (requestType) {
      case SafetyCenterManager.EXTRA_REFRESH_REQUEST_TYPE_GET_DATA:
        return getRefreshSafetySourceDataFor(sourceId);
      case SafetyCenterManager.EXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA:
        return getRescanSafetySourceDataFor(sourceId);
      default:
    }
    return getRefreshSafetySourceDataFor(sourceId);
  }
  // Data to provide when the user opens the page or on specific events.
  private SafetySourceData getRefreshSafetySourceDataFor(String sourceId) {
    // Get data for the source, if it's a fast operation it could potentially be executed in the
    // receiver directly.
    // Otherwise, it must start some kind of foreground service or expedited job.
    return null;
  }
  // Data to provide when the user pressed the rescan button.
  private SafetySourceData getRescanSafetySourceDataFor(String sourceId) {
    // Could be implemented the same way as getRefreshSafetySourceDataFor, depending on the source's
    // need.
    // Otherwise, could potentially perform a longer task.
    // In which case, it must start some kind of foreground service or expedited job.
    return null;
  }
}

Yukarıdaki örnekte BroadcastReceiver aynı örneği AndroidManifest.xml dosyasında bildirildi:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="…">
    <application>
    <!-- … -->
        <receiver android:name=".SafetySourceReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="android.safetycenter.action.REFRESH_SAFETY_SOURCES"/>
            </intent-filter>
        </receiver>
    <!-- … -->
    </application>
</manifest>

İdeal olarak bir Güvenlik Merkezi kaynağı, verileri değiştiğinde SafetyCenterManager çağıracak şekilde uygulanır. Sistem sağlığı nedenleriyle, kullanıcı Güvenlik Merkezini açtığında değil, yalnızca yeniden tarama sinyaline (kullanıcı tarama düğmesine dokunduğunda) yanıt vermenizi öneririz. Bu işlevsellik gerekliyse, bu durumlarda kaynağın teslim edilen yayını alması için yapılandırma dosyasındaki refreshOnPageOpenAllowed="true" alanının ayarlanması gerekir.

Etkinleştirildiğinde veya devre dışı bırakıldığında Güvenlik Merkezine yanıt verme

Bu amaç eylemini kullanarak Güvenlik Merkezi etkinleştirildiğinde veya devre dışı bırakıldığında yanıt verebilirsiniz:

  • ACTION_SAFETY_CENTER_ENABLED_CHANGED
    • Dize değeri: android.safetycenter.action.SAFETY_CENTER_ENABLED_CHANGED
    • Cihaz çalışırken Güvenlik Merkezi etkinleştirildiğinde veya devre dışı bırakıldığında tetiklenir
    • Önyükleme sırasında çağrılmadı (bunun için ACTION_BOOT_COMPLETED kullanın)
    • Yalnızca sistem tarafından gönderilebilen korumalı niyet
    • Açık bir amaç olarak yapılandırma dosyasındaki tüm güvenlik kaynaklarına gönderilir, SEND_SAFETY_CENTER_UPDATE izni gerektirir
    • READ_SAFETY_CENTER_STATUS iznini gerektiren örtülü bir amaç olarak gönderildi

Bu amaç eylemi, cihazdaki Güvenlik Merkezi ile ilgili özellikleri etkinleştirmek veya devre dışı bırakmak için kullanışlıdır.

Çözüm eylemlerini uygulayın

Çözümleme eylemi, kullanıcının doğrudan Güvenlik Merkezi ekranından çözebileceği bir SafetySourceIssue.Action örneğidir. Kullanıcı bir eylem düğmesine dokunur ve SafetySourceIssue.Action PendingIntent örneğine dokunur. Güvenlik kaynağı tarafından gönderilen eylem tetiklenir; bu, sorunu arka planda çözer ve işlem tamamlandığında Güvenlik Merkezi'ne bilgi verir.

Çözümleme eylemlerini uygulamak için Güvenlik Merkezi kaynağı, işlemin biraz zaman alması bekleniyorsa bir hizmeti ( PendingIntent.getService ) veya bir yayın alıcısını ( PendingIntent.getBroadcast ) kullanabilir.

Güvenlik Merkezi'ne çözüme yönelik bir sorun göndermek için bu kodu kullanın:

Intent resolveIssueBroadcastIntent =
    new Intent("my.package.name.MY_RESOLVING_ACTION").setClass(ResolveActionReceiver.class);
PendingIntent resolveIssue =
    PendingIntent.getBroadcast(
        context, requestCode, resolveIssueBroadcastIntent, PendingIntent.FLAG_IMMUTABLE);
SafetySourceData safetySourceData =
    new SafetySourceData.Builder()
        .setStatus(
            new SafetySourceStatus.Builder(
                    "title", "summary", SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION)
                .setPendingIntent(redirectToMyScreen)
                .build())
        .addIssue(
            new SafetySourceIssue.Builder(
                    "MyIssueId",
                    "title",
                    "summary",
                    SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION,
                    "MyIssueTypeId")
                .setIssueCategory(SafetySourceIssue.ISSUE_CATEGORY_DEVICE)
                .addAction(
                    new SafetySourceIssue.Action.Builder(
                            "MyIssueActionId", "label", resolveIssue)
                        .setWillResolve(true)
                        .build())
                .build())
        .build();
SafetyEvent safetyEvent = new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
safetyCenterManager.setSafetySourceData("MySourceId", safetySourceData, safetyEvent);

BroadcastReceiver eylemi çözer:

public final class ResolveActionReceiver extends BroadcastReceiver {
  private static final String MY_RESOLVING_ACTION = "my.package.name.MY_RESOLVING_ACTION";
  @Override
  public void onReceive(Context context, Intent intent) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
      // Must be on T or above to interact with Safety Center.
      return;
    }
    String action = intent.getAction();
    if (!MY_RESOLVING_ACTION.equals(action)) {
      return;
    }
    SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
    if (safetyCenterManager == null) {
      // Should not be null on T.
      return;
    }
    if (!safetyCenterManager.isSafetyCenterEnabled()) {
      // Preferably, no Safety Source code should be run if Safety Center is disabled.
      return;
    }
    resolveTheIssue();
    SafetyEvent resolveActionSafetyEvent =
        new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED)
            .setSafetySourceIssueId("MyIssueId")
            .setSafetySourceIssueActionId("MyIssueActionId")
            .build();
    SafetySourceData dataWithoutTheIssue = …;
    // Set the data (or report an error with reportSafetySourceError and
    // SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED, if something went wrong).
    safetyCenterManager.setSafetySourceData("MySourceId", dataWithoutTheIssue, resolveActionSafetyEvent);
  }

  private void resolveTheIssue() {
    // Resolves the issue for the user. Given this a BroadcastReceiver, this should be a fast action.
    // Otherwise, a foreground service and PendingIntent.getService should be used instead (or a job
    // could be scheduled here, too).
  }
}

Yukarıdaki örnekte BroadcastReceiver aynı örneği AndroidManifest.xml dosyasında bildirildi:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="…">
    <application>
    <!-- … -->
        <receiver android:name=".ResolveActionReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="my.package.name.MY_RESOLVING_ACTION"/>
            </intent-filter>
        </receiver>
    <!-- … -->
    </application>
</manifest>

İşten çıkarmalara yanıt

Bir SafetySourceIssue örneği kapatıldığında tetiklenebilecek bir PendingIntent örneği belirtebilirsiniz. Güvenlik Merkezi bu işten çıkarmalarla ilgilenir:

  • Bir kaynak bir sorunu gündeme getirirse kullanıcı, Güvenlik Merkezi ekranında kapat düğmesine (uyarı kartındaki X düğmesi) dokunarak sorunu kapatabilir.
  • Kullanıcı bir sorunu kapattığında sorun devam ederse kullanıcı arayüzünde bir daha gösterilmez.
  • Aygıtın yeniden başlatılması sırasında diskteki kalıcı kapatmalar devam eder.
  • Güvenlik Merkezi kaynağı bir sorun sağlamayı bırakır ve daha sonra sorunu tekrar sağlarsa sorun yeniden ortaya çıkar. Bu, kullanıcının bir uyarı gördüğü, uyarıyı reddettiği, ardından sorunu hafifletecek eylemde bulunduğu ancak daha sonra kullanıcının benzer soruna neden olan bir şey yaptığı durumlara izin vermek içindir. Bu noktada uyarı kartının yeniden ortaya çıkması gerekir.
  • Sarı ve kırmızı uyarı kartları, kullanıcı bunları birden çok kez reddetmediği sürece her 180 günde bir yeniden görüntülenir.

Aşağıdaki durumlar haricinde kaynak tarafından ek davranışlara gerek duyulmamalıdır:

  • Kaynak bu davranışı farklı bir şekilde uygulamaya çalışır; örneğin, sorunu asla yeniden gündeme getirmez.
  • Kaynak bunu, örneğin bilgileri günlüğe kaydetmek için bir geri arama olarak kullanmaya çalışır.

Birden fazla kullanıcı/profil için veri sağlayın

SafetyCenterManager API'si kullanıcılar ve profiller genelinde kullanılabilir. Daha fazla bilgi için bkz. Çok Kullanıcılı Uygulamalar Oluşturma . SafetyCenterManager sağlayan Context nesnesi bir UserHandle örneğiyle ilişkilidir, böylece döndürülen SafetyCenterManager örneği, söz konusu UserHandle örneği için Güvenlik Merkezi ile etkileşime girer. Varsayılan olarak Context , çalışan kullanıcıyla ilişkilendirilir ancak uygulamanın INTERACT_ACROSS_USERS ve INTERACT_ACROSS_USERS_FULL izinlerine sahip olması durumunda başka bir kullanıcı için bir örnek oluşturmak mümkündür. Bu örnek, kullanıcılar/profiller arasında arama yapmayı gösterir:

Context userContext = context.createContextAsUser(userHandle, 0);
SafetyCenterManager userSafetyCenterManager = userContext.getSystemService(SafetyCenterManager.class);
if (userSafetyCenterManager == null) {
  // Should not be null on T.
  return;
}
// Calls to userSafetyCenterManager will provide data for the given userHandle

Cihazdaki her kullanıcının birden fazla yönetilen profili olabilir. Güvenlik Merkezi her kullanıcı için farklı veriler sağlar ancak belirli bir kullanıcıyla ilişkili tüm yönetilen profillerin verilerini birleştirir.

Yapılandırma dosyasındaki kaynak için profile="all_profiles" ayarlandığında aşağıdakiler gerçekleşir:

  • Kullanıcı (profil üst öğesi) ve onunla ilişkili tüm yönetilen profiller ( titleForWork örneklerini kullanan) için bir kullanıcı arayüzü girişi vardır.
  • Profil üst öğesi ve tüm ilişkili yönetilen profiller için yenileme veya yeniden tarama sinyali gönderilir. İlişkili alıcı her profil için başlatılır ve alıcı veya uygulama singleUser olmadığı sürece profiller arası çağrı yapılmasına gerek kalmadan ilişkili verileri doğrudan SafetyCenterManager sağlayabilir.

  • Kaynağın kullanıcıya ve onun yönetilen tüm profillerine veri sağlaması beklenir. Her kullanıcı arayüzü girişinin verileri profile bağlı olarak farklı olabilir.

Test yapmak

ShadowSafetyCenterManager erişebilir ve bunu bir Robolectric testinde kullanabilirsiniz.

private static final String MY_SOURCE_ID = "MySourceId";

private final MyClass myClass = …;
private final SafetyCenterManager safetyCenterManager = getApplicationContext().getSystemService(SafetyCenterManager.class);

@Test
public void whenRefreshingData_providesDataToSafetyCenterForMySourceId() {
    shadowOf(safetyCenterManager).setSafetyCenterEnabled(true);
    setupDataForMyClass(…);

    myClass.refreshData();

    SafetySourceData expectedSafetySourceData = …;
    assertThat(safetyCenterManager.getSafetySourceData(MY_SOURCE_ID)).isEqualTo(expectedSafetySourceData);
    SafetyEvent expectedSafetyEvent = …;
    assertThat(shadowOf(safetyCenterManager).getLastSafetyEvent(MY_SOURCE_ID)).isEqualTo(expectedSafetyEvent);
}

Daha fazla uçtan uca (E2E) test yazabilirsiniz ancak bu, bu kılavuzun kapsamı dışındadır. Bu E2E testlerini yazma hakkında daha fazla bilgi için bkz. CTS testleri (CtsSafetyCenterTestCases)

Test ve dahili API'ler

Dahili API'ler ve test API'leri dahili kullanıma yönelik olduğundan bu kılavuzda ayrıntılı olarak açıklanmamıştır. Ancak gelecekte bazı dahili API'leri, OEM'lerin kendi kullanıcı arayüzlerini oluşturmalarına olanak tanıyacak şekilde genişletebiliriz ve bu kılavuzu, bunların nasıl kullanılacağına ilişkin rehberlik sağlamak üzere güncelleyeceğiz.

İzinler

  • MANAGE_SAFETY_CENTER
    • internal|installer|role
    • Dahili Güvenlik Merkezi API'leri için kullanılır
    • Yalnızca PermissionController'a ve kabuğa verilir

Ayarlar uygulaması

Güvenlik Merkezi yönlendirmesi

Varsayılan olarak Güvenlik Merkezi'ne, yeni Güvenlik ve gizlilik girişiyle Ayarlar uygulaması aracılığıyla erişilir. Farklı bir Ayarlar uygulaması kullanıyorsanız veya Ayarlar uygulamasını değiştirdiyseniz Güvenlik Merkezi'ne nasıl erişileceğini özelleştirmeniz gerekebilir.

Güvenlik Merkezi etkinleştirildiğinde:

  • Eski Gizlilik girişi gizli koddur
  • Eski Güvenlik girişi gizli koddur
  • Yeni Güvenlik ve gizlilik girişi kodu eklendi
  • Yeni Güvenlik ve gizlilik girişi Güvenlik Merkezi koduna yönlendiriyor
  • android.settings.PRIVACY_SETTINGS ve android.settings.SECURITY_SETTINGS amaç eylemleri Güvenlik Merkezi'ni açmaya yönlendirilir (kod: güvenlik , gizlilik )

Gelişmiş güvenlik ve gizlilik sayfaları

Ayarlar uygulaması, Güvenlik Merkezi'nde bulunan Diğer güvenlik ayarları ve Diğer gizlilik ayarları başlıkları altında ek ayarlar içerir:

Güvenlik kaynakları

Güvenlik Merkezi, Ayarlar uygulaması tarafından sağlanan belirli bir dizi güvenlik kaynağıyla entegre olur:

  • Kilit ekranı güvenlik kaynağı, kullanıcının özel bilgilerinin harici erişime karşı güvende tutulmasını sağlamak için kilit ekranının bir parola (veya başka bir güvenlik) ile ayarlandığını doğrular.
  • Bir biyometrik güvenlik kaynağı (varsayılan olarak gizlidir), parmak izi veya yüz sensörüyle entegre olacak şekilde yüzeye çıkar.

Bu Güvenlik Merkezi kaynaklarının kaynak koduna Android kod araması yoluyla erişilebilir. Ayarlar uygulaması değiştirilmezse (paket adında, kaynak kodunda veya kilit ekranı ve biyometriyle ilgilenen kaynak kodunda değişiklik yapılmaz), bu entegrasyonun kutudan çıktığı gibi çalışması gerekir. Aksi takdirde, Ayarlar uygulamasının paket adının ve Güvenlik Merkezi ile entegre olan kaynakların ve entegrasyonun değiştirilmesi için yapılandırma dosyasının değiştirilmesi gibi bazı değişiklikler gerekebilir. Daha fazla bilgi için bkz. Yapılandırma dosyasını ve entegrasyon ayarlarını güncelleme.

PendingIntent Hakkında

Android 14 veya sonraki sürümlerde mevcut Ayarlar uygulaması Güvenlik Merkezi entegrasyonunu kullanıyorsanız aşağıda açıklanan hata düzeltilmiştir. Bu durumda bu bölümü okumak gerekli değildir.

Hatanın mevcut olmadığından emin olduğunuzda, Güvenlik Merkezi'ndeki geçici çözümü kapatmak için Ayarlar uygulamasında config_isSafetyCenterLockScreenPendingIntentFixed XML boole kaynağı yapılandırma değerini true olarak ayarlayın.

PendingIntent geçici çözümü

Bu hata, Ayarlar'ın hangi parçanın açılacağını belirlemek için Intent örneği ekstralarını kullanması nedeniyle oluşur. Intent#equals Intent örneği ekstralarını dikkate almadığından, dişli menüsü simgesi ve giriş için PendingIntent örneği eşit kabul edilir ve aynı kullanıcı arayüzüne gider (farklı bir kullanıcı arayüzüne gitmesi amaçlanmış olsa bile). Bu sorun, QPR sürümünde PendingIntent örneklerinin istek koduna göre farklılaştırılmasıyla düzeltildi. Alternatif olarak bu, Intent#setId kullanılarak ayırt edilebilir.

Dahili güvenlik kaynakları

Bazı Güvenlik Merkezi kaynakları dahilidir ve PermissionController modülü içindeki PermissionController sistem uygulamasında uygulanır. Bu kaynaklar normal Güvenlik Merkezi kaynakları gibi davranır ve özel bir muamele görmez. Bu kaynakların koduna Android kod arama yoluyla ulaşılabilir.

Bunlar esas olarak gizlilik sinyalleridir, örneğin:

  • Ulaşılabilirlik
  • Kullanılmayan uygulamaları otomatik olarak iptal edin
  • Konum erişimi
  • Bildirim dinleyicisi
  • İş politikası bilgileri