सुरक्षा केंद्र पर रीडायरेक्ट करें
कोई भी ऐप्लिकेशन, 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
इंस्टेंस में किया जा सकता है. इससे, Safety Center की स्क्रीन को किसी खास सबपेज पर खोला जा सकता है:
Intent openSafetyCenterIntent = new Intent(Intent.ACTION_SAFETY_CENTER)
.putExtra(SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID, "TheSafetySourcesGroupId");
startActivity(openSafetyCenterIntent);
सुरक्षा केंद्र के सोर्स एपीआई का इस्तेमाल करना
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 के लिए इस्तेमाल किया जाता है
- इसका इस्तेमाल सिर्फ़ सुरक्षा से जुड़े सोर्स करते हैं
- सिर्फ़ अनुमति वाली सूची में शामिल सिस्टम ऐप्लिकेशन को ऐक्सेस दिया गया
ये अनुमतियां खास अधिकार होती हैं. इन्हें सिर्फ़ काम की फ़ाइल में जोड़कर हासिल किया जा सकता है. उदाहरण के लिए, Settings ऐप्लिकेशन और ऐप्लिकेशन की AndroidManifest.xml
फ़ाइल में com.android.settings.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
को शून्य पर सेट किया जा सकता है.- Onखारिज
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
को सीधे सुरक्षा केंद्र की स्क्रीन से ठीक कर दिया है.SafetySourceIssue.Action
को ठीक करने की प्रोसेस को ट्रैक करने के लिए, सुरक्षा केंद्र मेंSAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
के बजाय इसका इस्तेमाल करें.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
का डेटा इकट्ठा नहीं हो पा रहा है, तो सुरक्षा केंद्र पर इस गड़बड़ी की शिकायत की जा सकती है. इससे, एंट्री को बदलकर स्लेटी कर दिया जाएगा, कैश मेमोरी में सेव किया गया डेटा मिट जाएगा, और सेटिंग जांच नहीं की जा सकी जैसा कुछ मैसेज मिलेगा. अगर 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);
रीफ़्रेश या फिर से स्कैन करने के अनुरोध का जवाब देना
नया डेटा उपलब्ध कराने के लिए, सुरक्षा केंद्र से सिग्नल लिया जा सकता है. रीफ़्रेश करने या फिर से स्कैन करने के अनुरोध का जवाब देने से यह पक्का होता है कि उपयोगकर्ता, Safety Center खोलने और स्कैन बटन पर टैप करने पर, डिवाइस की मौजूदा स्थिति देख पाए.
ऐसा करने के लिए, यहां दी गई कार्रवाई के साथ ब्रॉडकास्ट पाएं:
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
- स्ट्रिंग टाइप, अनुरोध किए गए रीफ़्रेश के लिए यूनीक आइडेंटिफ़ायर दिखाता है
- स्ट्रिंग वैल्यू:
Safety Center से सिग्नल पाने के लिए, 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
इंस्टेंस खारिज किए जाने पर ट्रिगर किया जा सकता है. सुरक्षा केंद्र, इन समस्याओं को हल करता है:
- अगर कोई सोर्स किसी समस्या की जानकारी देता है, तो उपयोगकर्ता उसे खारिज कर सकता है. इसके लिए, उसे सुरक्षा केंद्र की स्क्रीन पर, 'खारिज करें' बटन (चेतावनी कार्ड पर मौजूद 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ई टेस्ट को लिखने के बारे में ज़्यादा जानने के लिए, सीटीएस टेस्ट (CtsSafetyCenterTestCases) देखें
टेस्ट और इंटरनल एपीआई
इंटरनल एपीआई और टेस्ट एपीआई, इंटरनल इस्तेमाल के लिए होते हैं. इसलिए, इनके बारे में इस गाइड में पूरी जानकारी नहीं दी गई है. हालांकि, हम आने वाले समय में कुछ इंटरनल एपीआई उपलब्ध करा सकते हैं, ताकि OEM अपना यूज़र इंटरफ़ेस (यूआई) बना सकें. साथ ही, हम इस गाइड को अपडेट करेंगे, ताकि इन एपीआई को इस्तेमाल करने का तरीका बताया जा सके.
अनुमतियां
MANAGE_SAFETY_CENTER
internal|installer|role
- आंतरिक सुरक्षा केंद्र API (एपीआई) के लिए इस्तेमाल किया जाता है
- सिर्फ़ PermissionController और शेल को अनुमति दी गई
सेटिंग ऐप्लिकेशन
Safety Center पर रीडायरेक्ट करना
डिफ़ॉल्ट रूप से, सुरक्षा केंद्र को सेटिंग ऐप्लिकेशन से ऐक्सेस किया जाता है. इसे ऐक्सेस करने के लिए, सुरक्षा और निजता की एक नई एंट्री का इस्तेमाल किया जाता है. अगर किसी दूसरे सेटिंग ऐप्लिकेशन का इस्तेमाल किया जाता है या सेटिंग ऐप्लिकेशन में बदलाव किया गया है, तो सुरक्षा केंद्र को ऐक्सेस करने का तरीक़ा कस्टमाइज़ करना होगा.
सुरक्षा केंद्र के चालू होने पर:
- लेगसी निजता एंट्री छिपा दी गई कोड है
- लेगसी सुरक्षा की एंट्री छिपी हुई है कोड
- सुरक्षा और निजता से जुड़ी नई एंट्री जोड़ी गई है कोड
- सुरक्षा और निजता से जुड़ी नई एंट्री, सुरक्षा केंद्र के कोड पर रीडायरेक्ट करती है
android.settings.PRIVACY_SETTINGS
औरandroid.settings.SECURITY_SETTINGS
के लिए, इंटेंट ऐक्शन को सुरक्षा केंद्र (कोड: सुरक्षा, निजता) पर रीडायरेक्ट किया जाता है
सुरक्षा और निजता से जुड़े बेहतर पेज
सेटिंग ऐप्लिकेशन में, सुरक्षा से जुड़ी अन्य सेटिंग और निजता से जुड़ी अन्य सेटिंग में अन्य सेटिंग मौजूद होती हैं. ये सेटिंग, सुरक्षा केंद्र में जाकर देखी जा सकती हैं:
बेहतर सुरक्षा कोड
ऐडवांस निजता कोड
Android 14 से, बेहतर सुरक्षा और निजता की बेहतर सेटिंग वाले पेज को इंटेंट कार्रवाई के साथ एक ही "ज़्यादा सुरक्षा और निजता" पेज में मर्ज कर दिया गया है
"com.android.settings.MORE_SECURITY_PRIVACY_SETTINGS"
सुरक्षा के सोर्स
सुरक्षा केंद्र, सेटिंग ऐप्लिकेशन से मिले सुरक्षा स्रोतों के खास सेट के साथ काम करता है:
- लॉक स्क्रीन की सुरक्षा से जुड़ा सोर्स, यह पुष्टि करता है कि लॉक स्क्रीन को पासवर्ड (या अन्य सुरक्षा) के साथ सेट अप किया गया है. इससे यह पक्का होता है कि उपयोगकर्ता की निजी जानकारी को बाहरी ऐक्सेस से सुरक्षित रखा जाए.
- फ़िंगरप्रिंट या चेहरे के सेंसर के साथ इंटिग्रेट करने के लिए, बायोमेट्रिक सुरक्षा सोर्स (डिफ़ॉल्ट रूप से छिपा होता है) दिखता है.
सुरक्षा केंद्र के इन सोर्स का सोर्स कोड, Android के कोड खोजने की सुविधा की मदद से ऐक्सेस किया जा सकता है. अगर सेटिंग ऐप्लिकेशन में बदलाव नहीं किया गया है (पैकेज के नाम, सोर्स कोड या लॉक स्क्रीन और बायोमेट्रिक्स से जुड़े सोर्स कोड में बदलाव नहीं किया गया है), तो यह इंटिग्रेशन बिना किसी रुकावट के काम करना चाहिए. अगर ऐसा नहीं होता है, तो सेटिंग में कुछ बदलाव करने पड़ सकते हैं. जैसे, सेटिंग ऐप्लिकेशन के पैकेज का नाम, सुरक्षा केंद्र से इंटिग्रेट किए गए सोर्स, और इंटिग्रेशन को बदलने के लिए, कॉन्फ़िगरेशन फ़ाइल में बदलाव करना. ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन फ़ाइल अपडेट करना और इंटिग्रेशन सेटिंग देखें.
PendingIntent के बारे में जानकारी
अगर Android 14 या इसके बाद के वर्शन में, Settings ऐप्लिकेशन के मौजूदा Safety Center इंटिग्रेशन का इस्तेमाल किया जा रहा है, तो यहां बताई गई गड़बड़ी को ठीक कर दिया गया है. इस मामले में, इस सेक्शन को पढ़ना ज़रूरी नहीं है.
अगर आपको लगता है कि गड़बड़ी नहीं है, तो सेटिंग ऐप्लिकेशन में एक्सएमएल बूलियन रिसॉर्स कॉन्फ़िगरेशन वैल्यू को config_isSafetyCenterLockScreenPendingIntentFixed
से true
पर सेट करें. इससे, Safety Center में मौजूद गड़बड़ी को ठीक करने का तरीका बंद हो जाएगा.
PendingIntent से जुड़ी समस्या हल करने का तरीका
यह गड़बड़ी, सेटिंग में Intent
इंस्टेंस एक्सट्रा का इस्तेमाल करने की वजह से होती है. इससे यह तय किया जाता है कि कौनसा फ़्रैगमेंट खोलना है. Intent#equals
, Intent
इंस्टेंस
एक्स्ट्रा पर ध्यान नहीं देता है, इसलिए गियर मेन्यू आइकॉन और एंट्री के लिए PendingIntent
इंस्टेंस को बराबर माना जाता है और वे एक ही यूज़र इंटरफ़ेस (यूआई) पर नेविगेट करते हैं (भले ही उनका मकसद किसी दूसरे यूज़र इंटरफ़ेस (यूआई) पर नेविगेट करना हो). अनुरोध कोड के हिसाब से PendingIntent
इंस्टेंस को अलग करके, इस समस्या को QPR रिलीज़ में ठीक किया गया है. इसके अलावा,
Intent#setId
का इस्तेमाल करके, इसे अलग-अलग किया जा सकता है.
सुरक्षा से जुड़े इंटरनल सोर्स
सुरक्षा केंद्र के कुछ सोर्स इंटरनल होते हैं. इन्हें PermissionController मॉड्यूल में, PermissionController सिस्टम ऐप्लिकेशन में लागू किया जाता है. ये सोर्स, सुरक्षा केंद्र के सामान्य सोर्स की तरह काम करते हैं और इनके लिए कोई खास तरह की कार्रवाई नहीं की जाती है. इन सोर्स का कोड, Android कोड सर्च की मदद से उपलब्ध है.
ये मुख्य रूप से निजता सिग्नल होते हैं. उदाहरण के लिए:
- सुलभता
- इस्तेमाल नहीं किए जा रहे ऐप्लिकेशन के लिए अनुमतियां अपने-आप वापस लेना
- जगह की जानकारी का ऐक्सेस
- सूचना को सुनने की सुविधा
- काम से जुड़ी नीति की जानकारी