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

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

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

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

Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);

startActivity(openSafetyCenterIntent);

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

นอกจากนี้ คุณยังเปลี่ยนเส้นทางไปยังการ์ดคำเตือนของศูนย์ความปลอดภัยที่เฉพาะเจาะจงได้โดยใช้ Intent Extra ที่เฉพาะเจาะจง ฟีเจอร์เพิ่มเติมเหล่านี้ไม่ได้มีไว้ให้บุคคลที่สามใช้ ดังนั้นจึงเป็นส่วนหนึ่งของ 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 นี้

  • 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 มีอยู่ใน Code Search โค้ดการใช้งานของ API มีอยู่ในโค้ด Search

สิทธิ์

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

  • READ_SAFETY_CENTER_STATUS
    • signature|privileged
    • ใช้สำหรับ SafetyCenterManager#isSafetyCenterEnabled() API (ไม่จำเป็นสำหรับแหล่งที่มาของศูนย์ความปลอดภัย แหล่งที่มาดังกล่าวต้องมีสิทธิ์ SEND_SAFETY_CENTER_UPDATE เท่านั้น)
    • แอประบบใช้เพื่อตรวจสอบว่าศูนย์ความปลอดภัยเปิดใช้อยู่หรือไม่
    • มอบสิทธิ์ให้กับแอประบบในรายการที่อนุญาตเท่านั้น
  • SEND_SAFETY_CENTER_UPDATE
    • internal|privileged
    • ใช้สำหรับ API ที่เปิดใช้และ Safety Sources 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 เพื่อเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าอื่นหรือประมวลผลการดำเนินการจากหน้าจอศูนย์ความปลอดภัยโดยตรง
    • บูลีนที่ไม่บังคับเพื่อระบุว่าปัญหานี้แก้ไขได้โดยตรงจากหน้าจอศูนย์ความปลอดภัยหรือไม่ (ค่าเริ่มต้นคือ 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 รายการเดียวหรือ 2 รายการ หากความสามารถในการดำเนินการไม่ใช่ ISSUE_ACTIONABILITY_MANUAL ระบบจะอนุญาตให้มี Action เป็น 0 ได้
    • OnDismiss PendingIntent ต้องไม่เปิดอินสแตนซ์ Activity
    • ข้อกำหนดเพิ่มเติมที่กำหนดโดยการกำหนดค่า API

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

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

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

คุณสามารถดูข้อมูลล่าสุดที่ส่งไปยังศูนย์ความปลอดภัยสำหรับแหล่งที่มาที่แอปของคุณเป็นเจ้าของได้ โดยใช้ข้อมูลนี้เพื่อแสดงข้อมูลใน 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" ในไฟล์การกําหนดค่าเพื่อให้แหล่งที่มารับการออกอากาศที่ส่งในกรณีเหล่านี้

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

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

  • 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) หรือใช้ตัวรับสัญญาณออกอากาศ (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 สามารถใช้กับผู้ใช้และโปรไฟล์ต่างๆ ได้ ดูข้อมูลเพิ่มเติมได้ที่การสร้างแอปที่รองรับผู้ใช้หลายคน ออบเจ็กต์ 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) เพิ่มเติมได้ แต่การทดสอบดังกล่าวอยู่นอกขอบเขตของคู่มือนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการเขียนการทดสอบจากต้นทางถึงปลายทางเหล่านี้ได้ที่การทดสอบ CTS (CtsSafetyCenterTestCases)

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

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

สิทธิ์

  • MANAGE_SAFETY_CENTER
    • internal|installer|role
    • ใช้สำหรับ API ของศูนย์ความปลอดภัยภายใน
    • อนุญาตเฉพาะ PermissionController และ shell

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

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

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

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

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

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

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

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

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

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

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

ศูนย์ความปลอดภัยผสานรวมกับแหล่งที่มาของความปลอดภัยชุดหนึ่งที่แอปการตั้งค่ามีให้ ดังนี้

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

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

เกี่ยวกับ PendingIntent

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

สำหรับ PendingIntent

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

วิธีแก้ปัญหาเกี่ยวกับ PendingIntent

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

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

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

โดยส่วนใหญ่จะเป็นสัญญาณความเป็นส่วนตัว เช่น

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