Güvenlik Merkezi ile etkileşim kurma

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 arama 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ına 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ı
    • 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
    • Sorunun yönlendirilmesinin çalışması için zorunludur.
  • 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 ek 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

Safety Center kaynak API'leri SafetyCenterManager (@SystemApi) kullanılarak kullanılabilir. API yüzeyinin kodu Code Search'te mevcuttur. API'lerin uygulama kodunu Code Search'te bulabilirsiniz.

İzinler

Safety Center kaynak API'lerine yalnızca aşağıda listelenen izinleri kullanarak izin verilenler listesindeki sistem uygulamaları erişebilir. 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 (Safety Center kaynakları için gerekli değildir, bu kaynaklarda 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 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 verilir

Bu izinler ayrıcalıklı olduğundan yalnızca ilgili dosyaya (ör. Ayarlar uygulamasının com.android.settings.xml dosyası ve uygulamanın AndroidManifest.xml dosyası) ekleyerek edinebilirsiniz. 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 ç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 çağrı, Güvenlik Merkezi'nin etkin olup olmadığını kontrol eder. Ç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şi ve uyarı kartları, SafetySourceData sınıfında farklı önem düzeylerine sahip olabilir:

  • SEVERITY_LEVEL_UNSPECIFIED
    • Önem derecesi belirtilmedi
    • Renk: Gri veya şeffaf (öğenin SafetySourcesGroup girişi)
    • Kullanıcı arayüzünde statik giriş gibi görünen dinamik veriler 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 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 örnekleri listesi (uyarı kartları)
  • İsteğe bağlı Bundle ekstralar (14'ten itibaren)
  • Değişmezler:
    • 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ı tarafından zorunlu kılınan ek koşullar karşılanmalıdır. Örneğin, kaynak yalnızca sorun içeriyorsa SafetySourceStatus örneği sağlamamalıdır.

SafetySourceStatus

  • Zorunlu CharSequence başlığı
  • Zorunlu 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 olarak yapılandırmadaki intentAction kullanılır)
  • Şunlardan oluşan isteğe bağlı IconAction (girişte yan simge olarak gösterilir):
    • Zorunlu simge türü. Aşağıdaki türlerden biri olmalıdı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 gerekiyor
  • 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)
  • Değişmezler:
    • 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 alt başlığı
  • Zorunlu CharSequence özeti
  • Gerekli ö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 etkiler. Bu, varsayılan ayardı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 etkiler.
    • ISSUE_CATEGORY_PERSONAL_SAFETY (Android 14'ten itibaren): Sorun, kullanıcının kişisel güvenliğini etkiler.
  • 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
  • Kullanıcı sorunu kapattığında çağrılan isteğe bağlı PendingIntent (varsayılan olarak hiçbir şey çağrılmaz)
  • 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ı SafetySourceIssue'nin farklı kaynaklardan yayınlanmasına ve aynı deduplicationGroup'ye sahip oldukları varsayılarak kullanıcı arayüzünde yalnızca bir kez gösterilmesine olanak tanır (Android 14'ten itibaren). Belirtilmezse sorun hiçbir zaman tekilleştirilmiş
  • İ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). 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 manuel olarak çözmesi gerekir. Bu, varsayılan ayardır.
    • ISSUE_ACTIONABILITY_TIP: Bu sorun yalnızca bir ipucu niteliğindedir ve kullanıcıdan herhangi bir giriş gerekmeyebilir.
    • 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 14'ten itibaren) şunlar arasından biri olmalıdır:
    • NOTIFICATION_BEHAVIOR_UNSPECIFIED: Güvenlik Merkezi, uyarı kartı için bildirim gerekir. Bu, varsayılan seçenektir.
    • NOTIFICATION_BEHAVIOR_NEVER: Hiçbir bildirim yayınlanmaz.
    • NOTIFICATION_BEHAVIOR_DELAYED: Sorun ilk kez bildirildikten bir süre sonra bildirim yayınlanır.
    • NOTIFICATION_BEHAVIOR_IMMEDIATELY: Sorun bildirilir bildirilmez bir bildirim yayınlanır.
  • İ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 örnekleri listesi, benzersiz tanımlayıcılara sahip işlemlerden oluşmalıdır
    • 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.
    • OnDismiss PendingIntent, Activity örneği açmamalıdır
    • API yapılandırmasının getirdiği ek koşullar

Veriler, belirli etkinliklerin ardından Güvenlik Merkezi'ne sağlanır. Bu nedenle, kaynağın SafetySourceData için SafetyEvent örneği sağlamasına neyin neden olduğunu 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: 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: SafetySourceIssue.Action sorununu doğrudan Güvenlik Merkezi ekranından çözdük. SafetySourceIssue.Action sorununun çözülmesini takip etmek için Güvenlik Merkezi'nde SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED yerine bunu kullanın.
    • 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ği için sağlanan verilerin metnini güncelliyoruz. Bunun için SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED kullanılmasına izin verilir.
    • 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.
  • Değişmezler:
    • 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 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 veriyi al

Uygulamanızın sahibi olduğu bir kaynak için Safety Center'a sağlanan son verileri alabilirsiniz. Bu verileri kendi kullanıcı arayüzünüzde bir öğeyi göstermek, pahalı bir işlem gerçekleştirmeden önce verilerin güncellenmesi gerekip gerekmediğini kontrol etmek veya aynı SafetySourceData örneğini Safety Center'a bazı değişikliklerle ya da yeni bir SafetyEvent örneğiyle 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, ş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.

Aşağıdakilerden oluşan SafetySourceErrorDetails öğesini kullanarak hatayı 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 işlem, aşağıdaki işlemi 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 uygulamanın 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ı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 ekstralar sunulur:

  • 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ü, bir istek türünü temsil eder @IntDef
    • Aşağıdakilerden 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: 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 yenilemenin benzersiz tanımlayıcısını temsil eder

Güvenlik Merkezi'nden sinyal almak için bir BroadcastReceiver örneği uygulayın. Yayın, alıcının ön plan hizmetini başlatmasına olanak tanıyan ö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 ö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ğı, verileri değiştiğinde SafetyCenterManager işlevini çağıracak şekilde uygulanır. 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 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.
    • Cihaz çalışırken Güvenlik Merkezi etkinleştirildiğinde veya devre dışı bırakıldığında tetiklenir
    • 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, cihazdaki Güvenlik Merkezi ile ilgili özellikleri etkinleştirmek veya devre dışı bırakmak için kullanışlıdır.

Çözümleme işlemlerini uygulama

Çözüm 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ının beklenmesi durumunda (PendingIntent.getService) çözüm işlemlerini uygulamak için bir hizmet veya yayın alıcı (PendingIntent.getBroadcast) kullanabilir.

Çözüme ulaştırılan bir sorunu Güvenlik Merkezi'ne göndermek için şu kodu kullanın:

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

BroadcastReceiver, işlemi sonlandırır:

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

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

Yukarıdaki örnekte aynı BroadcastReceiver örneği ş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>

Sorunları kapatma isteklerine yanıt verme

Bir 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 tarafından gönderilen bir sorunu kullanıcı, Güvenlik Merkezi ekranında kapat düğmesine (uyarı kartında X düğmesi) dokunarak kapatabilir.
  • Kullanıcı bir sorunu kapattığında sorun devam ederse görünmez tekrarlıyorum.
  • Diskteki kalıcı reddedmeler, cihaz yeniden başlatılırken kalır.
  • Güvenlik Merkezi kaynağı bir sorunu bildirmeyi bırakıp daha sonra tekrar bildirirse sorun yeniden ortaya çıkar. 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 durumlar hariç olmak üzere kaynak için ek davranışlar gerekmez:

  • Kaynak, bu davranışı farklı bir şekilde uygulamaya çalışır (ör. sorunu hiçbir zaman tekrar göstermez).
  • Kaynak, bu işlevi geri çağırma 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. 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 kullanıcının birden fazla yönetilen profili olabilir. Güvenlik Merkezi Her kullanıcı için farklı veriler sağlar ancak yönetilen tüm kullanıcı hesaplarının verilerini birleştirir. belirli bir kullanıcı ile ilişkili profildir.

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

  • Kullanıcı (profil ebeveyni) ve ilişkili tüm yönetilen profiller (titleForWork örneklerini kullanan) için bir kullanıcı arayüzü girişi vardı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şkilendirilen verileri doğrudan SafetyCenterManager muhatabınıza ait olmayan 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 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 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 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 Ayarlar uygulamasından yeni bir Güvenlik ve gizlilik girişinden emin olun. 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 eklendi kod
  • Yeni Güvenlik ve gizlilik 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ında, Güvenlik Merkezi'nden erişilebilen Diğer güvenlik ayarları ve Diğer gizlilik ayarları başlıkları altında ek ayarlar bulunur:

Güvenlik kaynakları

Güvenlik Merkezi, Google Cloud Platform tarafından sağlanan belirli güvenlik kaynakları grubuyla Ayarlar uygulaması:

  • Kilit ekranı güvenlik kaynağı, kilit ekranının şifre kodu (veya başka bir güvenlik ayarı) kullanarak, kullanıcının özel bilgilerinin güvenli bir şekilde saklanır.
  • Bir biyometri güvenlik kaynağı (varsayılan olarak gizlidir) Parmak izi veya yüz sensörü olabilir.

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 için Yapılandırma dosyasını güncelleme ve entegrasyon ayarlarını inceleyin.

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 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 ayırarak bir QPR sürümünde düzeltildi. 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 koduna Android kod arama üzerinden ulaşabilirsiniz.

Bunlar temel olarak gizlilik sinyalleridir. Örneğin:

  • Erişilebilirlik
  • Kullanılmayan uygulamaların izinlerini otomatik olarak iptal etme
  • Konum erişimi
  • Bildirim dinleyici
  • İş politikası bilgileri