सुरक्षा केंद्र पर रीडायरेक्ट करना
कोई भी ऐप्लिकेशन, android.content.Intent.ACTION_SAFETY_CENTER
कार्रवाई (स्ट्रिंग वैल्यू) का इस्तेमाल करके, Safety Center खोल सकता हैandroid.intent.action.SAFETY_CENTER
.
सुरक्षा केंद्र खोलने के लिए, Activity
इंस्टेंस में कॉल करें:
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER);
startActivity(openSafetyCenterIntent);
किसी खास समस्या पर रीडायरेक्ट करना
खास इंटेंट एक्सट्रा का इस्तेमाल करके, Safety Center के किसी खास चेतावनी कार्ड पर रीडायरेक्ट भी किया जा सकता है. इन अतिरिक्त सुविधाओं का इस्तेमाल तीसरे पक्ष नहीं कर सकते. इसलिए, ये SafetyCenterManager
का हिस्सा हैं, जो @SystemApi
का हिस्सा है. सिर्फ़ सिस्टम ऐप्लिकेशन ही इन अतिरिक्त सुविधाओं को ऐक्सेस कर सकते हैं.
इंटेंट एक्सट्रा, जो किसी खास चेतावनी कार्ड पर रीडायरेक्ट करते हैं:
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 में, इसे छोटा किया जा सकने वाली एंट्री के तौर पर दिखाया गया है.
इस इंटेंट एक्सट्रा का इस्तेमाल करके, किसी खास सबपेज पर रीडायरेक्ट किया जा सकता है:
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);
Safety Center के सोर्स एपीआई का इस्तेमाल करना
Safety Center के सोर्स एपीआई, SafetyCenterManager
(जो एक @SystemApi
है) का इस्तेमाल करके उपलब्ध हैं. एपीआई के प्लैटफ़ॉर्म का कोड, कोड सर्च में उपलब्ध है.
एपीआई को लागू करने का कोड, Code
Search में उपलब्ध है.
अनुमतियां
Safety Center के सोर्स एपीआई को सिर्फ़ वे सिस्टम ऐप्लिकेशन ऐक्सेस कर सकते हैं जिन्हें अनुमति मिली है. इसके लिए, उन्हें यहां दी गई अनुमतियों का इस्तेमाल करना होगा. ज़्यादा जानकारी के लिए, खास अनुमति वाली अनुमतियों की अनुमति वाली सूची देखें.
READ_SAFETY_CENTER_STATUS
signature|privileged
SafetyCenterManager#isSafetyCenterEnabled()
एपीआई के लिए इस्तेमाल किया जाता है (Safety Center के सोर्स के लिए ज़रूरी नहीं है. इसके लिए, सिर्फ़SEND_SAFETY_CENTER_UPDATE
अनुमति की ज़रूरत होती है)- इसका इस्तेमाल सिस्टम के उन ऐप्लिकेशन के लिए किया जाता है जो यह जांच करते हैं कि सुरक्षा केंद्र चालू है या नहीं
- यह अनुमति सिर्फ़ अनुमति वाली सूची में शामिल सिस्टम ऐप्लिकेशन को दी जाती है
SEND_SAFETY_CENTER_UPDATE
internal|privileged
- चालू किए गए एपीआई और Safety Sources API के लिए इस्तेमाल किया जाता है
- इसका इस्तेमाल सिर्फ़ सुरक्षा से जुड़े सोर्स करते हैं
- यह अनुमति सिर्फ़ अनुमति वाली सूची में शामिल सिस्टम ऐप्लिकेशन को दी जाती है
ये अनुमतियां खास होती हैं और इन्हें सिर्फ़ काम की फ़ाइल में जोड़कर हासिल किया जा सकता है. उदाहरण के लिए, सेटिंग ऐप्लिकेशन के लिए com.android.settings.xml
फ़ाइल और ऐप्लिकेशन की AndroidManifest.xml
फ़ाइल में. अनुमति मॉडल के बारे में ज़्यादा जानकारी के लिए, protectionLevel
पर जाएं.
SafetyCenterManager को पाना
SafetyCenterManager
एक @SystemApi
क्लास है. इसे Android 13 से शुरू होने वाले सिस्टम ऐप्लिकेशन से ऐक्सेस किया जा सकता है. इस कॉल में, SafetyCenterManager को पाने का तरीका बताया गया है:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
// Must be on T or above to interact with Safety Center.
return;
}
SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class);
if (safetyCenterManager == null) {
// Should not be null on T.
return;
}
देखें कि सुरक्षा केंद्र की सुविधा चालू है या नहीं
यह कॉल यह जांच करता है कि सुरक्षा केंद्र चालू है या नहीं. कॉल करने के लिए, READ_SAFETY_CENTER_STATUS
या SEND_SAFETY_CENTER_UPDATE
में से किसी एक अनुमति की ज़रूरत होती है:
boolean isSafetyCenterEnabled = safetyCenterManager.isSafetyCenterEnabled();
if (isSafetyCenterEnabled) {
// …
} else {
// …
}
डेटा उपलब्ध कराना
दिए गए String sourceId
के साथ Security Center का सोर्स डेटा, SafetySourceData
ऑब्जेक्ट के साथ Security Center को दिया जाता है. यह यूज़र इंटरफ़ेस (यूआई) एंट्री और समस्याओं (चेतावनी कार्ड) की सूची दिखाता है. यूज़र इंटरफ़ेस (यूआई) एंट्री और चेतावनी कार्ड में, SafetySourceData
क्लास में बताए गए गंभीरता के अलग-अलग लेवल हो सकते हैं:
SEVERITY_LEVEL_UNSPECIFIED
- गंभीरता की जानकारी नहीं दी गई
- रंग: स्लेटी या पारदर्शी (एंट्री के
SafetySourcesGroup
के आधार पर) - डाइनैमिक डेटा के लिए इस्तेमाल किया जाता है, जो यूज़र इंटरफ़ेस (यूआई) में स्टैटिक एंट्री के तौर पर दिखता है या किसी ऐसी एंट्री को दिखाने के लिए इस्तेमाल किया जाता है जिसकी जानकारी नहीं दी गई है
- चेतावनी वाले कार्ड के लिए इस्तेमाल नहीं किया जाना चाहिए
SEVERITY_LEVEL_INFORMATION
- बुनियादी जानकारी या छोटा सुझाव
- रंग: हरा
SEVERITY_LEVEL_RECOMMENDATION
- उपयोगकर्ता को इस समस्या पर कार्रवाई करने का सुझाव दिया गया है, क्योंकि इससे उसे खतरा हो सकता है
- रंग: पीला
SEVERITY_LEVEL_CRITICAL_WARNING
- गंभीर चेतावनी, जिसमें उपयोगकर्ता को इस समस्या पर कार्रवाई करने के लिए कहा गया है, क्योंकि इससे जोखिम हो सकता है
- रंग: लाल
SafetySourceData
SafetySourceData
ऑब्जेक्ट में यूज़र इंटरफ़ेस (यूआई) एंट्री, चेतावनी कार्ड, और
इनवैरिएंट शामिल होते हैं.
- वैकल्पिक
SafetySourceStatus
इंस्टेंस (यूज़र इंटरफ़ेस (यूआई) एंट्री) SafetySourceIssue
इंस्टेंस (चेतावनी कार्ड) की सूचीBundle
के लिए वैकल्पिक सुविधाएं (14 से शुरू)- इनवैरिएंट:
SafetySourceIssue
सूची में, यूनीक आइडेंटिफ़ायर वाली समस्याएं होनी चाहिए.- अगर कोई
SafetySourceIssue
इंस्टेंस है, तो वहSafetySourceStatus
से ज़्यादा अहम नहीं होना चाहिए. ऐसा तब तक नहीं किया जा सकता, जब तक किSafetySourceStatus
,SEVERITY_LEVEL_UNSPECIFIED
न हो. इस मामले में,SEVERITY_LEVEL_INFORMATION
से जुड़ी समस्याओं को अनुमति दी जाती है. - एपीआई कॉन्फ़िगरेशन की अन्य ज़रूरी शर्तों को पूरा करना ज़रूरी है. उदाहरण के लिए, अगर सोर्स सिर्फ़ समस्याओं के बारे में जानकारी देता है, तो उसे
SafetySourceStatus
इंस्टेंस नहीं देना चाहिए.
SafetySourceStatus
CharSequence
टाइटल डालना ज़रूरी हैCharSequence
की ज़रूरी खास जानकारी- गंभीरता का ज़रूरी लेवल
- उपयोगकर्ता को सही पेज पर रीडायरेक्ट करने के लिए, वैकल्पिक
PendingIntent
उदाहरण (डिफ़ॉल्ट रूप से, कॉन्फ़िगरेशन में मौजूदintentAction
का इस्तेमाल किया जाता है) IconAction
(यह एंट्री के साइड आइकॉन के तौर पर दिखता है) ज़रूरी नहीं है. इसमें ये शामिल हैं:- ज़रूरी आइकॉन टाइप, जो इनमें से कोई एक होना चाहिए:
ICON_TYPE_GEAR
: यूज़र इंटरफ़ेस (यूआई) एंट्री के बगल में गियर के तौर पर दिखता हैICON_TYPE_INFO
: यूज़र इंटरफ़ेस (यूआई) एंट्री के बगल में, जानकारी वाले आइकॉन के तौर पर दिखता है
- उपयोगकर्ता को किसी दूसरे पेज पर रीडायरेक्ट करने के लिए,
PendingIntent
ज़रूरी है
- ज़रूरी आइकॉन टाइप, जो इनमें से कोई एक होना चाहिए:
- ज़रूरी नहीं है कि बूलियन
enabled
की वैल्यू दी जाए. इसकी मदद से, यूज़र इंटरफ़ेस (यूआई) एंट्री को 'बंद है' के तौर पर मार्क किया जा सकता है, ताकि उस पर क्लिक न किया जा सके. डिफ़ॉल्ट वैल्यूtrue
है - इनवैरिएंट:
PendingIntent
इंस्टेंस,Activity
इंस्टेंस खोलने चाहिए.- अगर एंट्री बंद है, तो उसे
SEVERITY_LEVEL_UNSPECIFIED
के तौर पर मार्क किया जाना चाहिए. - एपीआई कॉन्फ़िगरेशन से जुड़ी अन्य ज़रूरी शर्तें.
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
ज़रूरी है - यह एक वैकल्पिक बूलियन है. इससे यह तय किया जा सकता है कि इस समस्या को सीधे Safety Center की स्क्रीन से हल किया जा सकता है या नहीं. डिफ़ॉल्ट रूप से, इसकी वैल्यू
false
होती है CharSequence
समस्या हल होने का मैसेज, जो उपयोगकर्ता को तब दिखेगा, जब समस्या सीधे Safety Center की स्क्रीन से हल हो जाएगी. हालांकि, यह मैसेज दिखाना ज़रूरी नहीं है
- ज़रूरी यूनीक
- ज़रूरी नहीं
PendingIntent
यह तब ट्रिगर होता है, जब उपयोगकर्ता समस्या को खारिज करता है (डिफ़ॉल्ट रूप से, कुछ भी ट्रिगर नहीं होता) String
समस्या के टाइप का आइडेंटिफ़ायर ज़रूरी है. यह समस्या के आइडेंटिफ़ायर से मिलता-जुलता है, लेकिन यह यूनीक नहीं होना चाहिए. इसका इस्तेमाल लॉगिंग के लिए किया जाता है- डुप्लीकेट कॉन्टेंट हटाने वाले आईडी के लिए
String
ज़रूरी नहीं है. इसकी मदद से, एक हीSafetySourceIssue
को अलग-अलग सोर्स से पोस्ट किया जा सकता है. साथ ही, यह यूज़र इंटरफ़ेस (यूआई) में सिर्फ़ एक बार दिखता है. ऐसा तब होता है, जब उनका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
इंस्टेंस नहीं खोलना चाहिए - एपीआई कॉन्फ़िगरेशन से जुड़ी अन्य ज़रूरी शर्तें
सुरक्षा केंद्र को कुछ इवेंट के आधार पर डेटा दिया जाता है. इसलिए, यह बताना ज़रूरी है कि सोर्स ने 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 Center का डेटा, डिवाइस को रीबूट करने पर सेव नहीं रहता. इसके लिए,SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
का इस्तेमाल किया जा सकता है.
- रीफ़्रेश किए गए ब्रॉडकास्ट आईडी के लिए वैकल्पिक
String
आइडेंटिफ़ायर. - हल किए जा रहे
SafetySourceIssue
इंस्टेंस के लिए वैकल्पिकString
आइडेंटिफ़ायर. - हल किए जा रहे
SafetySourceIssue.Action
इंस्टेंस के लिए वैकल्पिकString
आइडेंटिफ़ायर. - इनवैरिएंट:
- अगर टाइप
SAFETY_EVENT_TYPE_REFRESH_REQUESTED
है, तो रीफ़्रेश ब्रॉडकास्ट आईडी देना ज़रूरी है - अगर समस्या का टाइप
SAFETY_EVENT_TYPE_RESOLVING_ACTION_SUCCEEDED
याSAFETY_EVENT_TYPE_RESOLVING_ACTION_FAILED
है, तो समस्या और कार्रवाई का आईडी देना ज़रूरी है
- अगर टाइप
यहां एक उदाहरण दिया गया है, जिसमें बताया गया है कि कोई सोर्स, Safety Center को डेटा कैसे दे सकता है. इस उदाहरण में, एक चेतावनी कार्ड के साथ एंट्री दी गई है:
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);
पिछली बार दिया गया डेटा पाना
आपके ऐप्लिकेशन के मालिकाना हक वाले सोर्स के लिए, Safety Center को दिया गया पिछला डेटा देखा जा सकता है. इसका इस्तेमाल, अपने यूज़र इंटरफ़ेस (यूआई) में कुछ दिखाने के लिए किया जा सकता है. इससे यह भी पता लगाया जा सकता है कि किसी महंगे ऑपरेशन को करने से पहले, डेटा को अपडेट करने की ज़रूरत है या नहीं. इसके अलावा, Safety Center को कुछ बदलावों के साथ या नए SafetyEvent
इंस्टेंस के साथ वही SafetySourceData
इंस्टेंस भी दिया जा सकता है. यह टेस्टिंग के लिए भी मददगार है.
Safety Center को भेजा गया पिछला डेटा पाने के लिए, इस कोड का इस्तेमाल करें:
SafetySourceData lastDataProvided =
safetyCenterManager.getSafetySourceData("MySourceId");
गड़बड़ी की शिकायत करना
अगर SafetySourceData
डेटा इकट्ठा नहीं हो पा रहा है, तो Safety Center में गड़बड़ी की शिकायत की जा सकती है. इससे एंट्री का रंग स्लेटी हो जाता है, कैश मेमोरी में सेव किया गया डेटा मिट जाता है, और सेटिंग की जांच नहीं की जा सकी जैसा कोई मैसेज दिखता है. अगर SafetySourceIssue.Action
का कोई इंस्टेंस ठीक नहीं हो पाता है, तो भी गड़बड़ी की शिकायत की जा सकती है. इस मामले में, कैश मेमोरी में सेव किया गया डेटा नहीं मिटता और यूज़र इंटरफ़ेस (यूआई) की एंट्री में बदलाव नहीं होता. हालांकि, उपयोगकर्ता को यह बताने के लिए एक मैसेज दिखाया जाता है कि कुछ गड़बड़ी हुई है.
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
- यह ट्रिगर तब होता है, जब Security Center किसी ऐप्लिकेशन के लिए, सुरक्षा सोर्स के डेटा को रीफ़्रेश करने का अनुरोध भेजता है
- सुरक्षित इंटेंट, जिसे सिर्फ़ सिस्टम भेज सकता है
- कॉन्फ़िगरेशन फ़ाइल में, साफ़ तौर पर बताए गए इंटेंट के तौर पर सभी सुरक्षा सोर्स को भेजा जाता है. इसके लिए,
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>
आम तौर पर, Security Center का सोर्स इस तरह से लागू किया जाता है कि डेटा में बदलाव होने पर, वह SafetyCenterManager
को कॉल करता है. सिस्टम की परफ़ॉर्मेंस को बेहतर बनाने के लिए, हमारा सुझाव है कि आप सिर्फ़ फिर से स्कैन करने के सिग्नल (जब उपयोगकर्ता स्कैन बटन पर टैप करता है) का जवाब दें. उपयोगकर्ता के Safety Center खोलने पर जवाब न दें. अगर इस सुविधा की ज़रूरत है, तो कॉन्फ़िगरेशन फ़ाइल में 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
की अनुमति ज़रूरी है
- स्ट्रिंग वैल्यू:
यह इंटेंट ऐक्शन, डिवाइस पर Safety Center से जुड़ी सुविधाओं को चालू या बंद करने के लिए मददगार है.
समस्या को हल करने के लिए कार्रवाइयां लागू करना
समस्या हल करने की कार्रवाई, SafetySourceIssue.Action
का एक ऐसा उदाहरण है जिसे उपयोगकर्ता सीधे सुरक्षा केंद्र की स्क्रीन से हल कर सकता है. उपयोगकर्ता किसी ऐक्शन बटन पर टैप करता है और सुरक्षा सोर्स से भेजा गया SafetySourceIssue.Action
पर PendingIntent
इंस्टेंस ट्रिगर हो जाता है. इससे, बैकग्राउंड में समस्या हल हो जाती है और समस्या हल होने पर, सुरक्षा केंद्र को इसकी सूचना मिल जाती है.
समस्या हल करने की कार्रवाइयां लागू करने के लिए, Safety Center का सोर्स किसी सेवा का इस्तेमाल कर सकता है. ऐसा तब किया जाता है, जब कार्रवाई में कुछ समय लगने की उम्मीद हो (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
इंस्टेंस खारिज किए जाने पर ट्रिगर किया जा सकता है. सुरक्षा केंद्र, इन समस्याओं को हल करता है:
- अगर कोई सोर्स कोई समस्या भेजता है, तो उपयोगकर्ता उसे Safety Center की स्क्रीन पर खारिज कर सकता है. इसके लिए, उसे 'खारिज करें' बटन (चेतावनी कार्ड पर मौजूद X बटन) पर टैप करना होगा.
- जब कोई उपयोगकर्ता किसी समस्या को खारिज करता है, तो अगर समस्या बनी रहती है, तो उसे यूज़र इंटरफ़ेस (यूआई) में फिर से नहीं दिखाया जाएगा.
- डिवाइस रीस्टार्ट होने पर भी, डिस्क पर मौजूद 'हमेशा के लिए खारिज करें' सेटिंग लागू रहती है.
- अगर Safety Center का सोर्स किसी समस्या की जानकारी देना बंद कर देता है और फिर बाद में उस समस्या की जानकारी फिर से देता है, तो समस्या फिर से दिखने लगती है. ऐसा उन मामलों में किया जाता है जहां उपयोगकर्ता को कोई चेतावनी दिखती है और वह उसे खारिज कर देता है. इसके बाद, वह ऐसी कार्रवाई करता है जिससे समस्या हल हो जाती है. हालांकि, फिर से कुछ ऐसा करने पर, उपयोगकर्ता को फिर से वही समस्या आती है. इसके बाद, आपको चेतावनी वाला कार्ड फिर से दिखेगा.
- चेतावनी वाले पीले और लाल कार्ड हर 180 दिन में फिर से दिखते हैं. ऐसा तब तक होता है, जब तक उपयोगकर्ता उन्हें कई बार खारिज नहीं कर देता.
सोर्स को अतिरिक्त व्यवहारों की ज़रूरत तब तक नहीं पड़नी चाहिए, जब तक:
- सोर्स इस व्यवहार को अलग तरीके से लागू करने की कोशिश करता है. उदाहरण के लिए, समस्या को फिर कभी न दिखाना.
- सोर्स, जानकारी को लॉग करने के लिए, इसका इस्तेमाल कॉलबैक के तौर पर करने की कोशिश करता है.
एक से ज़्यादा उपयोगकर्ताओं/प्रोफ़ाइलों का डेटा देना
SafetyCenterManager
एपीआई का इस्तेमाल, सभी उपयोगकर्ताओं और प्रोफ़ाइलों के लिए किया जा सकता है. ज़्यादा जानकारी के लिए, एक से ज़्यादा उपयोगकर्ताओं के लिए ऐप्लिकेशन बनाना लेख पढ़ें. SafetyCenterManager
दिखाने वाला Context
ऑब्जेक्ट, UserHandle
इंस्टेंस से जुड़ा होता है. इसलिए, दिखाया गया SafetyCenterManager
इंस्टेंस, उस UserHandle
इंस्टेंस के लिए Safety Center के साथ इंटरैक्ट करता है. डिफ़ॉल्ट रूप से, 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"
सेट किया जाता है, तो ये चीज़ें होती हैं:
- उपयोगकर्ता (प्रोफ़ाइल के पैरंट) और उससे जुड़ी सभी मैनेज की गई प्रोफ़ाइलों (जो
titleForWork
इंस्टेंस का इस्तेमाल करती हैं) के लिए, यूज़र इंटरफ़ेस (यूआई) एंट्री होती है. रीफ़्रेश या फिर से स्कैन करने का सिग्नल, प्रोफ़ाइल के पैरंट खाते और उससे जुड़ी सभी मैनेज की जा रही प्रोफ़ाइलों के लिए भेजा जाता है. हर प्रोफ़ाइल के लिए, इससे जुड़ा रिसीवर शुरू किया जाता है. यह रिसीवर, इससे जुड़ा डेटा सीधे
SafetyCenterManager
को दे सकता है. इसके लिए, उसे किसी दूसरी प्रोफ़ाइल पर कॉल करने की ज़रूरत नहीं होती. हालांकि, ऐसा तब तक ही होता है, जब तक रिसीवर या ऐप्लिकेशनsingleUser
न हो.सोर्स से उपयोगकर्ता और मैनेज की जा रही सभी प्रोफ़ाइलों का डेटा मिलना चाहिए. प्रोफ़ाइल के आधार पर, हर यूज़र इंटरफ़ेस (यूआई) एंट्री का डेटा अलग-अलग हो सकता है.
टेस्ट करना
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) टेस्ट के ज़्यादा उदाहरण दिए जा सकते हैं. हालांकि, इस बारे में इस गाइड में नहीं बताया गया है. इन ई2ई टेस्ट को लिखने के बारे में ज़्यादा जानने के लिए, CTS टेस्ट (CtsSafetyCenterTestCases) देखें
टेस्ट और इंटरनल एपीआई
इंटरनल एपीआई और टेस्ट एपीआई, इंटरनल इस्तेमाल के लिए होते हैं. इसलिए, इनके बारे में इस गाइड में पूरी जानकारी नहीं दी गई है. हालांकि, हम आने वाले समय में कुछ इंटरनल एपीआई उपलब्ध करा सकते हैं, ताकि OEM अपना यूज़र इंटरफ़ेस (यूआई) बना सकें. साथ ही, हम इस गाइड को अपडेट करेंगे, ताकि इन एपीआई को इस्तेमाल करने का तरीका बताया जा सके.
अनुमतियां
MANAGE_SAFETY_CENTER
internal|installer|role
- इसका इस्तेमाल, Safety Center के इंटरनल एपीआई के लिए किया जाता है
- सिर्फ़ PermissionController और शेल को दी गई
सेटिंग ऐप्लिकेशन
Safety Center पर रीडायरेक्ट करना
डिफ़ॉल्ट रूप से, सेफ़्टी सेंटर को Settings ऐप्लिकेशन में जाकर ऐक्सेस किया जाता है. इसके लिए, सुरक्षा और निजता सेक्शन में जाएं. अगर आपने किसी दूसरे सेटिंग ऐप्लिकेशन का इस्तेमाल किया है या सेटिंग ऐप्लिकेशन में बदलाव किया है, तो हो सकता है कि आपको सुरक्षा केंद्र को ऐक्सेस करने का तरीका पसंद के मुताबिक बनाना पड़े.
सुरक्षा केंद्र की सुविधा चालू होने पर:
- लेगसी निजता एंट्री छिपी हुई है कोड
- लेगसी सुरक्षा एंट्री को छिपाया गया कोड
- सुरक्षा और निजता से जुड़ी नई एंट्री जोड़ी गई है कोड
- सुरक्षा और निजता से जुड़ी नई एंट्री, सुरक्षा केंद्र के कोड पर रीडायरेक्ट करती है
android.settings.PRIVACY_SETTINGS
औरandroid.settings.SECURITY_SETTINGS
के लिए, इंटेंट ऐक्शन को सुरक्षा केंद्र (कोड: सुरक्षा, निजता) पर रीडायरेक्ट किया जाता है
सुरक्षा और निजता से जुड़े बेहतर पेज
सेटिंग ऐप्लिकेशन में, सुरक्षा से जुड़ी अन्य सेटिंग और निजता से जुड़ी अन्य सेटिंग में अन्य सेटिंग मौजूद होती हैं. ये सेटिंग, सुरक्षा केंद्र में उपलब्ध होती हैं:
बेहतर सुरक्षा कोड
ऐडवांस निजता कोड
Android 14 में, बेहतर सुरक्षा और बेहतर निजता सेटिंग वाले पेज को, "सुरक्षा और निजता से जुड़ी ज़्यादा सेटिंग" पेज में मर्ज कर दिया गया है. इस पेज पर, इंटेंट ऐक्शन भी मौजूद है
"com.android.settings.MORE_SECURITY_PRIVACY_SETTINGS"
सुरक्षा से जुड़े सोर्स
सुरक्षा केंद्र, सेटिंग ऐप्लिकेशन से मिलने वाले सुरक्षा सोर्स के किसी खास सेट के साथ इंटिग्रेट होता है:
- लॉक स्क्रीन की सुरक्षा से जुड़ा सोर्स, यह पुष्टि करता है कि लॉक स्क्रीन को पासवर्ड (या अन्य सुरक्षा) के साथ सेट अप किया गया है. इससे यह पक्का होता है कि उपयोगकर्ता की निजी जानकारी को बाहरी ऐक्सेस से सुरक्षित रखा जाए.
- फ़िंगरप्रिंट या चेहरे के सेंसर के साथ इंटिग्रेट करने के लिए, बायोमेट्रिक सुरक्षा सोर्स (डिफ़ॉल्ट रूप से छिपा होता है) दिखता है.
सुरक्षा केंद्र के इन सोर्स का सोर्स कोड, Android के कोड खोजने की सुविधा की मदद से ऐक्सेस किया जा सकता है. अगर सेटिंग ऐप्लिकेशन में बदलाव नहीं किया गया है (पैकेज के नाम, सोर्स कोड या लॉक स्क्रीन और बायोमेट्रिक्स से जुड़े सोर्स कोड में बदलाव नहीं किया गया है), तो यह इंटिग्रेशन बिना किसी रुकावट के काम करना चाहिए. अगर ऐसा नहीं है, तो आपको कुछ बदलाव करने पड़ सकते हैं. जैसे, सेटिंग ऐप्लिकेशन के पैकेज के नाम और Safety Center के साथ इंटिग्रेट किए गए सोर्स के नाम को बदलने के लिए, कॉन्फ़िगरेशन फ़ाइल में बदलाव करना. ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन फ़ाइल अपडेट करना और इंटिग्रेशन सेटिंग देखें.
PendingIntent के बारे में जानकारी
अगर Android 14 या इसके बाद के वर्शन में, Settings ऐप्लिकेशन के मौजूदा Safety Center इंटिग्रेशन का इस्तेमाल किया जा रहा है, तो यहां बताई गई गड़बड़ी को ठीक कर दिया गया है. इस मामले में, इस सेक्शन को पढ़ना ज़रूरी नहीं है.
अगर आपको लगता है कि गड़बड़ी नहीं है, तो सेटिंग ऐप्लिकेशन में एक्सएमएल बूलियन रिसॉर्स कॉन्फ़िगरेशन वैल्यू को config_isSafetyCenterLockScreenPendingIntentFixed
से true
पर सेट करें. इससे, Safety Center में मौजूद गड़बड़ी को ठीक करने का तरीका बंद हो जाएगा.
PendingIntent से जुड़ी समस्या हल करने का तरीका
यह गड़बड़ी, सेटिंग में Intent
इंस्टेंस एक्सट्रा का इस्तेमाल करने की वजह से होती है. इससे यह तय किया जाता है कि कौनसा फ़्रैगमेंट खोलना है. Intent#equals
, Intent
इंस्टेंस के अतिरिक्त एलिमेंट को ध्यान में नहीं रखता. इसलिए, गियर मेन्यू आइकॉन और एंट्री के लिए PendingIntent
इंस्टेंस को एक जैसा माना जाता है और वे एक ही यूज़र इंटरफ़ेस (यूआई) पर ले जाते हैं. भले ही, उनका मकसद किसी दूसरे यूआई पर ले जाना हो. अनुरोध कोड के हिसाब से PendingIntent
इंस्टेंस को अलग करके, इस समस्या को QPR रिलीज़ में ठीक किया गया है. इसके अलावा, Intent#setId
का इस्तेमाल करके भी, इनके बीच अंतर किया जा सकता है.
सुरक्षा से जुड़े इंटरनल सोर्स
सुरक्षा केंद्र के कुछ सोर्स इंटरनल होते हैं. इन्हें PermissionController मॉड्यूल में, PermissionController सिस्टम ऐप्लिकेशन में लागू किया जाता है. ये सोर्स, सुरक्षा केंद्र के सामान्य सोर्स की तरह काम करते हैं और इन्हें कोई खास प्राथमिकता नहीं दी जाती. इन सोर्स का कोड, Android कोड सर्च की मदद से उपलब्ध है.
ये मुख्य रूप से निजता सिग्नल होते हैं. उदाहरण के लिए:
- सुलभता
- इस्तेमाल नहीं किए जा रहे ऐप्लिकेशन के लिए अनुमतियां अपने-आप वापस लेना
- जगह की जानकारी का ऐक्सेस
- सूचना को सुनने की सुविधा
- काम से जुड़ी नीति की जानकारी