เปลี่ยนเส้นทางไปยังศูนย์ความปลอดภัย
ทุกแอปสามารถเปิดศูนย์ความปลอดภัยโดยใช้
การดำเนินการ android.content.Intent.ACTION_SAFETY_CENTER
(ค่าสตริง
android.intent.action.SAFETY_CENTER
)
หากต้องการเปิดศูนย์ความปลอดภัย ให้โทรจากภายในอินสแตนซ์ Activity
โดยทำดังนี้
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);
startActivity(openSafetyCenterIntent);
เปลี่ยนเส้นทางไปยังปัญหาที่เฉพาะเจาะจง
ยังสามารถเปลี่ยนเส้นทางไปยังการ์ดคำเตือนของศูนย์ความปลอดภัยที่เฉพาะเจาะจงได้โดยใช้
Intent เพิ่มเติมที่เฉพาะเจาะจง บริการเสริมเหล่านี้ไม่ได้มีไว้เพื่อใช้โดยบุคคลที่สาม
เป็นส่วนหนึ่งของ SafetyCenterManager
ซึ่งเป็นส่วนหนึ่งของ @SystemApi
เฉพาะ
แอประบบสามารถเข้าถึงส่วนเสริมเหล่านี้
บริการเสริม Intent ที่เปลี่ยนเส้นทางการ์ดคำเตือนที่เฉพาะเจาะจง
EXTRA_SAFETY_SOURCE_ID
- ค่าสตริง:
android.safetycenter.extra.SAFETY_SOURCE_ID
- ประเภทสตริง: ระบุรหัสของแหล่งที่มาความปลอดภัยของข้อมูลที่เกี่ยวข้อง การ์ดคำเตือน
- ต้องระบุเพื่อให้การเปลี่ยนเส้นทางไปยังปัญหาทำงานได้
- ค่าสตริง:
EXTRA_SAFETY_SOURCE_ISSUE_ID
- ค่าสตริง:
android.safetycenter.extra.SAFETY_SOURCE_ISSUE_ID
- ประเภทสตริง: ระบุรหัสการ์ดคําเตือน
- ต้องระบุเพื่อให้การเปลี่ยนเส้นทางไปยังปัญหาทำงานได้
- ค่าสตริง:
EXTRA_SAFETY_SOURCE_USER_HANDLE
- ค่าสตริง:
android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE
- ประเภท
UserHandle
: ระบุUserHandle
สำหรับคำเตือนที่เกี่ยวข้อง ไพ่ - ไม่บังคับ (ค่าเริ่มต้นคือผู้ใช้ปัจจุบัน)
- ค่าสตริง:
ข้อมูลโค้ดด้านล่างใช้จากภายในอินสแตนซ์ Activity
เพื่อเปิดได้
ปัญหาที่เฉพาะเจาะจงบนหน้าจอของศูนย์ความปลอดภัย
UserHandle theUserHandleThisIssueCameFrom = …;
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_ID, "TheSafetySourceIdThisIssueCameFrom")
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_ISSUE_ID, "TheSafetySourceIssueIdToRedirectTo")
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_USER_HANDLE, theUserHandleThisIssueCameFrom);
startActivity(openSafetyCenterIntent);
เปลี่ยนเส้นทางไปยังหน้าย่อยที่เจาะจง (ตั้งแต่ Android 14 เป็นต้นไป)
ใน Android 14 ขึ้นไป หน้าศูนย์ความปลอดภัยจะแยกออกจากกัน
ลงในหน้าเว็บย่อยหลายหน้าซึ่งแสดงถึงSafetySourcesGroup
ที่แตกต่างกัน (ใน
Android 13 ข้อมูลนี้จะแสดงเป็นรายการที่ยุบได้)
คุณจะเปลี่ยนเส้นทางไปยังหน้าย่อยหน้าใดหน้าหนึ่งได้โดยใช้ Intent เพิ่มเติมต่อไปนี้
EXTRA_SAFETY_SOURCES_GROUP_ID
- ค่าสตริง:
android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID
- ประเภทสตริง: ระบุรหัสของ
SafetySourcesGroup
- ต้องระบุเพื่อให้การเปลี่ยนเส้นทางไปยังหน้าย่อยทำงานได้
- ค่าสตริง:
ข้อมูลโค้ดด้านล่างใช้จากภายในอินสแตนซ์ Activity
เพื่อเปิดได้
หน้าจอศูนย์ความปลอดภัยไปยังหน้าย่อยที่เจาะจง
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID, "TheSafetySourcesGroupId");
startActivity(openSafetyCenterIntent);
ใช้ API แหล่งที่มาของศูนย์ความปลอดภัย
API แหล่งที่มาของศูนย์ความปลอดภัยพร้อมให้ใช้งานโดยใช้
SafetyCenterManager
(ซึ่งก็คือ @SystemApi
) โค้ดสำหรับแพลตฟอร์ม API มีอยู่ใน
รหัส
ค้นหา
โค้ดการใช้งานของ API อยู่ในโค้ด
ค้นหา
สิทธิ์
มีเพียงแอประบบในรายการที่อนุญาตเท่านั้นที่จะเข้าถึง API แหล่งที่มาของศูนย์ความปลอดภัยได้ โดยใช้สิทธิ์ที่ระบุไว้ด้านล่าง สำหรับข้อมูลเพิ่มเติม โปรดดูสิทธิพิเศษ รายการที่อนุญาต
READ_SAFETY_CENTER_STATUS
signature|privileged
- ใช้สำหรับ
SafetyCenterManager#isSafetyCenterEnabled()
API (ไม่ใช่ สำหรับแหล่งข้อมูลในศูนย์ความปลอดภัย พวกเขาต้องการเพียง สิทธิ์SEND_SAFETY_CENTER_UPDATE
) - ใช้โดยแอปของระบบที่จะตรวจสอบว่าศูนย์ความปลอดภัยเปิดใช้อยู่หรือไม่
- อนุญาตเฉพาะแอประบบในรายการที่อนุญาตเท่านั้น
SEND_SAFETY_CENTER_UPDATE
internal|privileged
- ใช้สำหรับ API ที่เปิดใช้และ API แหล่งที่มาของความปลอดภัย
- ใช้โดยแหล่งข้อมูลด้านความปลอดภัยเท่านั้น
- อนุญาตเฉพาะแอประบบในรายการที่อนุญาตเท่านั้น
สิทธิ์เหล่านี้เป็นสิทธิ์เฉพาะบุคคล และคุณสามารถขอได้ด้วยการเพิ่มลงใน
ไฟล์ที่เกี่ยวข้อง เช่น
com.android.settings.xml
สำหรับแอปการตั้งค่า และในไฟล์ AndroidManifest.xml
ของแอป โปรดดู
protectionLevel
เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลสิทธิ์
รับ SafetyCenterManager
SafetyCenterManager
เป็นชั้นเรียน @SystemApi
ที่เข้าถึงได้จากแอประบบ
เริ่มตั้งแต่ Android 13 การพูดคุยนี้จะสาธิตวิธีการ
รับ SafetyCenterManager:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
// Must be on T or above to interact with Safety Center.
return;
}
SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
if (safetyCenterManager == null) {
// Should not be null on T.
return;
}
ตรวจสอบว่าศูนย์ความปลอดภัยเปิดอยู่หรือไม่
การโทรนี้จะตรวจสอบว่าได้เปิดใช้ศูนย์ความปลอดภัยอยู่หรือไม่ การโทรนี้จำเป็นต้องมี
READ_SAFETY_CENTER_STATUS
หรือสิทธิ์ SEND_SAFETY_CENTER_UPDATE
:
boolean isSafetyCenterEnabled = safetyCenterManager.isSafetyCenterEnabled();
if (isSafetyCenterEnabled) {
// …
} else {
// …
}
ให้ข้อมูล
ข้อมูลต้นทางของศูนย์ความปลอดภัยที่มี String sourceId
ที่ระบุมีไว้เพื่อความปลอดภัย
ตรงกลางด้วยออบเจ็กต์ SafetySourceData
ซึ่งแสดงถึงรายการ UI และ
รายการปัญหา (การ์ดคำเตือน) รายการ UI และการ์ดคำเตือนอาจมี
ระดับความรุนแรงที่แตกต่างกันที่ระบุในคลาส SafetySourceData
:
SEVERITY_LEVEL_UNSPECIFIED
- ไม่ได้ระบุความรุนแรง
- สี: เทาหรือโปร่งใส (ขึ้นอยู่กับ
SafetySourcesGroup
ของ รายการ) - ใช้สําหรับข้อมูลแบบไดนามิกที่ทําเป็นรายการแบบคงที่ใน UI หรือเพื่อแสดง รายการที่ไม่ได้ระบุ
- ต้องไม่ใช้สำหรับการ์ดคำเตือน
SEVERITY_LEVEL_INFORMATION
- ข้อมูลพื้นฐานหรือคำแนะนำเล็กๆ น้อยๆ
- สี: เขียว
SEVERITY_LEVEL_RECOMMENDATION
- คำแนะนำที่ผู้ใช้ควรดำเนินการกับปัญหานี้ เนื่องจาก อาจทำให้พวกเขาตกอยู่ในความเสี่ยง
- สี: เหลือง
SEVERITY_LEVEL_CRITICAL_WARNING
- คำเตือนสำคัญว่าผู้ใช้ต้องดำเนินการกับปัญหานี้ เนื่องจาก มีความเสี่ยง
- สี: แดง
SafetySourceData
ออบเจ็กต์ SafetySourceData
ประกอบด้วยรายการ UI, การ์ดคำเตือน และ
ค่าคงที่
- อินสแตนซ์
SafetySourceStatus
ที่ไม่บังคับ (รายการ UI) - รายการอินสแตนซ์
SafetySourceIssue
รายการ (การ์ดคำเตือน) - ตัวเลือกเพิ่มเติม
Bundle
รายการ (เริ่ม 14) - ตัวแปร:
- รายการ
SafetySourceIssue
ต้องประกอบด้วยปัญหาที่มี บางอย่าง - อินสแตนซ์
SafetySourceIssue
ต้องไม่มีความสำคัญมากกว่าSafetySourceStatus
หากมี (ยกเว้นSafetySourceStatus
คือSEVERITY_LEVEL_UNSPECIFIED
ซึ่งในกรณีนี้คือSEVERITY_LEVEL_INFORMATION
ปัญหา) - ต้องเป็นไปตามข้อกำหนดเพิ่มเติมที่กำหนดโดยการกำหนดค่า API
ตัวอย่างเช่น หากแหล่งที่มาเป็นปัญหาเท่านั้น แหล่งที่มานั้นต้องไม่ระบุ
SafetySourceStatus
- รายการ
SafetySourceStatus
- ต้องระบุชื่อ
CharSequence
- ต้องมีข้อมูลสรุป
CharSequence
- ระดับความรุนแรงที่กำหนด
- ไม่บังคับ
PendingIntent
อินสแตนซ์เพื่อเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าที่ถูกต้อง (ค่าเริ่มต้นใช้intentAction
จากการกำหนดค่า หากมี) - ไม่บังคับ
IconAction
(แสดงเป็นไอคอนด้านข้างในรายการ) ที่ประกอบด้วย- ประเภทไอคอนที่จำเป็น ซึ่งต้องเป็นประเภทอย่างใดอย่างหนึ่งต่อไปนี้
ICON_TYPE_GEAR
: แสดงเป็นรูปเฟืองถัดจากรายการ UIICON_TYPE_INFO
: แสดงเป็นไอคอนข้อมูลถัดจากรายการ UI
- จำเป็น
PendingIntent
เปลี่ยนเส้นทางผู้ใช้ไปยังหน้าอื่น
- ประเภทไอคอนที่จำเป็น ซึ่งต้องเป็นประเภทอย่างใดอย่างหนึ่งต่อไปนี้
- ค่า
enabled
บูลีนที่ไม่บังคับที่อนุญาตให้ทำเครื่องหมายรายการ UI เป็น ปิดใช้อยู่ จึงไม่สามารถคลิกได้ (ค่าเริ่มต้นคือtrue
) - ตัวแปร:
- อินสแตนซ์
PendingIntent
ต้องเปิดอินสแตนซ์Activity
- หากรายการถูกปิดใช้ จะต้องระบุรายการนั้นๆ
SEVERITY_LEVEL_UNSPECIFIED
- ข้อกำหนดเพิ่มเติมที่กำหนดโดยการกำหนดค่า API
- อินสแตนซ์
SafetySourceIssue
- ต้องมีตัวระบุ
String
ที่ไม่ซ้ำกัน - ต้องระบุชื่อ
CharSequence
- คำบรรยายภาษา
CharSequence
(ไม่บังคับ) - ต้องมีข้อมูลสรุป
CharSequence
- ระดับความรุนแรงที่กำหนด
- หมวดหมู่ปัญหาที่ไม่บังคับ ซึ่งต้องเป็นหนึ่งในหมวดหมู่ต่อไปนี้
ISSUE_CATEGORY_DEVICE
: ปัญหานี้ส่งผลต่ออุปกรณ์ของผู้ใช้ISSUE_CATEGORY_ACCOUNT
: ปัญหานี้ส่งผลต่อบัญชีของผู้ใช้ISSUE_CATEGORY_GENERAL
: ปัญหานี้ส่งผลต่อความปลอดภัยทั่วไปของผู้ใช้ โดยตัวเลือกนี้คือค่าเริ่มต้นISSUE_CATEGORY_DATA
(ตั้งแต่ Android 14 เป็นต้นไป): ปัญหานี้ส่งผลกระทบต่อข้อมูลของผู้ใช้ISSUE_CATEGORY_PASSWORDS
(กำลังเริ่ม Android 14): ปัญหาส่งผลกระทบต่อ รหัสผ่านISSUE_CATEGORY_PERSONAL_SAFETY
(กำลังเริ่ม Android 14): ปัญหาส่งผลกระทบต่อส่วนตัวของผู้ใช้ อย่างปลอดภัย
- รายการขององค์ประกอบ
Action
ที่ผู้ใช้ทำได้สำหรับปัญหานี้ แต่ละรายการ อินสแตนซ์Action
รายการที่ประกอบด้วย- ต้องมีตัวระบุ
String
ที่ไม่ซ้ำกัน - ต้องติดป้ายกำกับ
CharSequence
- จำเป็น
PendingIntent
เปลี่ยนเส้นทางผู้ใช้ไปยังหน้าเว็บอื่น หรือประมวลผลการดำเนินการโดยตรงจาก หน้าจอศูนย์ความปลอดภัย - บูลีนที่ไม่บังคับเพื่อระบุว่าปัญหานี้แก้ไขได้โดยตรงจาก
หน้าจอ SafetyCenter (ค่าเริ่มต้นคือ
false
) - ข้อความแสดงการสำเร็จ
CharSequence
ที่ไม่บังคับ ที่จะแสดงต่อผู้ใช้ เมื่อปัญหาได้รับการแก้ไขจากศูนย์ความปลอดภัยโดยตรงเรียบร้อยแล้ว หน้าจอ
- ต้องมีตัวระบุ
- ไม่บังคับ
PendingIntent
ที่มีการเรียกใช้เมื่อผู้ใช้ปิดปัญหา (ค่าเริ่มต้นคือ โทรหา) - ต้องมีตัวระบุประเภทปัญหา
String
รายการ กรณีนี้คล้ายกับปัญหา แต่ไม่จําเป็นต้องไม่ซ้ำกันและใช้สําหรับการบันทึก String
ที่ไม่บังคับสำหรับรหัสการกรองข้อมูลที่ซ้ำกันออก ซึ่งจะช่วยให้โพสต์SafetySourceIssue
จากแหล่งที่มาต่างๆ และแสดงเพียงครั้งเดียวใน UI สมมติมีdeduplicationGroup
เดียวกัน (เมื่อเริ่มใช้ Android 14) หากไม่ได้ระบุ ปัญหาจะไม่เป็น กรองข้อมูลที่ซ้ำกันออกแล้ว- ไม่บังคับ
CharSequence
สำหรับชื่อการระบุแหล่งที่มา นี่คือข้อความที่แสดง แหล่งที่มาของการ์ดคำเตือน (การเริ่มใช้งาน Android 14) หากไม่ได้ระบุ จะใช้ชื่อของSafetySourcesGroup
- ความสามารถในการดำเนินการของปัญหาที่ไม่บังคับ (ตั้งแต่ Android 14 เป็นต้นไป)
ซึ่งต้องเป็นหนึ่งในรายการต่อไปนี้
ISSUE_ACTIONABILITY_MANUAL
: ผู้ใช้ต้องแก้ไขปัญหานี้ ด้วยตนเอง โดยตัวเลือกนี้คือค่าเริ่มต้นISSUE_ACTIONABILITY_TIP
: ปัญหานี้เป็นเพียงเคล็ดลับและอาจไม่ต้องการ ข้อมูลจากผู้ใช้ISSUE_ACTIONABILITY_AUTOMATIC
: ปัญหานี้ดำเนินการไปแล้ว และอาจไม่ได้ต้องการข้อมูลจากผู้ใช้
- ลักษณะการทำงานของการแจ้งเตือนที่ไม่บังคับ (ขณะเริ่มใช้งาน Android
14) ซึ่งต้องเป็นหนึ่งในรายการต่อไปนี้
NOTIFICATION_BEHAVIOR_UNSPECIFIED
: ศูนย์ความปลอดภัยจะตัดสินใจว่า จำเป็นต้องมีการแจ้งเตือนสำหรับการ์ดคำเตือน โดยตัวเลือกนี้คือค่าเริ่มต้นNOTIFICATION_BEHAVIOR_NEVER
: ไม่มีการโพสต์การแจ้งเตือนNOTIFICATION_BEHAVIOR_DELAYED
: มีการโพสต์การแจ้งเตือนเป็นระยะเวลาหนึ่ง หลังจากที่มีการรายงานปัญหาครั้งแรกNOTIFICATION_BEHAVIOR_IMMEDIATELY
: ระบบจะโพสต์การแจ้งเตือนทันทีที่ มีการรายงานปัญหาแล้ว
Notification
(ไม่บังคับ) สำหรับแสดงการแจ้งเตือนที่กำหนดเองพร้อมการ์ดคำเตือน (ตั้งแต่ Android 14 เป็นต้นไป) หากไม่ได้ระบุ ค่าNotification
ได้มาจากการ์ดคำเตือน ประกอบด้วย:- ต้องระบุชื่อ
CharSequence
- ต้องมีข้อมูลสรุป
CharSequence
- รายการองค์ประกอบ
Action
ที่ผู้ใช้ดำเนินการกับการแจ้งเตือนนี้ได้
- ต้องระบุชื่อ
- ตัวแปร:
- รายการอินสแตนซ์
Action
ต้องประกอบด้วยการดำเนินการที่มีไม่ซ้ำกัน ตัวระบุ - รายการของอินสแตนซ์
Action
ต้องมีAction
1 หรือ 2 รายการ จากองค์ประกอบเหล่านี้ หากความสามารถในการดำเนินการไม่ใช่ISSUE_ACTIONABILITY_MANUAL
ไม่อนุญาตให้มีAction
- OnOff
PendingIntent
ต้องไม่เปิดอินสแตนซ์Activity
- ข้อกำหนดเพิ่มเติมที่กำหนดโดยการกำหนดค่า API
- รายการอินสแตนซ์
ข้อมูลจะได้รับมาจากเหตุการณ์บางอย่างในศูนย์ความปลอดภัย ดังนั้นจึงจำเป็นต่อ
ระบุสิ่งที่ทำให้แหล่งที่มาระบุ SafetySourceData
ด้วย
SafetyEvent
SafetyEvent
- ประเภทที่จำเป็น ซึ่งต้องเป็นประเภทอย่างใดอย่างหนึ่งต่อไปนี้
SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
: สถานะของแหล่งที่มามี มีการเปลี่ยนแปลงSAFETY_EVENT_TYPE_REFRESH_REQUESTED
: การตอบกลับการรีเฟรช/สแกนอีกครั้ง สัญญาณจากศูนย์ความปลอดภัย ใช้สิ่งนี้แทนSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
เพื่อให้ศูนย์ความปลอดภัยทำงาน ติดตามคำขอรีเฟรช/สแกนอีกครั้งSAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
: เราแก้ปัญหาแล้วSafetySourceIssue.Action
โดยตรงจากหน้าจอศูนย์ความปลอดภัย ใช้ สิ่งนี้แทนที่จะเป็นSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
เพื่อความปลอดภัย ศูนย์เพื่อให้ติดตามSafetySourceIssue.Action
ที่กำลังมีการแก้ไขได้SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
: เราพยายามแก้ไขSafetySourceIssue.Action
โดยตรงจากหน้าจอศูนย์ความปลอดภัย แต่ ไม่สำเร็จ ใช้สิ่งนี้แทนSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
สำหรับศูนย์ความปลอดภัยเพื่อให้ แทร็กSafetySourceIssue.Action
ล้มเหลวSAFETY_EVENT_TYPE_DEVICE_LOCALE_CHANGED
: ภาษาของอุปกรณ์ มีการเปลี่ยนแปลง ด้วยเหตุนี้เราจึงอัปเดตข้อความของข้อมูลที่ให้มา คือ ได้รับอนุญาตให้ใช้SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
สำหรับกรณีนี้SAFETY_EVENT_TYPE_DEVICE_REBOOTED
: เราให้ข้อมูลนี้เป็นส่วนหนึ่งของ ของการเปิดเครื่องครั้งแรก เนื่องจากไม่มีการยืนยันข้อมูลศูนย์ความปลอดภัยใน การรีบูต; ได้รับอนุญาตให้ใช้SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
สำหรับเรื่องนี้
- ตัวระบุ
String
ที่ไม่บังคับสำหรับรหัสการออกอากาศการรีเฟรช - ตัวระบุ
String
ที่ไม่บังคับสำหรับอินสแตนซ์SafetySourceIssue
ที่รับ แก้ปัญหาแล้ว - ตัวระบุ
String
ที่ไม่บังคับสำหรับอินสแตนซ์SafetySourceIssue.Action
กำลังแก้ไข - ตัวแปร:
- ต้องระบุรหัสการออกอากาศการรีเฟรชหากประเภทคือ
SAFETY_EVENT_TYPE_REFRESH_REQUESTED
- ต้องระบุปัญหาและรหัสการดำเนินการหากมีประเภทเป็น
SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
หรือ วันที่SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
- ต้องระบุรหัสการออกอากาศการรีเฟรชหากประเภทคือ
ด้านล่างคือตัวอย่างวิธีที่แหล่งข้อมูลอาจให้ข้อมูลแก่ศูนย์ความปลอดภัย (ใน ในกรณีที่เป็นการแสดงรายการพร้อมการ์ดคำเตือนใบเดียว)
PendingIntent redirectToMyScreen =
PendingIntent.getActivity(
context, requestCode, redirectToMyScreenIntent, PendingIntent.FLAG_IMMUTABLE);
SafetySourceData safetySourceData =
new SafetySourceData.Builder()
.setStatus(
new SafetySourceStatus.Builder(
"title", "summary", SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION)
.setPendingIntent(redirectToMyScreen)
.build())
.addIssue(
new SafetySourceIssue.Builder(
"MyIssueId",
"title",
"summary",
SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION,
"MyIssueTypeId")
.setSubtitle("subtitle")
.setIssueCategory(SafetySourceIssue.ISSUE_CATEGORY_DEVICE)
.addAction(
new SafetySourceIssue.Action.Builder(
"MyIssueActionId", "label", redirectToMyScreen)
.build())
.build())
.build();
SafetyEvent safetyEvent = new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
safetyCenterManager.setSafetySourceData("MySourceId", safetySourceData, safetyEvent);
รับข้อมูลสุดท้ายที่ให้ไว้
คุณสามารถดูข้อมูลล่าสุดที่ให้ไว้กับศูนย์ความปลอดภัยสำหรับแหล่งข้อมูลที่
แอป คุณสามารถใช้ URL นี้เพื่อแสดงบางอย่างใน UI ของคุณเอง เพื่อตรวจสอบว่าข้อมูล
จำเป็นต้องอัปเดตก่อนปฏิบัติการที่มีค่าใช้จ่ายสูง หรือเพื่อจัดเตรียม
อินสแตนซ์ SafetySourceData
เดียวกันไปยังศูนย์ความปลอดภัยโดยมีการเปลี่ยนแปลงบางอย่างหรือมี
อินสแตนซ์ SafetyEvent
ใหม่ และยังมีประโยชน์สำหรับการทดสอบ
ใช้รหัสนี้เพื่อรับข้อมูลล่าสุดที่ส่งไปยังศูนย์ความปลอดภัย
SafetySourceData lastDataProvided =
safetyCenterManager.getSafetySourceData("MySourceId");
รายงานข้อผิดพลาด
หากรวบรวมข้อมูล SafetySourceData
ไม่ได้ คุณสามารถรายงานข้อผิดพลาดไปยังความปลอดภัยได้
กึ่งกลาง ซึ่งจะเปลี่ยนรายการเป็นสีเทา ล้างข้อมูลที่แคชไว้ และให้
บางอย่าง เช่น ตรวจสอบการตั้งค่าไม่ได้ นอกจากนี้ คุณยังรายงานข้อผิดพลาดได้ในกรณีต่อไปนี้
อินสแตนซ์ของ SafetySourceIssue.Action
แก้ไขไม่สำเร็จ ซึ่งในกรณีนี้
โดยจะไม่ล้างข้อมูลที่แคชไว้และรายการ UI จะไม่เปลี่ยนแปลง แต่ข้อความคือ
แสดงต่อผู้ใช้ เพื่อแจ้งให้ทราบว่ามีข้อผิดพลาดเกิดขึ้น
คุณสามารถให้ข้อผิดพลาดโดยใช้ SafetySourceErrorDetails
ซึ่งเป็นข้อความที่เขียน
จาก:
SafetySourceErrorDetails
: อินสแตนซ์SafetyEvent
ที่จำเป็น:
// An error has occurred in the background, need to clear the Safety Center data to avoid showing data that may not be valid anymore
SafetyEvent safetyEvent = new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
SafetySourceErrorDetails safetySourceErrorDetails = new SafetySourceErrorDetails(safetyEvent);
safetyCenterManager.reportSafetySourceError("MySourceId", safetySourceErrorDetails);
ตอบกลับคำขอรีเฟรชหรือสแกนอีกครั้ง
คุณรับสัญญาณจากศูนย์ความปลอดภัยเพื่อให้ข้อมูลใหม่ได้ การตอบกลับ คำขอรีเฟรชหรือสแกนอีกครั้งช่วยให้แน่ใจว่าผู้ใช้ดูสถานะปัจจุบันเมื่อ เปิดศูนย์ความปลอดภัยและเมื่อผู้ใช้แตะปุ่มสแกน
ซึ่งทำได้โดยการรับการออกอากาศซึ่งมีการดำเนินการดังต่อไปนี้
ACTION_REFRESH_SAFETY_SOURCES
- ค่าสตริง:
android.safetycenter.action.REFRESH_SAFETY_SOURCES
- ทริกเกอร์เมื่อศูนย์ความปลอดภัยส่งคำขอรีเฟรชข้อมูลของ แหล่งข้อมูลความปลอดภัยของแอปที่ระบุ
- เจตนาที่มีการป้องกันที่สามารถส่งได้โดยระบบเท่านั้น
- ส่งไปยังแหล่งที่มาความปลอดภัยทั้งหมดในไฟล์การกำหนดค่าโดยโจ่งแจ้ง
Intent และต้องมีสิทธิ์
SEND_SAFETY_CENTER_UPDATE
- ค่าสตริง:
บริการเสริมต่อไปนี้เป็นส่วนหนึ่งของการออกอากาศครั้งนี้
EXTRA_REFRESH_SAFETY_SOURCE_IDS
- ค่าสตริง:
android.safetycenter.extra.REFRESH_SAFETY_SOURCE_IDS
- ประเภทอาร์เรย์สตริง (
String[]
) แสดงรหัสแหล่งที่มาที่จะรีเฟรช แอปที่ระบุ
- ค่าสตริง:
EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE
- ค่าสตริง:
android.safetycenter.extra.REFRESH_SAFETY_SOURCES_REQUEST_TYPE
- ประเภทจำนวนเต็ม แสดงประเภทคำขอ
@IntDef
- ต้องเป็นหนึ่งในรายการต่อไปนี้
EXTRA_REFRESH_REQUEST_TYPE_GET_DATA
: ขอแหล่งที่มาเพื่อ จะให้ข้อมูลที่ค่อนข้างรวดเร็ว โดยปกติแล้วเมื่อผู้ใช้เปิดหน้าEXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA
: ขอแหล่งที่มา เพื่อให้ข้อมูลสดใหม่ที่สุดเท่าที่จะเป็นไปได้ โดยทั่วไปเมื่อผู้ใช้ กดปุ่มสแกนอีกครั้ง
- ค่าสตริง:
EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID
- ค่าสตริง:
android.safetycenter.extra.REFRESH_SAFETY_SOURCES_BROADCAST_ID
- ประเภทสตริง แสดงตัวระบุที่ไม่ซ้ำสำหรับการรีเฟรชที่ขอ
- ค่าสตริง:
หากต้องการรับสัญญาณจากศูนย์ความปลอดภัย ให้ใช้
BroadcastReceiver
อินสแตนซ์ การออกอากาศจะส่งพร้อมกับ BroadcastOptions
พิเศษที่ช่วยให้
ตัวรับสัญญาณเพื่อเริ่มบริการที่ทำงานอยู่เบื้องหน้า
BroadcastReceiver
ตอบกลับคำขอรีเฟรช
public final class SafetySourceReceiver extends BroadcastReceiver {
// All the safety sources owned by this application.
private static final String[] ALL_SAFETY_SOURCES = new String[] {"MySourceId1", "…"};
@Override
public void onReceive(Context context, Intent intent) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
// Must be on T or above to interact with Safety Center.
return;
}
String action = intent.getAction();
if (!SafetyCenterManager.ACTION_REFRESH_SAFETY_SOURCES.equals(action)) {
return;
}
String refreshBroadcastId =
intent.getStringExtra(SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID);
if (refreshBroadcastId == null) {
// Should always be provided.
return;
}
String[] sourceIds =
intent.getStringArrayExtra(SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCE_IDS);
if (sourceIds == null) {
sourceIds = ALL_SAFETY_SOURCES;
}
int requestType =
intent.getIntExtra(
SafetyCenterManager.EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE,
SafetyCenterManager.EXTRA_REFRESH_REQUEST_TYPE_GET_DATA);
SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
if (safetyCenterManager == null) {
// Should not be null on T.
return;
}
if (!safetyCenterManager.isSafetyCenterEnabled()) {
// Preferably, no Safety Source code should be run if Safety Center is disabled.
return;
}
SafetyEvent refreshSafetyEvent =
new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_REFRESH_REQUESTED)
.setRefreshBroadcastId(refreshBroadcastId)
.build();
for (String sourceId : sourceIds) {
SafetySourceData safetySourceData = getSafetySourceDataFor(sourceId, requestType);
// Set the data (or report an error with reportSafetySourceError, if something went wrong).
safetyCenterManager.setSafetySourceData(sourceId, safetySourceData, refreshSafetyEvent);
}
}
private SafetySourceData getSafetySourceDataFor(String sourceId, int requestType) {
switch (requestType) {
case SafetyCenterManager.EXTRA_REFRESH_REQUEST_TYPE_GET_DATA:
return getRefreshSafetySourceDataFor(sourceId);
case SafetyCenterManager.EXTRA_REFRESH_REQUEST_TYPE_FETCH_FRESH_DATA:
return getRescanSafetySourceDataFor(sourceId);
default:
}
return getRefreshSafetySourceDataFor(sourceId);
}
// Data to provide when the user opens the page or on specific events.
private SafetySourceData getRefreshSafetySourceDataFor(String sourceId) {
// Get data for the source, if it's a fast operation it could potentially be executed in the
// receiver directly.
// Otherwise, it must start some kind of foreground service or expedited job.
return null;
}
// Data to provide when the user pressed the rescan button.
private SafetySourceData getRescanSafetySourceDataFor(String sourceId) {
// Could be implemented the same way as getRefreshSafetySourceDataFor, depending on the source's
// need.
// Otherwise, could potentially perform a longer task.
// In which case, it must start some kind of foreground service or expedited job.
return null;
}
}
อินสแตนซ์เดียวกันของ BroadcastReceiver
ในตัวอย่างด้านบนมีการประกาศใน
AndroidManifest.xml
:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="…">
<application>
<!-- … -->
<receiver android:name=".SafetySourceReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.safetycenter.action.REFRESH_SAFETY_SOURCES"/>
</intent-filter>
</receiver>
<!-- … -->
</application>
</manifest>
ตามหลักการแล้ว มีการใช้แหล่งข้อมูลศูนย์ความปลอดภัยในลักษณะที่เรียกใช้
SafetyCenterManager
เมื่อข้อมูลเปลี่ยนแปลง ด้วยเหตุผลด้านประสิทธิภาพของระบบ
ขอแนะนำให้ตอบสนองต่อสัญญาณการสแกนอีกครั้งเท่านั้น (เมื่อผู้ใช้แตะการสแกน
) ไม่ใช่เมื่อผู้ใช้เปิดศูนย์ความปลอดภัย หากฟังก์ชันนี้
ต้องระบุฟิลด์ refreshOnPageOpenAllowed="true"
ในไฟล์การกำหนดค่า
ต้องกำหนดให้แหล่งที่มารับการแพร่สัญญาณที่ส่งมาในกรณีเหล่านี้
ตอบสนองต่อศูนย์ความปลอดภัยเมื่อเปิดหรือปิดใช้งาน
คุณสามารถตอบสนองเมื่อศูนย์ความปลอดภัยเป็นเปิดหรือปิด โดยใช้ การดำเนินการผ่าน Intent:
ACTION_SAFETY_CENTER_ENABLED_CHANGED
- ค่าสตริง:
android.safetycenter.action.SAFETY_CENTER_ENABLED_CHANGED
- ทริกเกอร์เมื่อศูนย์ความปลอดภัยเปิดหรือปิดอยู่ขณะที่ อุปกรณ์กำลังทำงาน
- ไม่ได้เรียกใช้เมื่อเปิดเครื่อง (ใช้
ACTION_BOOT_COMPLETED
) - เจตนาที่มีการป้องกันที่สามารถส่งได้โดยระบบเท่านั้น
- ส่งไปยังแหล่งที่มาความปลอดภัยทั้งหมดในไฟล์การกำหนดค่าโดยโจ่งแจ้ง
Intent ต้องใช้สิทธิ์
SEND_SAFETY_CENTER_UPDATE
- ส่งเป็น Intent แบบไม่เจาะจงปลายทางที่ต้องใช้
READ_SAFETY_CENTER_STATUS
สิทธิ์
- ค่าสตริง:
การดำเนินการผ่าน Intent นี้มีประโยชน์ในการเปิดหรือปิดใช้ฟีเจอร์ที่เกี่ยวข้องกับ ศูนย์ความปลอดภัยในอุปกรณ์
ใช้การดำเนินการแก้ปัญหา
การดำเนินการแก้ปัญหาคืออินสแตนซ์ SafetySourceIssue.Action
ที่ผู้ใช้ทำได้
แก้ปัญหาโดยตรงจากหน้าจอศูนย์ความปลอดภัย ผู้ใช้แตะปุ่มการทำงาน
และอินสแตนซ์ PendingIntent
บน SafetySourceIssue.Action
ที่ส่งโดย
จะทริกเกอร์แหล่งข้อมูลความปลอดภัย ซึ่งจะแก้ไขปัญหาในเบื้องหลัง และ
จะแจ้งให้ศูนย์ความปลอดภัยทราบเมื่อเสร็จแล้ว
แหล่งที่มาของศูนย์ความปลอดภัยจะใช้บริการเพื่อดำเนินการแก้ปัญหาได้ในกรณีต่อไปนี้
การดำเนินการคาดว่าจะใช้เวลาสักครู่ (PendingIntent.getService
) หรือ
Broadcast Receiver (PendingIntent.getBroadcast
)
ใช้รหัสนี้เพื่อส่งปัญหาที่แก้ไขแล้วไปยังศูนย์ความปลอดภัย
Intent resolveIssueBroadcastIntent =
new Intent("my.package.name.MY_RESOLVING_ACTION").setClass(ResolveActionReceiver.class);
PendingIntent resolveIssue =
PendingIntent.getBroadcast(
context, requestCode, resolveIssueBroadcastIntent, PendingIntent.FLAG_IMMUTABLE);
SafetySourceData safetySourceData =
new SafetySourceData.Builder()
.setStatus(
new SafetySourceStatus.Builder(
"title", "summary", SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION)
.setPendingIntent(redirectToMyScreen)
.build())
.addIssue(
new SafetySourceIssue.Builder(
"MyIssueId",
"title",
"summary",
SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION,
"MyIssueTypeId")
.setIssueCategory(SafetySourceIssue.ISSUE_CATEGORY_DEVICE)
.addAction(
new SafetySourceIssue.Action.Builder(
"MyIssueActionId", "label", resolveIssue)
.setWillResolve(true)
.build())
.build())
.build();
SafetyEvent safetyEvent = new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
safetyCenterManager.setSafetySourceData("MySourceId", safetySourceData, safetyEvent);
BroadcastReceiver
จะแก้ไขการดำเนินการนี้
public final class ResolveActionReceiver extends BroadcastReceiver {
private static final String MY_RESOLVING_ACTION = "my.package.name.MY_RESOLVING_ACTION";
@Override
public void onReceive(Context context, Intent intent) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
// Must be on T or above to interact with Safety Center.
return;
}
String action = intent.getAction();
if (!MY_RESOLVING_ACTION.equals(action)) {
return;
}
SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
if (safetyCenterManager == null) {
// Should not be null on T.
return;
}
if (!safetyCenterManager.isSafetyCenterEnabled()) {
// Preferably, no Safety Source code should be run if Safety Center is disabled.
return;
}
resolveTheIssue();
SafetyEvent resolveActionSafetyEvent =
new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED)
.setSafetySourceIssueId("MyIssueId")
.setSafetySourceIssueActionId("MyIssueActionId")
.build();
SafetySourceData dataWithoutTheIssue = …;
// Set the data (or report an error with reportSafetySourceError and
// SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED, if something went wrong).
safetyCenterManager.setSafetySourceData("MySourceId", dataWithoutTheIssue, resolveActionSafetyEvent);
}
private void resolveTheIssue() {
// Resolves the issue for the user. Given this a BroadcastReceiver, this should be a fast action.
// Otherwise, a foreground service and PendingIntent.getService should be used instead (or a job
// could be scheduled here, too).
}
}
อินสแตนซ์เดียวกันของ BroadcastReceiver
ในตัวอย่างด้านบนมีการประกาศใน
AndroidManifest.xml
:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="…">
<application>
<!-- … -->
<receiver android:name=".ResolveActionReceiver"
android:exported="false">
<intent-filter>
<action android:name="my.package.name.MY_RESOLVING_ACTION"/>
</intent-filter>
</receiver>
<!-- … -->
</application>
</manifest>
ตอบสนองต่อปัญหาการปิด
คุณสามารถระบุอินสแตนซ์ PendingIntent
ที่จะทริกเกอร์ได้เมื่อ
ปิดอินสแตนซ์ SafetySourceIssue
แล้ว ศูนย์ความปลอดภัยจะจัดการปัญหาเหล่านี้
การปิด:
- หากแหล่งที่มาพุชปัญหา ผู้ใช้จะปิดปัญหาได้ในศูนย์ความปลอดภัย โดยการแตะปุ่มปิด (ปุ่ม X บนการ์ดคำเตือน)
- เมื่อผู้ใช้ปิดปัญหา หากปัญหายังคงอยู่ ปัญหาจะไม่ปรากฏขึ้น ใน UI อีกครั้ง
- การปิดถาวรบนดิสก์จะยังคงอยู่ในระหว่างการรีบูตอุปกรณ์
- หากแหล่งที่มาของศูนย์ความปลอดภัยหยุดการระบุปัญหาแล้ว ให้ อีกครั้งในภายหลัง ปัญหานั้นก็เกิดขึ้นอีก เพื่อช่วยให้ ที่ผู้ใช้เห็นคำเตือน ปิดคำเตือน แล้วดำเนินการ ควรลดปัญหาลงได้ แต่ผู้ใช้ได้ดำเนินการอีกครั้ง ก็ทำให้เกิดปัญหาที่คล้ายกัน เมื่อมาถึงจุดนี้ การ์ดคำเตือนควรปรากฏขึ้นอีกครั้ง
- การ์ดคำเตือนสีเหลืองและแดงจะแสดงอีกครั้งทุก 180 วัน ยกเว้นในกรณีที่ผู้ใช้ ปิดพวกเขาหลายครั้ง
แหล่งที่มาไม่ควรมีลักษณะการทำงานอื่นๆ เพิ่มเติม ยกเว้นในกรณีต่อไปนี้
- แหล่งที่มาจะพยายามนำลักษณะการทำงานนี้ไปใช้ในลักษณะที่ต่างออกไป เช่น ไม่เคย ทำให้ปัญหานั้นปรากฏอีกครั้ง
- แหล่งที่มาจะพยายามใช้การเรียกกลับ ตัวอย่างเช่น เพื่อบันทึก
ให้ข้อมูลสำหรับผู้ใช้/โปรไฟล์หลายรายการ
SafetyCenterManager
API ใช้ได้กับผู้ใช้และโปรไฟล์ต่างๆ สำหรับข้อมูลเพิ่มเติม
โปรดดูการสร้าง Multiuser-Aware
แอป Context
ออบเจ็กต์ที่ระบุ SafetyCenterManager
เชื่อมโยงกับ UserHandle
ดังนั้นอินสแตนซ์ SafetyCenterManager
ที่แสดงผลโต้ตอบกับ
ศูนย์ความปลอดภัยสำหรับอินสแตนซ์ UserHandle
นั้น โดยค่าเริ่มต้น Context
คือ
ที่เชื่อมโยงกับผู้ใช้ที่ใช้งานอยู่ แต่คุณอาจสร้างอินสแตนซ์สำหรับ
ผู้ใช้อีกรายหนึ่งหากแอปมี INTERACT_ACROSS_USERS
และ
สิทธิ์ INTERACT_ACROSS_USERS_FULL
รายการ ตัวอย่างนี้แสดงการโทร
ระหว่างผู้ใช้/โปรไฟล์:
Context userContext = context.createContextAsUser(userHandle, 0);
SafetyCenterManager userSafetyCenterManager = userContext.getSystemService(SafetyCenterManager.class);
if (userSafetyCenterManager == null) {
// Should not be null on T.
return;
}
// Calls to userSafetyCenterManager will provide data for the given userHandle
ผู้ใช้แต่ละคนในอุปกรณ์จะมีโปรไฟล์ที่มีการจัดการได้หลายโปรไฟล์ ศูนย์ความปลอดภัย จะให้ข้อมูลที่แตกต่างกันสำหรับผู้ใช้แต่ละคน แต่จะรวมข้อมูลของ โปรไฟล์ที่เชื่อมโยงกับผู้ใช้ที่กำหนด
เมื่อตั้งค่า profile="all_profiles"
สำหรับแหล่งที่มาในไฟล์การกำหนดค่า
จะเกิดเหตุการณ์ต่อไปนี้
- มีรายการ UI สำหรับผู้ใช้ (ระดับบนสุดของโปรไฟล์) และรายการที่เกี่ยวข้องทั้งหมด
โปรไฟล์ที่มีการจัดการ (ซึ่งใช้
titleForWork
อินสแตนซ์) ระบบจะส่งสัญญาณรีเฟรชหรือสแกนอีกครั้งสำหรับโปรไฟล์ระดับบนสุดและ โปรไฟล์ที่มีการจัดการที่เชื่อมโยง ตัวรับที่เกี่ยวข้องเริ่มต้นแล้วสําหรับ และสามารถให้ข้อมูลที่เกี่ยวข้องแก่
SafetyCenterManager
โดยไม่ต้องโทรข้ามโปรไฟล์ เว้นแต่ว่า ตัวรับหรือแอปsingleUser
แหล่งที่มาต้องมีข้อมูลสำหรับผู้ใช้และแหล่งที่มาที่มีการจัดการทั้งหมด โปรไฟล์ ข้อมูลสำหรับรายการ UI แต่ละรายการอาจแตกต่างกันไปตาม โปรไฟล์
การทดสอบ
คุณจะเข้าถึง ShadowSafetyCenterManager
และใช้ในการทดสอบ Robolectric ได้
private static final String MY_SOURCE_ID = "MySourceId";
private final MyClass myClass = …;
private final SafetyCenterManager safetyCenterManager = getApplicationContext().getSystemService(SafetyCenterManager.class);
@Test
public void whenRefreshingData_providesDataToSafetyCenterForMySourceId() {
shadowOf(safetyCenterManager).setSafetyCenterEnabled(true);
setupDataForMyClass(…);
myClass.refreshData();
SafetySourceData expectedSafetySourceData = …;
assertThat(safetyCenterManager.getSafetySourceData(MY_SOURCE_ID)).isEqualTo(expectedSafetySourceData);
SafetyEvent expectedSafetyEvent = …;
assertThat(shadowOf(safetyCenterManager).getLastSafetyEvent(MY_SOURCE_ID)).isEqualTo(expectedSafetyEvent);
}
คุณเขียนการทดสอบจากต้นทางถึงปลายทาง (E2E) เพิ่มเติมได้ แต่นั่นอยู่นอกเหนือขอบเขตของการดำเนินการนี้ โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการเขียนการทดสอบ E2E เหล่านี้ที่การทดสอบ CTS (CtsSafetyCenterTestCases)
API การทดสอบและ API ภายใน
API ภายในและ API ทดสอบมีไว้เพื่อการใช้งานภายใน จึงไม่มีการอธิบายไว้ดังนี้ โดยละเอียดในคู่มือนี้ แต่เราอาจขยาย API ภายในบางส่วนในอนาคต อนุญาตให้ OEM สร้าง UI ของตัวเอง และเราจะอัปเดตคู่มือนี้ คำแนะนำเกี่ยวกับวิธีใช้เพิ่มขึ้น
สิทธิ์
MANAGE_SAFETY_CENTER
internal|installer|role
- ใช้สำหรับ API ของศูนย์ความปลอดภัยภายใน
- ให้สิทธิ์แก่ PermissionsController และ Shell เท่านั้น
แอปการตั้งค่า
การเปลี่ยนเส้นทางศูนย์ความปลอดภัย
โดยค่าเริ่มต้น ศูนย์ความปลอดภัยจะเข้าถึงได้ผ่านแอปการตั้งค่าด้วย ความปลอดภัยและ "ความเป็นส่วนตัว" หากคุณใช้แอปการตั้งค่าอื่นหรือ เมื่อคุณแก้ไขแอปการตั้งค่า คุณอาจต้องปรับแต่งวิธีที่ศูนย์ความปลอดภัย ที่มีการเข้าถึง
สิ่งที่จะเกิดขึ้นเมื่อเปิดใช้ศูนย์ความปลอดภัย
- รายการความเป็นส่วนตัวเดิมซ่อนอยู่รหัส
- รายการความปลอดภัยเดิมซ่อนอยู่รหัส
- ความปลอดภัยและการรักษาความปลอดภัยใหม่ รายการความเป็นส่วนตัว ถูกเพิ่ม รหัส
- ความปลอดภัยและการรักษาความปลอดภัยใหม่ รายการความเป็นส่วนตัวเปลี่ยนเส้นทางไปยังรหัสศูนย์ความปลอดภัย
android.settings.PRIVACY_SETTINGS
และandroid.settings.SECURITY_SETTINGS
การดำเนินการของ Intent จะเปลี่ยนเส้นทางเพื่อเปิดศูนย์ความปลอดภัย (รหัส: ความปลอดภัย ความเป็นส่วนตัว)
หน้าความปลอดภัยและความเป็นส่วนตัวขั้นสูง
แอปการตั้งค่ามีการตั้งค่าเพิ่มเติมในส่วนการตั้งค่าการรักษาความปลอดภัยเพิ่มเติม และการตั้งค่าความเป็นส่วนตัวเพิ่มเติมที่พร้อมใช้งานจากศูนย์ความปลอดภัย
รหัสความปลอดภัยขั้นสูง
รหัสความเป็นส่วนตัวขั้นสูง
ตั้งแต่ Android 14 เป็นต้นไป ความปลอดภัยขั้นสูงและ หน้าการตั้งค่าความเป็นส่วนตัวขั้นสูง ได้รวมอยู่ใน "ความปลอดภัยเพิ่มเติม & ความเป็นส่วนตัว" หน้าเว็บที่มีการดำเนินการผ่าน Intent
"com.android.settings.MORE_SECURITY_PRIVACY_SETTINGS"
แหล่งที่มาของความปลอดภัย
ศูนย์ความปลอดภัยจะผสานรวมกับชุดแหล่งข้อมูลด้านความปลอดภัยที่เฉพาะเจาะจงจาก แอปการตั้งค่า:
- แหล่งที่มาของความปลอดภัยของหน้าจอล็อกจะยืนยันว่าคุณได้ตั้งค่าหน้าจอล็อกด้วย รหัสผ่าน (หรือการรักษาความปลอดภัยอื่นๆ) เพื่อให้แน่ใจว่าข้อมูลส่วนตัวของผู้ใช้ จะได้รับการเก็บรักษาไว้อย่างปลอดภัยจากการเข้าถึงจากภายนอก
- แพลตฟอร์มความปลอดภัยด้านข้อมูลไบโอเมตริก (ซ่อนอยู่โดยค่าเริ่มต้น) เพื่อผสานรวมกับ เซ็นเซอร์ลายนิ้วมือหรือใบหน้า
คุณเข้าถึงซอร์สโค้ดสำหรับแหล่งข้อมูลของศูนย์ความปลอดภัยเหล่านี้ได้ทาง Android รหัส การค้นหา หากแอปการตั้งค่าไม่ได้ถูกแก้ไข (การเปลี่ยนแปลงชื่อแพ็กเกจจะไม่เกิดขึ้น ซอร์สโค้ดหรือซอร์สโค้ดที่จัดการหน้าจอล็อกและข้อมูลไบโอเมตริก) การผสานรวมนี้ก็น่าจะดำเนินการได้ทันที มิเช่นนั้น จะต้องมีการแก้ไขบางอย่าง อาจจำเป็นต้องใช้ เช่น การเปลี่ยนไฟล์การกำหนดค่าเพื่อเปลี่ยนแพ็กเกจ ชื่อของแอปการตั้งค่าและแหล่งที่มาที่ผสานรวมเข้ากับศูนย์ความปลอดภัย และการผสานรวม โปรดดูข้อมูลเพิ่มเติมในอัปเดตการกำหนดค่า และ การผสานรวม การตั้งค่า
เกี่ยวกับ PendingIntent
หากคุณใช้การผสานรวมศูนย์ความปลอดภัยของแอปการตั้งค่าที่มีอยู่ใน Android 14 ขึ้นไป ข้อบกพร่องที่อธิบายไว้ด้านล่างได้รับการแก้ไขแล้ว ในกรณีนี้ คุณไม่จำเป็นต้องอ่านส่วนนี้
เมื่อแน่ใจว่าไม่มีข้อบกพร่องแล้ว ให้ตั้งค่าทรัพยากรบูลีน XML
การกำหนดค่าในแอปการตั้งค่า
config_isSafetyCenterLockScreenPendingIntentFixed
ถึง true
เพื่อปิด
วิธีแก้ปัญหาภายในศูนย์ความปลอดภัย
วิธีแก้ปัญหา PendingIntent
ข้อบกพร่องนี้เกิดจากการตั้งค่าโดยใช้อินสแตนซ์เพิ่มเติมของ Intent
ในการระบุว่า
เพื่อเปิด เนื่องจาก Intent#equals
ไม่รับอินสแตนซ์ Intent
รายการเพิ่มเติมมาในบัญชี เช่น PendingIntent
สำหรับไอคอนเมนูรูปเฟือง
แต่ละรายการถือว่าเท่ากัน และไปยัง UI เดียวกัน (แม้ว่าจะ
ต้องการนำทางไปยัง UI อื่น) ปัญหานี้ได้รับการแก้ไขในรุ่น QPR โดย
กำลังแยกความแตกต่างของอินสแตนซ์ PendingIntent
ด้วยรหัสคำขอ หรือ
ซึ่งจะแยกความแตกต่างได้โดยใช้ Intent#setId
แหล่งที่มาของความปลอดภัยภายใน
แหล่งข้อมูลของศูนย์ความปลอดภัยบางส่วนเป็นข้อมูลภายในและมีการใช้งานใน แอประบบ PermissionsController ภายในโมดูล PermissionController เหล่านี้ แหล่งที่มาจะมีลักษณะการทำงานเหมือนแหล่งที่มาในศูนย์ความปลอดภัยทั่วไป และไม่ได้รับแบบพิเศษ ในการรักษา โค้ดสำหรับแหล่งที่มาเหล่านี้จะมีให้ผ่านทางโค้ด Android การค้นหา
สัญญาณเหล่านี้คือสัญญาณด้านความเป็นส่วนตัวเป็นหลัก เช่น
- การช่วยเหลือพิเศษ
- เพิกถอนแอปที่ไม่ได้ใช้โดยอัตโนมัติ
- การเข้าถึงตำแหน่ง
- ตัวฟังการแจ้งเตือน
- ข้อมูลนโยบายงาน