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

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

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

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

Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);

startActivity(openSafetyCenterIntent);

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

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

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

  • EXTRA_SAFETY_SOURCE_ID
    • ค่าสตริง: android.safetycenter.extra.SAFETY_SOURCE_ID
    • ประเภทสตริง: ระบุ 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 จะแสดงเป็นรายการที่ยุบได้)

เป็นไปได้ที่จะเปลี่ยนเส้นทางไปยังหน้าย่อยที่เฉพาะเจาะจงโดยใช้ความตั้งใจพิเศษนี้:

  • EXTRA_SAFETY_SOURCES_GROUP_ID
    • ค่าสตริง: android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID
    • ประเภทสตริง: ระบุ 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 มีอยู่ใน Code Search

สิทธิ์

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 ที่จำเป็นในการเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าอื่นหรือดำเนินการดำเนินการโดยตรงจากหน้าจอศูนย์ความปลอดภัย
    • บูลีนเสริมเพื่อระบุว่าปัญหานี้สามารถแก้ไขได้โดยตรงจากหน้าจอศูนย์ความปลอดภัยหรือไม่ (ค่าเริ่มต้นคือ 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 หนึ่งหรือสองรายการ หากความสามารถในการดำเนินการไม่ใช่ ISSUE_ACTIONABILITY_MANUAL จะอนุญาตให้มี Action เป็นศูนย์ได้
    • OnDismiss 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 ทางเลือกสำหรับ ID การออกอากาศรีเฟรช
  • ตัวระบุ 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
    • ทริกเกอร์เมื่อศูนย์ความปลอดภัยส่งคำขอเพื่อรีเฟรชข้อมูลของแหล่งที่มาด้านความปลอดภัยสำหรับแอปที่ระบุ
    • เจตนาที่ได้รับการคุ้มครองซึ่งสามารถส่งได้โดยระบบเท่านั้น
    • ส่งไปยังแหล่งความปลอดภัยทั้งหมดในไฟล์การกำหนดค่าโดยมีจุดประสงค์ที่ชัดเจน และต้องได้รับอนุญาต 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 สำหรับสิ่งนั้น)
    • เจตนาที่ได้รับการคุ้มครองซึ่งสามารถส่งได้โดยระบบเท่านั้น
    • ส่งไปยังแหล่งความปลอดภัยทั้งหมดในไฟล์การกำหนดค่าโดยมีจุดประสงค์ที่ชัดเจน ต้องได้รับอนุญาต SEND_SAFETY_CENTER_UPDATE
    • ส่งเป็นเจตนาโดยนัยที่ต้องได้รับอนุญาต READ_SAFETY_CENTER_STATUS

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

ดำเนินการแก้ไขการกระทำ

การดำเนินการแก้ไขคืออินสแตนซ์ 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 ใช้ได้กับผู้ใช้และโปรไฟล์ สำหรับข้อมูลเพิ่มเติม โปรดดูที่ การสร้างแอป Multiuser-AwareContext บริบทที่ให้ 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);
}

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

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

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

สิทธิ์

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

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

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

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

เมื่อเปิดใช้งานศูนย์ความปลอดภัย:

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

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

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

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

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

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

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

เกี่ยวกับ PendingIntent

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

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

วิธีแก้ปัญหาชั่วคราวที่รอดำเนินการ

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

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

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

สิ่งเหล่านี้ส่วนใหญ่เป็นสัญญาณความเป็นส่วนตัว เช่น:

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