Güvenlik Merkezi ile etkileşimde bulunun

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
  • 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ı için UserHandle değerini belirtir kart
    • İsteğe bağlı (Varsayılan değer, geçerli kullanıcıdır)

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

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 olanlar SEND_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şi)
    • 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: Varsa SafetySourceStatus (SafetySourceStatus SEVERITY_LEVEL_UNSPECIFIED (bu durumda SEVERITY_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 olarak intentAction 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österilir
      • ICON_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
  • 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ğer true)
  • Sabit değerler:
    • PendingIntent örneğinin bir Activity ö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şan Action ö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
  • İ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ı kaynaklardan SafetySourceIssue 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). Belirtilmezse SafetySourcesGroup
  • İ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). Belirtilmezse Notification, 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
  • Sabit değerler:
    • Action örnek listesi, benzersiz ve benzersiz tanımlayıcılar
    • Action örnekleri listesi bir veya iki Action içermelidir öğeler. İşlem yapılabilirlik ISSUE_ACTIONABILITY_MANUAL değilse Action 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çin SAFETY_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ından SafetySourceIssue.Action; kullan Güvenlik için SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED yerine bu Center'ı kullanarak SafetySourceIssue.Action çözümlenmekte olan sorunu izleyebilirsiniz.
    • SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED: Şu sorunu çözmeye çalıştık: doğrudan Güvenlik Merkezi ekranından SafetySourceIssue.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çin SAFETY_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 veya SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED

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: 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. 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 korumalı amaç
    • Yapılandırma dosyasındaki tüm güvenlik kaynaklarına açık olarak gönderilir intent ve SEND_SAFETY_CENTER_UPDATE iznini gerektiriyor

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

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ı yeniden 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. 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:

Güvenlik kaynakları

Güvenlik Merkezi, Google Cloud Platform tarafından sağlanan belirli güvenlik kaynakları grubuyla entegre 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