เปลี่ยนเส้นทางไปยังศูนย์ความปลอดภัย
ทุกแอปสามารถเปิดศูนย์ความปลอดภัยโดยใช้
การดำเนินการ android.content.Intent.ACTION_SAFETY_CENTER
(ค่าสตริง
android.intent.action.SAFETY_CENTER
)
หากต้องการเปิดศูนย์ความปลอดภัย ให้โทรจากภายในอินสแตนซ์ Activity
โดยทำดังนี้
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);
startActivity(openSafetyCenterIntent);
เปลี่ยนเส้นทางไปยังปัญหาที่เฉพาะเจาะจง
นอกจากนี้ คุณยังเปลี่ยนเส้นทางไปยังการ์ดคำเตือนของศูนย์ความปลอดภัยที่เฉพาะเจาะจงได้โดยใช้ Intent Extra ที่เฉพาะเจาะจง บริการเสริมเหล่านี้ไม่ได้มีไว้เพื่อใช้โดยบุคคลที่สาม
เป็นส่วนหนึ่งของ SafetyCenterManager
ซึ่งเป็นส่วนหนึ่งของ @SystemApi
เฉพาะ
แอประบบสามารถเข้าถึงส่วนเสริมเหล่านี้
บริการเสริม Intent ที่เปลี่ยนเส้นทางการ์ดคำเตือนที่เฉพาะเจาะจง
EXTRA_SAFETY_SOURCE_ID
- ค่าสตริง:
android.safetycenter.extra.SAFETY_SOURCE_ID
- ประเภทสตริง: ระบุรหัสของแหล่งที่มาของความปลอดภัยของการ์ดคำเตือนที่เกี่ยวข้อง
- ต้องระบุเพื่อให้การเปลี่ยนเส้นทางไปยังปัญหาทำงานได้
- ค่าสตริง:
EXTRA_SAFETY_SOURCE_ISSUE_ID
- ค่าสตริง:
android.safetycenter.extra.SAFETY_SOURCE_ISSUE_ID
- ประเภทสตริง: ระบุรหัสการ์ดคําเตือน
- ต้องระบุเพื่อให้การเปลี่ยนเส้นทางไปยังปัญหาทำงานได้
- ค่าสตริง:
EXTRA_SAFETY_SOURCE_USER_HANDLE
- ค่าสตริง:
android.safetycenter.extra.SAFETY_SOURCE_USER_HANDLE
- ประเภท
UserHandle
: ระบุUserHandle
สำหรับคำเตือนที่เกี่ยวข้อง ไพ่ - ไม่บังคับ (ค่าเริ่มต้นคือผู้ใช้ปัจจุบัน)
- ค่าสตริง:
ข้อมูลโค้ดด้านล่างใช้จากภายในอินสแตนซ์ Activity
เพื่อเปิดได้
ปัญหาที่เฉพาะเจาะจงบนหน้าจอของศูนย์ความปลอดภัย
UserHandle theUserHandleThisIssueCameFrom = …;
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_ID, "TheSafetySourceIdThisIssueCameFrom")
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_ISSUE_ID, "TheSafetySourceIssueIdToRedirectTo")
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCE_USER_HANDLE, theUserHandleThisIssueCameFrom);
startActivity(openSafetyCenterIntent);
เปลี่ยนเส้นทางไปยังหน้าย่อยที่เฉพาะเจาะจง (ตั้งแต่ Android 14 เป็นต้นไป)
ใน Android 14 ขึ้นไป หน้าศูนย์ความปลอดภัยจะแยกออกจากกัน
ลงในหน้าเว็บย่อยหลายหน้าซึ่งแสดงถึงSafetySourcesGroup
ที่แตกต่างกัน (ใน
Android 13 ข้อมูลนี้จะแสดงเป็นรายการที่ยุบได้)
คุณจะเปลี่ยนเส้นทางไปยังหน้าย่อยหน้าใดหน้าหนึ่งได้โดยใช้ Intent เพิ่มเติมต่อไปนี้
EXTRA_SAFETY_SOURCES_GROUP_ID
- ค่าสตริง:
android.safetycenter.extra.SAFETY_SOURCES_GROUP_ID
- ประเภทสตริง: ระบุรหัสของ
SafetySourcesGroup
- ต้องระบุเพื่อให้การเปลี่ยนเส้นทางไปยังหน้าย่อยทำงานได้
- ค่าสตริง:
ข้อมูลโค้ดด้านล่างใช้จากภายในอินสแตนซ์ Activity
เพื่อเปิดได้
หน้าจอศูนย์ความปลอดภัยไปยังหน้าย่อยที่เจาะจง
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID, "TheSafetySourcesGroupId");
startActivity(openSafetyCenterIntent);
ใช้ API แหล่งที่มาของศูนย์ความปลอดภัย
API แหล่งที่มาของศูนย์ความปลอดภัยพร้อมใช้งานโดยใช้ SafetyCenterManager
(ซึ่งเป็น @SystemApi
) โค้ดสำหรับแพลตฟอร์ม API มีอยู่ใน Code Search
โค้ดการใช้งานของ API อยู่ในโค้ด
ค้นหา
สิทธิ์
เฉพาะแอประบบที่อยู่ในรายการที่อนุญาตเท่านั้นที่เข้าถึง 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
เป็น 0 ได้ - 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
) หรือใช้ตัวรับสัญญาณออกอากาศ (PendingIntent.getBroadcast
)
ใช้รหัสนี้เพื่อแก้ปัญหาไปยังศูนย์ความปลอดภัย
Intent resolveIssueBroadcastIntent =
new Intent("my.package.name.MY_RESOLVING_ACTION").setClass(ResolveActionReceiver.class);
PendingIntent resolveIssue =
PendingIntent.getBroadcast(
context, requestCode, resolveIssueBroadcastIntent, PendingIntent.FLAG_IMMUTABLE);
SafetySourceData safetySourceData =
new SafetySourceData.Builder()
.setStatus(
new SafetySourceStatus.Builder(
"title", "summary", SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION)
.setPendingIntent(redirectToMyScreen)
.build())
.addIssue(
new SafetySourceIssue.Builder(
"MyIssueId",
"title",
"summary",
SafetySourceData.SEVERITY_LEVEL_RECOMMENDATION,
"MyIssueTypeId")
.setIssueCategory(SafetySourceIssue.ISSUE_CATEGORY_DEVICE)
.addAction(
new SafetySourceIssue.Action.Builder(
"MyIssueActionId", "label", resolveIssue)
.setWillResolve(true)
.build())
.build())
.build();
SafetyEvent safetyEvent = new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build();
safetyCenterManager.setSafetySourceData("MySourceId", safetySourceData, safetyEvent);
BroadcastReceiver
จะแก้ไขการดำเนินการนี้
public final class ResolveActionReceiver extends BroadcastReceiver {
private static final String MY_RESOLVING_ACTION = "my.package.name.MY_RESOLVING_ACTION";
@Override
public void onReceive(Context context, Intent intent) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
// Must be on T or above to interact with Safety Center.
return;
}
String action = intent.getAction();
if (!MY_RESOLVING_ACTION.equals(action)) {
return;
}
SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
if (safetyCenterManager == null) {
// Should not be null on T.
return;
}
if (!safetyCenterManager.isSafetyCenterEnabled()) {
// Preferably, no Safety Source code should be run if Safety Center is disabled.
return;
}
resolveTheIssue();
SafetyEvent resolveActionSafetyEvent =
new SafetyEvent.Builder(SafetyEvent.SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED)
.setSafetySourceIssueId("MyIssueId")
.setSafetySourceIssueActionId("MyIssueActionId")
.build();
SafetySourceData dataWithoutTheIssue = …;
// Set the data (or report an error with reportSafetySourceError and
// SAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED, if something went wrong).
safetyCenterManager.setSafetySourceData("MySourceId", dataWithoutTheIssue, resolveActionSafetyEvent);
}
private void resolveTheIssue() {
// Resolves the issue for the user. Given this a BroadcastReceiver, this should be a fast action.
// Otherwise, a foreground service and PendingIntent.getService should be used instead (or a job
// could be scheduled here, too).
}
}
อินสแตนซ์ BroadcastReceiver
เดียวกันในตัวอย่างด้านบนจะประกาศใน
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="…">
<application>
<!-- … -->
<receiver android:name=".ResolveActionReceiver"
android:exported="false">
<intent-filter>
<action android:name="my.package.name.MY_RESOLVING_ACTION"/>
</intent-filter>
</receiver>
<!-- … -->
</application>
</manifest>
ตอบสนองต่อการระงับปัญหา
คุณสามารถระบุอินสแตนซ์ PendingIntent
ที่ทริกเกอร์ได้เมื่ออินสแตนซ์ SafetySourceIssue
ถูกปิด ศูนย์ความปลอดภัยจะจัดการกับการสิ้นสุดการใช้งานเนื่องจากปัญหาต่อไปนี้
- หากแหล่งที่มาพุชปัญหา ผู้ใช้จะปิดปัญหาได้ในศูนย์ความปลอดภัย โดยการแตะปุ่มปิด (ปุ่ม X บนการ์ดคำเตือน)
- เมื่อผู้ใช้ปิดปัญหาหนึ่งๆ ปัญหานั้นจะไม่แสดงใน UI อีก หากยังคงเกิดขึ้น
- การปิดถาวรในดิสก์จะยังคงอยู่เมื่ออุปกรณ์รีบูต
- หากแหล่งที่มาของศูนย์ความปลอดภัยหยุดการระบุปัญหาแล้ว ให้ อีกครั้งในภายหลัง ปัญหานั้นก็เกิดขึ้นอีก เพื่อช่วยให้ ที่ผู้ใช้เห็นคำเตือน ปิดคำเตือน แล้วดำเนินการ ควรลดปัญหาลงได้ แต่ผู้ใช้ได้ดำเนินการอีกครั้ง ก็ทำให้เกิดปัญหาที่คล้ายกัน เมื่อถึงจุดนี้ การ์ดคำเตือนควรปรากฏขึ้นอีกครั้ง
- การ์ดคำเตือนสีเหลืองและสีแดงจะปรากฏขึ้นอีกครั้งทุก 180 วัน เว้นแต่ผู้ใช้จะปิดการ์ดหลายครั้ง
แหล่งที่มาไม่ควรมีลักษณะการทำงานอื่นๆ เพิ่มเติม ยกเว้นในกรณีต่อไปนี้
- แหล่งที่มาจะพยายามนำลักษณะการทำงานนี้ไปใช้ในลักษณะที่ต่างออกไป เช่น ไม่เคย ทำให้ปัญหานั้นปรากฏอีกครั้ง
- แหล่งที่มาพยายามใช้ข้อมูลนี้เป็นการเรียกกลับ เช่น เพื่อบันทึกข้อมูล
ให้ข้อมูลสำหรับผู้ใช้/โปรไฟล์หลายรายการ
SafetyCenterManager
API ใช้ได้กับผู้ใช้และโปรไฟล์ต่างๆ ดูข้อมูลเพิ่มเติมได้ที่การสร้างแอปที่รองรับผู้ใช้หลายคน Context
ออบเจ็กต์ที่ระบุ SafetyCenterManager
เชื่อมโยงกับ UserHandle
ดังนั้นอินสแตนซ์ SafetyCenterManager
ที่แสดงผลโต้ตอบกับ
ศูนย์ความปลอดภัยสำหรับอินสแตนซ์ UserHandle
นั้น โดยค่าเริ่มต้น Context
คือ
ที่เชื่อมโยงกับผู้ใช้ที่ใช้งานอยู่ แต่คุณอาจสร้างอินสแตนซ์สำหรับ
ผู้ใช้อีกรายหนึ่งหากแอปมี INTERACT_ACROSS_USERS
และ
สิทธิ์ INTERACT_ACROSS_USERS_FULL
รายการ ตัวอย่างนี้แสดงการโทร
ระหว่างผู้ใช้/โปรไฟล์:
Context userContext = context.createContextAsUser(userHandle, 0);
SafetyCenterManager userSafetyCenterManager = userContext.getSystemService(SafetyCenterManager.class);
if (userSafetyCenterManager == null) {
// Should not be null on T.
return;
}
// Calls to userSafetyCenterManager will provide data for the given userHandle
ผู้ใช้แต่ละคนในอุปกรณ์จะมีโปรไฟล์ที่จัดการได้หลายโปรไฟล์ ศูนย์ความปลอดภัย จะให้ข้อมูลที่แตกต่างกันสำหรับผู้ใช้แต่ละคน แต่จะรวมข้อมูลของ โปรไฟล์ที่เชื่อมโยงกับผู้ใช้ที่กำหนด
เมื่อตั้งค่า profile="all_profiles"
สำหรับแหล่งที่มาในไฟล์การกําหนดค่า ระบบจะทําดังนี้
- มีรายการ UI สำหรับผู้ใช้ (ระดับบนสุดของโปรไฟล์) และรายการที่เกี่ยวข้องทั้งหมด
โปรไฟล์ที่มีการจัดการ (ซึ่งใช้
titleForWork
อินสแตนซ์) ระบบจะส่งสัญญาณรีเฟรชหรือสแกนอีกครั้งสำหรับโปรไฟล์ระดับบนสุดและ โปรไฟล์ที่มีการจัดการที่เชื่อมโยง ตัวรับที่เกี่ยวข้องเริ่มต้นแล้วสําหรับ และสามารถให้ข้อมูลที่เกี่ยวข้องแก่
SafetyCenterManager
โดยไม่ต้องโทรข้ามโปรไฟล์ เว้นแต่ว่า ตัวรับหรือแอปsingleUser
แหล่งที่มาควรให้ข้อมูลของผู้ใช้และโปรไฟล์ทั้งหมดที่มีการจัดการ ข้อมูลสำหรับรายการ UI แต่ละรายการอาจแตกต่างกันไปตาม โปรไฟล์
การทดสอบ
คุณจะเข้าถึง ShadowSafetyCenterManager
และใช้ในการทดสอบ Robolectric ได้
private static final String MY_SOURCE_ID = "MySourceId";
private final MyClass myClass = …;
private final SafetyCenterManager safetyCenterManager = getApplicationContext().getSystemService(SafetyCenterManager.class);
@Test
public void whenRefreshingData_providesDataToSafetyCenterForMySourceId() {
shadowOf(safetyCenterManager).setSafetyCenterEnabled(true);
setupDataForMyClass(…);
myClass.refreshData();
SafetySourceData expectedSafetySourceData = …;
assertThat(safetyCenterManager.getSafetySourceData(MY_SOURCE_ID)).isEqualTo(expectedSafetySourceData);
SafetyEvent expectedSafetyEvent = …;
assertThat(shadowOf(safetyCenterManager).getLastSafetyEvent(MY_SOURCE_ID)).isEqualTo(expectedSafetyEvent);
}
คุณเขียนการทดสอบจากต้นทางถึงปลายทาง (E2E) เพิ่มเติมได้ แต่นั่นอยู่นอกเหนือขอบเขตของการดำเนินการนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการเขียนการทดสอบจากต้นทางถึงปลายทางเหล่านี้ได้ที่การทดสอบ CTS (CtsSafetyCenterTestCases)
API ทดสอบและภายใน
API ภายในและ API การทดสอบมีไว้สําหรับใช้ภายใน จึงไม่ได้อธิบายอย่างละเอียดในคู่มือนี้ แต่เราอาจขยาย API ภายในบางส่วนในอนาคต อนุญาตให้ OEM สร้าง UI ของตัวเอง และเราจะอัปเดตคู่มือนี้ คำแนะนำเกี่ยวกับวิธีใช้เพิ่มขึ้น
สิทธิ์
MANAGE_SAFETY_CENTER
internal|installer|role
- ใช้สำหรับ API ของศูนย์ความปลอดภัยภายใน
- ให้สิทธิ์แก่ PermissionsController และ Shell เท่านั้น
แอปการตั้งค่า
การเปลี่ยนเส้นทางของศูนย์ความปลอดภัย
โดยค่าเริ่มต้น คุณจะเข้าถึงศูนย์ความปลอดภัยผ่านแอปการตั้งค่าได้โดยใช้รายการความปลอดภัยและความเป็นส่วนตัวใหม่ หากคุณใช้แอปการตั้งค่าอื่นหรือ เมื่อคุณแก้ไขแอปการตั้งค่า คุณอาจต้องปรับแต่งวิธีที่ศูนย์ความปลอดภัย ที่มีการเข้าถึง
เมื่อเปิดใช้ศูนย์ความปลอดภัย
- รหัสรายการความเป็นส่วนตัวเดิมที่ซ่อนอยู่
- รายการความปลอดภัยเดิมที่ซ่อนอยู่ code
- ความปลอดภัยและการรักษาความปลอดภัยใหม่ รายการความเป็นส่วนตัว ถูกเพิ่ม รหัส
- รายการความปลอดภัยและความเป็นส่วนตัวใหม่จะเปลี่ยนเส้นทางไปยังโค้ดของศูนย์ความปลอดภัย
android.settings.PRIVACY_SETTINGS
และandroid.settings.SECURITY_SETTINGS
ระบบจะเปลี่ยนเส้นทางการดำเนินการตาม Intent เพื่อเปิดศูนย์ความปลอดภัย (โค้ด: security, privacy)
หน้าความปลอดภัยและความเป็นส่วนตัวขั้นสูง
แอปการตั้งค่ามีการตั้งค่าเพิ่มเติมในส่วนการตั้งค่าความปลอดภัยเพิ่มเติมและการตั้งค่าความเป็นส่วนตัวเพิ่มเติม ซึ่งดูได้จากศูนย์ความปลอดภัย
รหัสความปลอดภัยขั้นสูง
รหัสความเป็นส่วนตัวขั้นสูง
ตั้งแต่ 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
ก็ได้
แหล่งที่มาของความปลอดภัยภายใน
แหล่งที่มาของศูนย์ความปลอดภัยบางแห่งเป็นข้อมูลภายในและติดตั้งใช้งานในแอประบบ PermissionController ภายในโมดูล PermissionController เหล่านี้ แหล่งที่มาจะมีลักษณะการทำงานเหมือนแหล่งที่มาในศูนย์ความปลอดภัยทั่วไป และไม่ได้รับแบบพิเศษ ในการรักษา โค้ดสำหรับแหล่งที่มาเหล่านี้จะมีให้ผ่านทางโค้ด Android ค้นหา
สัญญาณเหล่านี้คือสัญญาณด้านความเป็นส่วนตัวเป็นหลัก เช่น
- การช่วยเหลือพิเศษ
- เพิกถอนสิทธิ์ของแอปที่ไม่ได้ใช้โดยอัตโนมัติ
- การเข้าถึงตำแหน่ง
- ตัวฟังการแจ้งเตือน
- ข้อมูลนโยบายงาน