เปลี่ยนเส้นทางไปยังศูนย์ความปลอดภัย
แอปต่างๆ สามารถเปิดศูนย์ความปลอดภัยได้โดยใช้การกระทำ 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-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);
}
คุณสามารถเขียนการทดสอบแบบ 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 14 เป็นต้นไป หน้าการรักษาความปลอดภัยขั้นสูงและการตั้งค่าความเป็นส่วนตัวขั้นสูงจะรวมเข้าไว้ในหน้า "ความปลอดภัยและความเป็นส่วนตัวเพิ่มเติม" หน้าเดียวโดยมี Intent Action
"com.android.settings.MORE_SECURITY_PRIVACY_SETTINGS"
แหล่งความปลอดภัย
ศูนย์ความปลอดภัยทำงานร่วมกับชุดแหล่งความปลอดภัยเฉพาะที่แอปการตั้งค่ามีให้:
- แหล่งที่มาด้านความปลอดภัยของหน้าจอล็อคจะตรวจสอบว่าหน้าจอล็อคได้รับการตั้งค่าด้วยรหัสผ่าน (หรือความปลอดภัยอื่นๆ) เพื่อให้แน่ใจว่าข้อมูลส่วนตัวของผู้ใช้จะถูกเก็บไว้อย่างปลอดภัยจากการเข้าถึงจากภายนอก
- แหล่งที่มาด้านความปลอดภัยทางชีวภาพ (ซ่อนไว้โดยค่าเริ่มต้น) พื้นผิวเพื่อรวมเข้ากับลายนิ้วมือหรือเซ็นเซอร์ใบหน้า
ซอร์สโค้ดสำหรับแหล่งที่มาของศูนย์ความปลอดภัยเหล่านี้สามารถเข้าถึงได้ผ่าน การค้นหาโค้ดของ Android หากไม่มีการแก้ไขแอปการตั้งค่า (ไม่ได้ทำการเปลี่ยนแปลงชื่อแพ็คเกจ ซอร์สโค้ด หรือซอร์สโค้ดที่เกี่ยวข้องกับหน้าจอล็อคและไบโอเมตริก) การรวมนี้ควรจะใช้งานได้ทันที มิฉะนั้น อาจต้องมีการแก้ไขบางอย่าง เช่น การเปลี่ยนไฟล์การกำหนดค่าเพื่อเปลี่ยนชื่อแพ็คเกจของแอปการตั้งค่าและแหล่งที่มาที่ผสานรวมกับศูนย์ความปลอดภัย รวมถึงการผสานรวม สำหรับข้อมูลเพิ่มเติม โปรดดูที่ อัปเดตไฟล์การกำหนดค่า และ การตั้งค่าการรวม
เกี่ยวกับ PendingIntent
หากคุณใช้การผสานรวมศูนย์ความปลอดภัยของแอปการตั้งค่าที่มีอยู่ใน Android 14 ขึ้นไป ข้อบกพร่องที่อธิบายด้านล่างได้รับการแก้ไขแล้ว ในกรณีนี้ไม่จำเป็นต้องอ่านส่วนนี้
เมื่อคุณแน่ใจว่าไม่มีข้อบกพร่อง ให้ตั้งค่าการกำหนดค่าทรัพยากรบูลีน XML ในแอปการตั้งค่า config_isSafetyCenterLockScreenPendingIntentFixed
เป็น true
เพื่อปิดวิธีแก้ปัญหาภายในศูนย์ความปลอดภัย
วิธีแก้ปัญหาชั่วคราวที่รอดำเนินการ
จุดบกพร่องนี้เกิดจากการตั้งค่าที่ใช้อินสแตนซ์พิเศษ Intent
เพื่อกำหนดว่าควรเปิดส่วนใด เนื่องจาก Intent#equals
ไม่ได้คำนึงถึงอินสแตนซ์พิเศษ Intent
อินสแตนซ์ PendingIntent
สำหรับไอคอนเมนูรูปเฟืองและรายการจึงถือว่าเท่ากันและนำทางไปยัง UI เดียวกัน (แม้ว่าจะมีจุดประสงค์เพื่อนำทางไปยัง UI อื่นก็ตาม) ปัญหานี้ได้รับการแก้ไขแล้วในรุ่น QPR โดยการแยกอินสแตนซ์ PendingIntent
ด้วยรหัสคำขอ หรืออาจสร้างความแตกต่างโดยใช้ Intent#setId
แหล่งความปลอดภัยภายใน
แหล่งที่มาของศูนย์ความปลอดภัยบางแหล่งเป็นแหล่งข้อมูลภายในและนำไปใช้ในแอประบบ PermissionController ภายในโมดูล PermissionController แหล่งที่มาเหล่านี้ทำงานเหมือนกับแหล่งที่มาของศูนย์ความปลอดภัยทั่วไปและไม่ได้รับการดูแลเป็นพิเศษ รหัสสำหรับแหล่งที่มาเหล่านี้มีอยู่ใน การค้นหาโค้ดของ Android
สิ่งเหล่านี้ส่วนใหญ่เป็นสัญญาณความเป็นส่วนตัว เช่น:
- การเข้าถึง
- เพิกถอนแอปที่ไม่ได้ใช้โดยอัตโนมัติ
- การเข้าถึงตำแหน่ง
- ผู้ฟังการแจ้งเตือน
- ข้อมูลนโยบายการทำงาน