โต้ตอบกับศูนย์ความปลอดภัย

เปลี่ยนเส้นทางไปยังศูนย์ความปลอดภัย

ทุกแอปสามารถเปิดศูนย์ความปลอดภัยโดยใช้ การดำเนินการ android.content.Intent.ACTION_SAFETY_CENTER (ค่าสตริง android.intent.action.SAFETY_CENTER)

หากต้องการเปิดศูนย์ความปลอดภัย ให้โทรจากภายในอินสแตนซ์ Activity โดยทำดังนี้

Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);

startActivity(openSafetyCenterIntent);

เปลี่ยนเส้นทางไปยังปัญหาที่เฉพาะเจาะจง

ยังสามารถเปลี่ยนเส้นทางไปยังการ์ดคำเตือนของศูนย์ความปลอดภัยที่เฉพาะเจาะจงได้โดยใช้ Intent เพิ่มเติมที่เฉพาะเจาะจง บริการเสริมเหล่านี้ไม่ได้มีไว้เพื่อใช้โดยบุคคลที่สาม เป็นส่วนหนึ่งของ SafetyCenterManager ซึ่งเป็นส่วนหนึ่งของ @SystemApi เฉพาะ แอประบบสามารถเข้าถึงส่วนเสริมเหล่านี้

บริการเสริม Intent ที่เปลี่ยนเส้นทางการ์ดคำเตือนที่เฉพาะเจาะจง

  • EXTRA_SAFETY_SOURCE_ID
    • ค่าสตริง: android.safetycenter.extra.SAFETY_SOURCE_ID
    • ประเภทสตริง: ระบุรหัสของแหล่งที่มาความปลอดภัยของข้อมูลที่เกี่ยวข้อง การ์ดคำเตือน
    • ต้องระบุเพื่อให้การเปลี่ยนเส้นทางไปยังปัญหาทำงานได้
  • EXTRA_SAFETY_SOURCE_ISSUE_ID
    • ค่าสตริง: android.safetycenter.extra.SAFETY_SOURCE_ISSUE_ID
    • ประเภทสตริง: ระบุรหัสการ์ดคําเตือน
    • ต้องระบุเพื่อให้การเปลี่ยนเส้นทางไปยังปัญหาทำงานได้
  • EXTRA_SAFETY_SOURCE_USER_HANDLE
    • ค่าสตริง: android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE
    • ประเภท UserHandle: ระบุ UserHandle สำหรับคำเตือนที่เกี่ยวข้อง ไพ่
    • ไม่บังคับ (ค่าเริ่มต้นคือผู้ใช้ปัจจุบัน)

ข้อมูลโค้ดด้านล่างใช้จากภายในอินสแตนซ์ Activity เพื่อเปิดได้ ปัญหาที่เฉพาะเจาะจงบนหน้าจอของศูนย์ความปลอดภัย

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);

เปลี่ยนเส้นทางไปยังหน้าย่อยที่เจาะจง (ตั้งแต่ Android 14 เป็นต้นไป)

ใน Android 14 ขึ้นไป หน้าศูนย์ความปลอดภัยจะแยกออกจากกัน ลงในหน้าเว็บย่อยหลายหน้าซึ่งแสดงถึงSafetySourcesGroupที่แตกต่างกัน (ใน Android 13 ข้อมูลนี้จะแสดงเป็นรายการที่ยุบได้)

คุณจะเปลี่ยนเส้นทางไปยังหน้าย่อยหน้าใดหน้าหนึ่งได้โดยใช้ Intent เพิ่มเติมต่อไปนี้

  • EXTRA_SAFETY_SOURCES_GROUP_ID
    • ค่าสตริง: android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID
    • ประเภทสตริง: ระบุรหัสของ SafetySourcesGroup
    • ต้องระบุเพื่อให้การเปลี่ยนเส้นทางไปยังหน้าย่อยทำงานได้

ข้อมูลโค้ดด้านล่างใช้จากภายในอินสแตนซ์ Activity เพื่อเปิดได้ หน้าจอศูนย์ความปลอดภัยไปยังหน้าย่อยที่เจาะจง

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

startActivity(openSafetyCenterIntent);

ใช้ API แหล่งที่มาของศูนย์ความปลอดภัย

API แหล่งที่มาของศูนย์ความปลอดภัยพร้อมให้ใช้งานโดยใช้ SafetyCenterManager (ซึ่งก็คือ @SystemApi) โค้ดสำหรับแพลตฟอร์ม API มีอยู่ใน รหัส ค้นหา โค้ดการใช้งานของ API อยู่ในโค้ด ค้นหา

สิทธิ์

มีเพียงแอประบบในรายการที่อนุญาตเท่านั้นที่จะเข้าถึง API แหล่งที่มาของศูนย์ความปลอดภัยได้ โดยใช้สิทธิ์ที่ระบุไว้ด้านล่าง สำหรับข้อมูลเพิ่มเติม โปรดดูสิทธิพิเศษ รายการที่อนุญาต

  • READ_SAFETY_CENTER_STATUS
    • signature|privileged
    • ใช้สำหรับ SafetyCenterManager#isSafetyCenterEnabled() API (ไม่ใช่ สำหรับแหล่งข้อมูลในศูนย์ความปลอดภัย พวกเขาต้องการเพียง สิทธิ์SEND_SAFETY_CENTER_UPDATE)
    • ใช้โดยแอปของระบบที่จะตรวจสอบว่าศูนย์ความปลอดภัยเปิดใช้อยู่หรือไม่
    • อนุญาตเฉพาะแอประบบในรายการที่อนุญาตเท่านั้น
  • SEND_SAFETY_CENTER_UPDATE
    • internal|privileged
    • ใช้สำหรับ API ที่เปิดใช้และ API แหล่งที่มาของความปลอดภัย
    • ใช้โดยแหล่งข้อมูลด้านความปลอดภัยเท่านั้น
    • อนุญาตเฉพาะแอประบบในรายการที่อนุญาตเท่านั้น

สิทธิ์เหล่านี้เป็นสิทธิ์เฉพาะบุคคล และคุณสามารถขอได้ด้วยการเพิ่มลงใน ไฟล์ที่เกี่ยวข้อง เช่น com.android.settings.xml สำหรับแอปการตั้งค่า และในไฟล์ AndroidManifest.xml ของแอป โปรดดู protectionLevel เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลสิทธิ์

รับ SafetyCenterManager

SafetyCenterManager เป็นชั้นเรียน @SystemApi ที่เข้าถึงได้จากแอประบบ เริ่มตั้งแต่ Android 13 การพูดคุยนี้จะสาธิตวิธีการ รับ SafetyCenterManager ดังนี้

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;
}

ตรวจสอบว่าศูนย์ความปลอดภัยเปิดอยู่หรือไม่

การโทรนี้จะตรวจสอบว่าได้เปิดใช้ศูนย์ความปลอดภัยอยู่หรือไม่ การโทรนี้จำเป็นต้องมี READ_SAFETY_CENTER_STATUS หรือสิทธิ์ SEND_SAFETY_CENTER_UPDATE:

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

ให้ข้อมูล

ข้อมูลต้นทางของศูนย์ความปลอดภัยที่มี String sourceId ที่ระบุมีไว้เพื่อความปลอดภัย ตรงกลางด้วยออบเจ็กต์ SafetySourceData ซึ่งแสดงถึงรายการ UI และ รายการปัญหา (การ์ดคำเตือน) รายการ UI และการ์ดคำเตือนอาจมี ระดับความรุนแรงที่แตกต่างกันที่ระบุในคลาส SafetySourceData:

  • SEVERITY_LEVEL_UNSPECIFIED
    • ไม่ได้ระบุความรุนแรง
    • สี: เทาหรือโปร่งใส (ขึ้นอยู่กับ SafetySourcesGroup ของ รายการ)
    • ใช้สําหรับข้อมูลแบบไดนามิกที่ทําเป็นรายการแบบคงที่ใน UI หรือเพื่อแสดง รายการที่ไม่ได้ระบุ
    • ต้องไม่ใช้สำหรับการ์ดคำเตือน
  • SEVERITY_LEVEL_INFORMATION
    • ข้อมูลพื้นฐานหรือคำแนะนำเล็กๆ น้อยๆ
    • สี: เขียว
  • SEVERITY_LEVEL_RECOMMENDATION
    • คำแนะนำที่ผู้ใช้ควรดำเนินการกับปัญหานี้ เนื่องจาก อาจทำให้พวกเขาตกอยู่ในความเสี่ยง
    • สี: เหลือง
  • SEVERITY_LEVEL_CRITICAL_WARNING
    • คำเตือนสำคัญว่าผู้ใช้ต้องดำเนินการกับปัญหานี้ เนื่องจาก มีความเสี่ยง
    • สี: แดง

SafetySourceData

ออบเจ็กต์ SafetySourceData ประกอบด้วยรายการ UI, การ์ดคำเตือน และ ค่าคงที่

  • อินสแตนซ์ SafetySourceStatus ที่ไม่บังคับ (รายการ UI)
  • รายการอินสแตนซ์ SafetySourceIssue รายการ (การ์ดคำเตือน)
  • ตัวเลือกเพิ่มเติม Bundle รายการ (เริ่ม 14)
  • ตัวแปร:
    • รายการ SafetySourceIssue ต้องประกอบด้วยปัญหาที่มี บางอย่าง
    • อินสแตนซ์ SafetySourceIssue ต้องไม่มีความสำคัญมากกว่า SafetySourceStatus หากมี (ยกเว้น SafetySourceStatus คือ SEVERITY_LEVEL_UNSPECIFIED ซึ่งในกรณีนี้คือ SEVERITY_LEVEL_INFORMATION ปัญหา)
    • ต้องเป็นไปตามข้อกำหนดเพิ่มเติมที่กำหนดโดยการกำหนดค่า API ตัวอย่างเช่น หากแหล่งที่มาเป็นปัญหาเท่านั้น แหล่งที่มานั้นต้องไม่ระบุ SafetySourceStatus

SafetySourceStatus

  • ต้องระบุชื่อCharSequence
  • ต้องมีข้อมูลสรุป CharSequence
  • ระดับความรุนแรงที่กำหนด
  • ไม่บังคับ PendingIntent อินสแตนซ์เพื่อเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าที่ถูกต้อง (ค่าเริ่มต้นใช้ intentAction จากการกำหนดค่า หากมี)
  • ไม่บังคับ IconAction (แสดงเป็นไอคอนด้านข้างในรายการ) ที่ประกอบด้วย
    • ประเภทไอคอนที่จำเป็น ซึ่งต้องเป็นประเภทอย่างใดอย่างหนึ่งต่อไปนี้
      • ICON_TYPE_GEAR: แสดงเป็นรูปเฟืองถัดจากรายการ UI
      • ICON_TYPE_INFO: แสดงเป็นไอคอนข้อมูลถัดจากรายการ UI
    • จำเป็น PendingIntent เปลี่ยนเส้นทางผู้ใช้ไปยังหน้าอื่น
  • ค่า enabled บูลีนที่ไม่บังคับที่อนุญาตให้ทำเครื่องหมายรายการ UI เป็น ปิดใช้อยู่ จึงไม่สามารถคลิกได้ (ค่าเริ่มต้นคือ true)
  • ตัวแปร:
    • อินสแตนซ์ PendingIntent ต้องเปิดอินสแตนซ์ Activity
    • หากรายการถูกปิดใช้ จะต้องระบุรายการนั้นๆ SEVERITY_LEVEL_UNSPECIFIED
    • ข้อกำหนดเพิ่มเติมที่กำหนดโดยการกำหนดค่า API

SafetySourceIssue

  • ต้องมีตัวระบุ String ที่ไม่ซ้ำกัน
  • ต้องระบุชื่อCharSequence
  • คำบรรยายภาษาCharSequence (ไม่บังคับ)
  • ต้องมีข้อมูลสรุป CharSequence
  • ระดับความรุนแรงที่กำหนด
  • หมวดหมู่ปัญหาที่ไม่บังคับ ซึ่งต้องเป็นหนึ่งในหมวดหมู่ต่อไปนี้
    • ISSUE_CATEGORY_DEVICE: ปัญหานี้ส่งผลต่ออุปกรณ์ของผู้ใช้
    • ISSUE_CATEGORY_ACCOUNT: ปัญหานี้ส่งผลต่อบัญชีของผู้ใช้
    • ISSUE_CATEGORY_GENERAL: ปัญหานี้ส่งผลต่อความปลอดภัยทั่วไปของผู้ใช้ โดยตัวเลือกนี้คือค่าเริ่มต้น
    • ISSUE_CATEGORY_DATA (ตั้งแต่ Android 14 เป็นต้นไป): ปัญหานี้ส่งผลกระทบต่อข้อมูลของผู้ใช้
    • ISSUE_CATEGORY_PASSWORDS (กำลังเริ่ม Android 14): ปัญหาส่งผลกระทบต่อ รหัสผ่าน
    • ISSUE_CATEGORY_PERSONAL_SAFETY (กำลังเริ่ม Android 14): ปัญหาส่งผลกระทบต่อส่วนตัวของผู้ใช้ อย่างปลอดภัย
  • รายการขององค์ประกอบ Action ที่ผู้ใช้ทำได้สำหรับปัญหานี้ แต่ละรายการ อินสแตนซ์ Action รายการที่ประกอบด้วย
    • ต้องมีตัวระบุ String ที่ไม่ซ้ำกัน
    • ต้องติดป้ายกำกับ CharSequence
    • จำเป็น PendingIntent เปลี่ยนเส้นทางผู้ใช้ไปยังหน้าเว็บอื่น หรือประมวลผลการดำเนินการโดยตรงจาก หน้าจอศูนย์ความปลอดภัย
    • บูลีนที่ไม่บังคับเพื่อระบุว่าปัญหานี้แก้ไขได้โดยตรงจาก หน้าจอ SafetyCenter (ค่าเริ่มต้นคือ false)
    • ข้อความแสดงการสำเร็จ CharSequence ที่ไม่บังคับ ที่จะแสดงต่อผู้ใช้ เมื่อปัญหาได้รับการแก้ไขจากศูนย์ความปลอดภัยโดยตรงเรียบร้อยแล้ว หน้าจอ
  • ไม่บังคับ PendingIntent ที่มีการเรียกใช้เมื่อผู้ใช้ปิดปัญหา (ค่าเริ่มต้นคือ โทรหา)
  • ต้องมีตัวระบุประเภทปัญหา String รายการ กรณีนี้คล้ายกับปัญหา แต่ไม่จําเป็นต้องไม่ซ้ำกันและใช้สําหรับการบันทึก
  • String ที่ไม่บังคับสำหรับรหัสการกรองข้อมูลที่ซ้ำกันออก ซึ่งจะช่วยให้โพสต์ SafetySourceIssue จากแหล่งที่มาต่างๆ และแสดงเพียงครั้งเดียวใน UI สมมติมี deduplicationGroup เดียวกัน (เมื่อเริ่มใช้ Android 14) หากไม่ได้ระบุ ปัญหาจะไม่เป็น กรองข้อมูลที่ซ้ำกันออกแล้ว
  • ไม่บังคับ CharSequence สำหรับชื่อการระบุแหล่งที่มา นี่คือข้อความที่แสดง แหล่งที่มาของการ์ดคำเตือน (การเริ่มใช้งาน Android 14) หากไม่ได้ระบุ จะใช้ชื่อของ SafetySourcesGroup
  • ความสามารถในการดำเนินการของปัญหาที่ไม่บังคับ (ตั้งแต่ Android 14 เป็นต้นไป) ซึ่งต้องเป็นหนึ่งในรายการต่อไปนี้
    • ISSUE_ACTIONABILITY_MANUAL: ผู้ใช้ต้องแก้ไขปัญหานี้ ด้วยตนเอง โดยตัวเลือกนี้คือค่าเริ่มต้น
    • ISSUE_ACTIONABILITY_TIP: ปัญหานี้เป็นเพียงเคล็ดลับและอาจไม่ต้องการ ข้อมูลจากผู้ใช้
    • ISSUE_ACTIONABILITY_AUTOMATIC: ปัญหานี้ดำเนินการไปแล้ว และอาจไม่ได้ต้องการข้อมูลจากผู้ใช้
  • ลักษณะการทำงานของการแจ้งเตือนที่ไม่บังคับ (ขณะเริ่มใช้งาน Android 14) ซึ่งต้องเป็นหนึ่งในรายการต่อไปนี้
    • NOTIFICATION_BEHAVIOR_UNSPECIFIED: ศูนย์ความปลอดภัยจะตัดสินใจว่า จำเป็นต้องมีการแจ้งเตือนสำหรับการ์ดคำเตือน โดยตัวเลือกนี้คือค่าเริ่มต้น
    • NOTIFICATION_BEHAVIOR_NEVER: ไม่มีการโพสต์การแจ้งเตือน
    • NOTIFICATION_BEHAVIOR_DELAYED: มีการโพสต์การแจ้งเตือนเป็นระยะเวลาหนึ่ง หลังจากที่มีการรายงานปัญหาครั้งแรก
    • NOTIFICATION_BEHAVIOR_IMMEDIATELY: ระบบจะโพสต์การแจ้งเตือนทันทีที่ มีการรายงานปัญหาแล้ว
  • Notification (ไม่บังคับ) สำหรับแสดงการแจ้งเตือนที่กำหนดเองพร้อมการ์ดคำเตือน (ตั้งแต่ Android 14 เป็นต้นไป) หากไม่ได้ระบุ ค่า Notification ได้มาจากการ์ดคำเตือน ประกอบด้วย:
    • ต้องระบุชื่อCharSequence
    • ต้องมีข้อมูลสรุป CharSequence
    • รายการองค์ประกอบ Action ที่ผู้ใช้ดำเนินการกับการแจ้งเตือนนี้ได้
  • ตัวแปร:
    • รายการอินสแตนซ์ Action ต้องประกอบด้วยการดำเนินการที่มีไม่ซ้ำกัน ตัวระบุ
    • รายการของอินสแตนซ์ Action ต้องมี Action 1 หรือ 2 รายการ จากองค์ประกอบเหล่านี้ หากความสามารถในการดำเนินการไม่ใช่ ISSUE_ACTIONABILITY_MANUAL ไม่อนุญาตให้มี Action
    • OnOff PendingIntent ต้องไม่เปิดอินสแตนซ์ Activity
    • ข้อกำหนดเพิ่มเติมที่กำหนดโดยการกำหนดค่า API

ข้อมูลจะได้รับมาจากเหตุการณ์บางอย่างในศูนย์ความปลอดภัย ดังนั้นจึงจำเป็นต่อ ระบุสิ่งที่ทำให้แหล่งที่มาระบุ SafetySourceData ด้วย SafetyEvent

SafetyEvent

  • ประเภทที่จำเป็น ซึ่งต้องเป็นประเภทอย่างใดอย่างหนึ่งต่อไปนี้
    • SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED: สถานะของแหล่งที่มามี มีการเปลี่ยนแปลง
    • SAFETY_EVENT_TYPE_REFRESH_REQUESTED: การตอบกลับการรีเฟรช/สแกนอีกครั้ง สัญญาณจากศูนย์ความปลอดภัย ใช้สิ่งนี้แทน SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGEDเพื่อให้ศูนย์ความปลอดภัยทำงาน ติดตามคำขอรีเฟรช/สแกนอีกครั้ง
    • SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED: เราแก้ปัญหาแล้ว SafetySourceIssue.Action โดยตรงจากหน้าจอศูนย์ความปลอดภัย ใช้ สิ่งนี้แทนที่จะเป็น SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED เพื่อความปลอดภัย ศูนย์เพื่อให้ติดตาม SafetySourceIssue.Action ที่กำลังมีการแก้ไขได้
    • SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED: เราพยายามแก้ไข SafetySourceIssue.Action โดยตรงจากหน้าจอศูนย์ความปลอดภัย แต่ ไม่สำเร็จ ใช้สิ่งนี้แทน SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGEDสำหรับศูนย์ความปลอดภัยเพื่อให้ แทร็ก SafetySourceIssue.Action ล้มเหลว
    • SAFETY_EVENT_TYPE_DEVICE_LOCALE_CHANGED: ภาษาของอุปกรณ์ มีการเปลี่ยนแปลง ด้วยเหตุนี้เราจึงอัปเดตข้อความของข้อมูลที่ให้มา คือ ได้รับอนุญาตให้ใช้ SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED สำหรับกรณีนี้
    • SAFETY_EVENT_TYPE_DEVICE_REBOOTED: เราให้ข้อมูลนี้เป็นส่วนหนึ่งของ ของการเปิดเครื่องครั้งแรก เนื่องจากไม่มีการยืนยันข้อมูลศูนย์ความปลอดภัยใน การรีบูต; ได้รับอนุญาตให้ใช้ SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED สำหรับเรื่องนี้
  • ตัวระบุ String ที่ไม่บังคับสำหรับรหัสการออกอากาศการรีเฟรช
  • ตัวระบุ String ที่ไม่บังคับสำหรับอินสแตนซ์ SafetySourceIssue ที่รับ แก้ปัญหาแล้ว
  • ตัวระบุ String ที่ไม่บังคับสำหรับอินสแตนซ์ SafetySourceIssue.Action กำลังแก้ไข
  • ตัวแปร:
    • ต้องระบุรหัสการออกอากาศการรีเฟรชหากประเภทคือ SAFETY_EVENT_TYPE_REFRESH_REQUESTED
    • ต้องระบุปัญหาและรหัสการดำเนินการหากมีประเภทเป็น SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED หรือ SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED

ด้านล่างคือตัวอย่างวิธีที่แหล่งข้อมูลอาจให้ข้อมูลแก่ศูนย์ความปลอดภัย (ใน ในกรณีที่เป็นการแสดงรายการพร้อมการ์ดคำเตือนใบเดียว)

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);

รับข้อมูลสุดท้ายที่ให้ไว้

คุณสามารถดูข้อมูลล่าสุดที่ให้ไว้กับศูนย์ความปลอดภัยสำหรับแหล่งข้อมูลที่ แอป คุณสามารถใช้ URL นี้เพื่อแสดงบางอย่างใน UI ของคุณเอง เพื่อตรวจสอบว่าข้อมูล จำเป็นต้องอัปเดตก่อนปฏิบัติการที่มีค่าใช้จ่ายสูง หรือเพื่อจัดเตรียม อินสแตนซ์ SafetySourceData เดียวกันไปยังศูนย์ความปลอดภัยโดยมีการเปลี่ยนแปลงบางอย่างหรือมี อินสแตนซ์ SafetyEvent ใหม่ และยังมีประโยชน์สำหรับการทดสอบ

ใช้รหัสนี้เพื่อรับข้อมูลล่าสุดที่ส่งไปยังศูนย์ความปลอดภัย

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

รายงานข้อผิดพลาด

หากรวบรวมข้อมูล SafetySourceData ไม่ได้ คุณสามารถรายงานข้อผิดพลาดไปยังความปลอดภัยได้ กึ่งกลาง ซึ่งจะเปลี่ยนรายการเป็นสีเทา ล้างข้อมูลที่แคชไว้ และให้ บางอย่าง เช่น ตรวจสอบการตั้งค่าไม่ได้ นอกจากนี้ คุณยังรายงานข้อผิดพลาดได้ในกรณีต่อไปนี้ อินสแตนซ์ของ SafetySourceIssue.Action แก้ไขไม่สำเร็จ ซึ่งในกรณีนี้ โดยจะไม่ล้างข้อมูลที่แคชไว้และรายการ UI จะไม่เปลี่ยนแปลง แต่ข้อความคือ แสดงต่อผู้ใช้ เพื่อแจ้งให้ทราบว่ามีข้อผิดพลาดเกิดขึ้น

คุณสามารถให้ข้อผิดพลาดโดยใช้ SafetySourceErrorDetails ซึ่งเป็นข้อความที่เขียน จาก:

  • SafetySourceErrorDetails: อินสแตนซ์ SafetyEvent ที่จำเป็น:
// 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);

ตอบกลับคำขอรีเฟรชหรือสแกนอีกครั้ง

คุณรับสัญญาณจากศูนย์ความปลอดภัยเพื่อให้ข้อมูลใหม่ได้ การตอบกลับ คำขอรีเฟรชหรือสแกนอีกครั้งช่วยให้แน่ใจว่าผู้ใช้ดูสถานะปัจจุบันเมื่อ เปิดศูนย์ความปลอดภัยและเมื่อผู้ใช้แตะปุ่มสแกน

ซึ่งทำได้โดยการรับการออกอากาศซึ่งมีการดำเนินการดังต่อไปนี้

  • ACTION_REFRESH_SAFETY_SOURCES
    • ค่าสตริง: android.safetycenter.action.REFRESH_SAFETY_SOURCES
    • ทริกเกอร์เมื่อศูนย์ความปลอดภัยส่งคำขอรีเฟรชข้อมูลของ แหล่งที่มาของความปลอดภัยของแอปที่ระบุ
    • เจตนาที่ได้รับการปกป้องที่สามารถส่งได้โดยระบบเท่านั้น
    • ส่งไปยังแหล่งที่มาความปลอดภัยทั้งหมดในไฟล์การกำหนดค่าโดยโจ่งแจ้ง Intent และต้องมีสิทธิ์ SEND_SAFETY_CENTER_UPDATE

บริการเสริมต่อไปนี้เป็นส่วนหนึ่งของการออกอากาศครั้งนี้

  • EXTRA_REFRESH_SAFETY_SOURCE_IDS
    • ค่าสตริง: android.safetycenter.extra.REFRESH_SAFETY_SOURCE_IDS
    • ประเภทอาร์เรย์สตริง (String[]) แสดงรหัสแหล่งที่มาที่จะรีเฟรช แอปที่ระบุ
  • EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE

    • ค่าสตริง: android.safetycenter.extra.REFRESH_SAFETY_SOURCES_REQUEST_TYPE
    • ประเภทจำนวนเต็ม แสดงประเภทคำขอ @IntDef
    • ต้องเป็นหนึ่งในรายการต่อไปนี้
      • EXTRA_REFRESH_REQUEST_TYPE_GET_DATA: ขอแหล่งที่มาเพื่อ จะให้ข้อมูลที่ค่อนข้างรวดเร็ว โดยปกติแล้วเมื่อผู้ใช้เปิดหน้า
      • EXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA: ขอแหล่งที่มา เพื่อให้ข้อมูลสดใหม่ที่สุดเท่าที่จะเป็นไปได้ โดยทั่วไปเมื่อผู้ใช้ กดปุ่มสแกนอีกครั้ง
  • EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID

    • ค่าสตริง: android.safetycenter.extra.REFRESH_SAFETY_SOURCES_BROADCAST_ID
    • ประเภทสตริง แสดงตัวระบุที่ไม่ซ้ำสำหรับการรีเฟรชที่ขอ

หากต้องการรับสัญญาณจากศูนย์ความปลอดภัย ให้ใช้ BroadcastReceiver อินสแตนซ์ การออกอากาศจะส่งพร้อมกับ BroadcastOptions พิเศษที่ช่วยให้ ตัวรับสัญญาณเพื่อเริ่มบริการที่ทำงานอยู่เบื้องหน้า

BroadcastReceiver ตอบกลับคำขอรีเฟรช

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;
  }
}

อินสแตนซ์เดียวกันของ BroadcastReceiver ในตัวอย่างด้านบนมีการประกาศใน 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>

ตามหลักการแล้ว มีการใช้แหล่งข้อมูลศูนย์ความปลอดภัยในลักษณะที่เรียกใช้ SafetyCenterManager เมื่อข้อมูลเปลี่ยนแปลง ด้วยเหตุผลด้านประสิทธิภาพของระบบ ขอแนะนำให้ตอบสนองต่อสัญญาณการสแกนอีกครั้งเท่านั้น (เมื่อผู้ใช้แตะการสแกน ) ไม่ใช่เมื่อผู้ใช้เปิดศูนย์ความปลอดภัย หากฟังก์ชันนี้ ต้องระบุฟิลด์ refreshOnPageOpenAllowed="true" ในไฟล์การกำหนดค่า ต้องกำหนดให้แหล่งที่มารับการแพร่สัญญาณที่ส่งมาในกรณีเหล่านี้

ตอบสนองต่อศูนย์ความปลอดภัยเมื่อเปิดหรือปิดใช้งาน

คุณสามารถตอบสนองเมื่อศูนย์ความปลอดภัยเป็นเปิดหรือปิด โดยใช้ การดำเนินการผ่าน Intent:

  • ACTION_SAFETY_CENTER_ENABLED_CHANGED
    • ค่าสตริง: android.safetycenter.action.SAFETY_CENTER_ENABLED_CHANGED
    • ทริกเกอร์เมื่อศูนย์ความปลอดภัยเปิดหรือปิดอยู่ขณะที่ อุปกรณ์กำลังทำงาน
    • ไม่ได้เรียกใช้เมื่อเปิดเครื่อง (ใช้ ACTION_BOOT_COMPLETED )
    • เจตนาที่มีการป้องกันที่สามารถส่งได้โดยระบบเท่านั้น
    • ส่งไปยังแหล่งที่มาความปลอดภัยทั้งหมดในไฟล์การกำหนดค่าโดยโจ่งแจ้ง Intent ต้องใช้สิทธิ์ SEND_SAFETY_CENTER_UPDATE
    • ส่งเป็น Intent แบบไม่เจาะจงปลายทางที่ต้องใช้ READ_SAFETY_CENTER_STATUS สิทธิ์

การดำเนินการผ่าน Intent นี้มีประโยชน์ในการเปิดหรือปิดใช้ฟีเจอร์ที่เกี่ยวข้องกับ ศูนย์ความปลอดภัยในอุปกรณ์

ใช้การดำเนินการแก้ปัญหา

การดำเนินการแก้ปัญหาคืออินสแตนซ์ SafetySourceIssue.Action ที่ผู้ใช้ทำได้ แก้ปัญหาโดยตรงจากหน้าจอศูนย์ความปลอดภัย ผู้ใช้แตะปุ่มการทำงาน และอินสแตนซ์ PendingIntent บน SafetySourceIssue.Action ที่ส่งโดย จะทริกเกอร์แหล่งข้อมูลความปลอดภัย ซึ่งจะแก้ไขปัญหาในเบื้องหลัง และ จะแจ้งให้ศูนย์ความปลอดภัยทราบเมื่อเสร็จแล้ว

แหล่งที่มาของศูนย์ความปลอดภัยจะใช้บริการเพื่อดำเนินการแก้ปัญหาได้ในกรณีต่อไปนี้ การดำเนินการคาดว่าจะใช้เวลาสักครู่ (PendingIntent.getService) หรือ Broadcast Receiver (PendingIntent.getBroadcast)

ใช้รหัสนี้เพื่อส่งปัญหาที่แก้ไขแล้วไปยังศูนย์ความปลอดภัย

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 จะแก้ไขการดำเนินการนี้

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).
  }
}

อินสแตนซ์เดียวกันของ BroadcastReceiver ในตัวอย่างด้านบนมีการประกาศใน 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>

ตอบสนองต่อปัญหาการปิด

คุณสามารถระบุอินสแตนซ์ PendingIntent ที่จะทริกเกอร์ได้เมื่อ ปิดอินสแตนซ์ SafetySourceIssue แล้ว ศูนย์ความปลอดภัยจะจัดการปัญหาเหล่านี้ การปิด:

  • หากแหล่งที่มาพุชปัญหา ผู้ใช้จะปิดปัญหาได้ในศูนย์ความปลอดภัย โดยการแตะปุ่มปิด (ปุ่ม X บนการ์ดคำเตือน)
  • เมื่อผู้ใช้ปิดปัญหา หากปัญหายังคงอยู่ ปัญหาจะไม่ปรากฏขึ้น ใน UI อีกครั้ง
  • การปิดถาวรบนดิสก์จะยังคงอยู่ในระหว่างการรีบูตอุปกรณ์
  • หากแหล่งที่มาของศูนย์ความปลอดภัยหยุดการระบุปัญหาแล้ว ให้ อีกครั้งในภายหลัง ปัญหานั้นก็เกิดขึ้นอีก เพื่อช่วยให้ ที่ผู้ใช้เห็นคำเตือน ปิดคำเตือน แล้วดำเนินการ ควรลดปัญหาลงได้ แต่ผู้ใช้ได้ดำเนินการอีกครั้ง ก็ทำให้เกิดปัญหาที่คล้ายกัน เมื่อมาถึงจุดนี้ การ์ดคำเตือนควรปรากฏขึ้นอีกครั้ง
  • การ์ดคำเตือนสีเหลืองและแดงจะแสดงอีกครั้งทุก 180 วัน ยกเว้นในกรณีที่ผู้ใช้ ปิดพวกเขาหลายครั้ง

แหล่งที่มาไม่ควรมีลักษณะการทำงานอื่นๆ เพิ่มเติม ยกเว้นในกรณีต่อไปนี้

  • แหล่งที่มาจะพยายามนำลักษณะการทำงานนี้ไปใช้ในลักษณะที่ต่างออกไป เช่น ไม่เคย ทำให้ปัญหานั้นปรากฏอีกครั้ง
  • แหล่งที่มาจะพยายามใช้การเรียกกลับ ตัวอย่างเช่น เพื่อบันทึก

ให้ข้อมูลสำหรับผู้ใช้/โปรไฟล์หลายรายการ

SafetyCenterManager API ใช้ได้กับผู้ใช้และโปรไฟล์ต่างๆ สำหรับข้อมูลเพิ่มเติม โปรดดูการสร้าง Multiuser-Aware แอป Context ออบเจ็กต์ที่ระบุ SafetyCenterManager เชื่อมโยงกับ UserHandle ดังนั้นอินสแตนซ์ SafetyCenterManager ที่แสดงผลโต้ตอบกับ ศูนย์ความปลอดภัยสำหรับอินสแตนซ์ UserHandle นั้น โดยค่าเริ่มต้น Context คือ ที่เชื่อมโยงกับผู้ใช้ที่ใช้งานอยู่ แต่คุณอาจสร้างอินสแตนซ์สำหรับ ผู้ใช้อีกรายหนึ่งหากแอปมี INTERACT_ACROSS_USERS และ สิทธิ์ INTERACT_ACROSS_USERS_FULL รายการ ตัวอย่างนี้แสดงการโทร ระหว่างผู้ใช้/โปรไฟล์:

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

ผู้ใช้แต่ละคนในอุปกรณ์จะมีโปรไฟล์ที่มีการจัดการได้หลายโปรไฟล์ ศูนย์ความปลอดภัย จะให้ข้อมูลที่แตกต่างกันสำหรับผู้ใช้แต่ละราย แต่จะรวมข้อมูลของ โปรไฟล์ที่เชื่อมโยงกับผู้ใช้ที่กำหนด

เมื่อตั้งค่า profile="all_profiles" สำหรับแหล่งที่มาในไฟล์การกำหนดค่า สิ่งต่อไปนี้จะเกิดขึ้น

  • มีรายการ UI สำหรับผู้ใช้ (ระดับบนสุดของโปรไฟล์) และรายการที่เกี่ยวข้องทั้งหมด โปรไฟล์ที่มีการจัดการ (ซึ่งใช้ titleForWork อินสแตนซ์)
  • ระบบจะส่งสัญญาณรีเฟรชหรือสแกนอีกครั้งสำหรับโปรไฟล์ระดับบนสุดและ โปรไฟล์ที่มีการจัดการที่เชื่อมโยง ตัวรับที่เกี่ยวข้องเริ่มต้นแล้วสําหรับ และสามารถให้ข้อมูลที่เกี่ยวข้องแก่ SafetyCenterManager โดยไม่ต้องโทรข้ามโปรไฟล์ เว้นแต่ว่า ตัวรับหรือแอป singleUser

  • แหล่งที่มาต้องมีข้อมูลสำหรับผู้ใช้และแหล่งที่มาที่มีการจัดการทั้งหมด โปรไฟล์ ข้อมูลสำหรับรายการ UI แต่ละรายการอาจแตกต่างกันไปตาม โปรไฟล์

การทดสอบ

คุณจะเข้าถึง ShadowSafetyCenterManager และใช้ในการทดสอบ Robolectric ได้

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);
}

คุณเขียนการทดสอบจากต้นทางถึงปลายทาง (E2E) เพิ่มเติมได้ แต่นั่นอยู่นอกเหนือขอบเขตของการดำเนินการนี้ โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการเขียนการทดสอบ E2E เหล่านี้ที่การทดสอบ CTS (CtsSafetyCenterTestCases)

API การทดสอบและ API ภายใน

API ภายในและ API ทดสอบมีไว้เพื่อการใช้งานภายใน จึงไม่มีการอธิบายไว้ดังนี้ โดยละเอียดในคู่มือนี้ แต่เราอาจขยาย API ภายในบางส่วนในอนาคต อนุญาตให้ OEM สร้าง UI ของตัวเอง และเราจะอัปเดตคู่มือนี้ คำแนะนำเกี่ยวกับวิธีใช้เพิ่มขึ้น

สิทธิ์

  • MANAGE_SAFETY_CENTER
    • internal|installer|role
    • ใช้สำหรับ API ของศูนย์ความปลอดภัยภายใน
    • ให้สิทธิ์แก่ PermissionsController และ Shell เท่านั้น

แอปการตั้งค่า

การเปลี่ยนเส้นทางศูนย์ความปลอดภัย

โดยค่าเริ่มต้น ศูนย์ความปลอดภัยจะเข้าถึงได้ผ่านแอปการตั้งค่าด้วย ความปลอดภัยและ "ความเป็นส่วนตัว" หากคุณใช้แอปการตั้งค่าอื่นหรือ เมื่อคุณแก้ไขแอปการตั้งค่า คุณอาจต้องปรับแต่งวิธีที่ศูนย์ความปลอดภัย ที่มีการเข้าถึง

สิ่งที่จะเกิดขึ้นเมื่อเปิดใช้ศูนย์ความปลอดภัย

  • รายการความเป็นส่วนตัวเดิมซ่อนอยู่รหัส
  • รายการความปลอดภัยเดิมซ่อนอยู่รหัส
  • ความปลอดภัยและการรักษาความปลอดภัยใหม่ รายการความเป็นส่วนตัว ถูกเพิ่ม รหัส
  • ความปลอดภัยและการรักษาความปลอดภัยใหม่ รายการความเป็นส่วนตัวจะเปลี่ยนเส้นทางไปยังรหัสศูนย์ความปลอดภัย
  • android.settings.PRIVACY_SETTINGS และ android.settings.SECURITY_SETTINGS การดำเนินการของ Intent จะเปลี่ยนเส้นทางเพื่อเปิดศูนย์ความปลอดภัย (รหัส: ความปลอดภัย ความเป็นส่วนตัว)

หน้าความปลอดภัยและความเป็นส่วนตัวขั้นสูง

แอปการตั้งค่ามีการตั้งค่าเพิ่มเติมในส่วนการตั้งค่าการรักษาความปลอดภัยเพิ่มเติม และการตั้งค่าความเป็นส่วนตัวเพิ่มเติมที่พร้อมใช้งานจากศูนย์ความปลอดภัย

  • รหัสความปลอดภัยขั้นสูง

  • รหัสความเป็นส่วนตัวขั้นสูง

  • ตั้งแต่ Android 14 เป็นต้นไป ความปลอดภัยขั้นสูงและ หน้าการตั้งค่าความเป็นส่วนตัวขั้นสูง ได้รวมอยู่ใน "ความปลอดภัยเพิ่มเติม & ความเป็นส่วนตัว" หน้าเว็บที่มีการดำเนินการผ่าน Intent "com.android.settings.MORE_SECURITY_PRIVACY_SETTINGS"

แหล่งที่มาของความปลอดภัย

ศูนย์ความปลอดภัยจะผสานรวมกับชุดแหล่งข้อมูลด้านความปลอดภัยที่เฉพาะเจาะจงจาก แอปการตั้งค่า:

  • แหล่งที่มาของความปลอดภัยของหน้าจอล็อกจะยืนยันว่าคุณได้ตั้งค่าหน้าจอล็อกด้วย รหัสผ่าน (หรือการรักษาความปลอดภัยอื่นๆ) เพื่อให้แน่ใจว่าข้อมูลส่วนตัวของผู้ใช้ จะได้รับการเก็บรักษาไว้อย่างปลอดภัยจากการเข้าถึงจากภายนอก
  • แพลตฟอร์มความปลอดภัยด้านข้อมูลไบโอเมตริก (ซ่อนอยู่โดยค่าเริ่มต้น) เพื่อผสานรวมกับ เซ็นเซอร์ลายนิ้วมือหรือใบหน้า

คุณเข้าถึงซอร์สโค้ดสำหรับแหล่งข้อมูลของศูนย์ความปลอดภัยเหล่านี้ได้ทาง Android รหัส ค้นหา หากแอปการตั้งค่าไม่ได้ถูกแก้ไข (การเปลี่ยนแปลงชื่อแพ็กเกจจะไม่เกิดขึ้น ซอร์สโค้ดหรือซอร์สโค้ดที่จัดการหน้าจอล็อกและข้อมูลไบโอเมตริก) การผสานรวมนี้ก็น่าจะดำเนินการได้ทันที มิเช่นนั้น จะต้องมีการแก้ไขบางอย่าง อาจจำเป็นต้องใช้ เช่น การเปลี่ยนไฟล์การกำหนดค่าเพื่อเปลี่ยนแพ็กเกจ ชื่อของแอปการตั้งค่าและแหล่งที่มาที่ผสานรวมเข้ากับศูนย์ความปลอดภัย และการผสานรวม โปรดดูข้อมูลเพิ่มเติมในอัปเดตการกำหนดค่า และ การผสานรวม การตั้งค่า

เกี่ยวกับ PendingIntent

หากคุณใช้การผสานรวมศูนย์ความปลอดภัยของแอปการตั้งค่าที่มีอยู่ใน Android 14 ขึ้นไป ข้อบกพร่องที่อธิบายไว้ด้านล่างได้รับการแก้ไขแล้ว ในกรณีนี้ คุณไม่จำเป็นต้องอ่านส่วนนี้

เมื่อแน่ใจว่าไม่มีข้อบกพร่องแล้ว ให้ตั้งค่าทรัพยากรบูลีน XML การกำหนดค่าในแอปการตั้งค่า config_isSafetyCenterLockScreenPendingIntentFixed ถึง true เพื่อปิด วิธีแก้ปัญหาภายในศูนย์ความปลอดภัย

วิธีแก้ปัญหา PendingIntent

ข้อบกพร่องนี้เกิดจากการตั้งค่าโดยใช้อินสแตนซ์เพิ่มเติมของ Intent ในการระบุว่า เพื่อเปิด เนื่องจาก Intent#equals ไม่รับอินสแตนซ์ Intent รายการเพิ่มเติมมาในบัญชี เช่น PendingIntent สำหรับไอคอนเมนูรูปเฟือง แต่ละรายการถือว่าเท่ากัน และไปยัง UI เดียวกัน (แม้ว่าจะ ต้องการนำทางไปยัง UI อื่น) ปัญหานี้ได้รับการแก้ไขในรุ่น QPR โดย กำลังแยกความแตกต่างของอินสแตนซ์ PendingIntent ด้วยรหัสคำขอ หรือ ซึ่งจะแยกความแตกต่างได้โดยใช้ Intent#setId

แหล่งที่มาของความปลอดภัยภายใน

แหล่งข้อมูลของศูนย์ความปลอดภัยบางส่วนเป็นข้อมูลภายในและมีการใช้งานใน แอประบบ PermissionsController ภายในโมดูล PermissionsController เหล่านี้ แหล่งที่มาจะมีลักษณะการทำงานเหมือนแหล่งที่มาในศูนย์ความปลอดภัยทั่วไป และไม่ได้รับแบบพิเศษ ในการรักษา โค้ดสำหรับแหล่งที่มาเหล่านี้จะมีให้ผ่านทางโค้ด Android ค้นหา

สัญญาณเหล่านี้คือสัญญาณด้านความเป็นส่วนตัวเป็นหลัก เช่น

  • การช่วยเหลือพิเศษ
  • เพิกถอนแอปที่ไม่ได้ใช้โดยอัตโนมัติ
  • การเข้าถึงตำแหน่ง
  • ตัวฟังการแจ้งเตือน
  • ข้อมูลนโยบายงาน