सुरक्षा केंद्र से इंटरैक्ट करना

सुरक्षा केंद्र पर रीडायरेक्ट करना

कोई भी ऐप्लिकेशन, 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);

सुरक्षा केंद्र के सोर्स एपीआई का इस्तेमाल करना

सुरक्षा केंद्र के सोर्स एपीआई, SafetyCenterManager (यह एक @SystemApi है) का इस्तेमाल करके उपलब्ध हैं. एपीआई प्लैटफ़ॉर्म का कोड, Code Search में उपलब्ध है. एपीआई को लागू करने का कोड, Code Search में उपलब्ध है.

अनुमतियां

सुरक्षा केंद्र के सोर्स एपीआई को सिर्फ़ अनुमति वाली सूची में शामिल सिस्टम ऐप्लिकेशन ऐक्सेस कर सकते हैं. इसके लिए, उन्हें नीचे दी गई अनुमतियों का इस्तेमाल करना होगा. ज़्यादा जानकारी के लिए, खास अधिकारों वाले लोगों को अनुमति देने की सुविधा देखें.

  • READ_SAFETY_CENTER_STATUS
    • signature|privileged
    • इसका इस्तेमाल SafetyCenterManager#isSafetyCenterEnabled() API के लिए किया जाता है (सुरक्षा केंद्र के सोर्स के लिए यह ज़रूरी नहीं है. इन्हें सिर्फ़ 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 का इस्तेमाल करना ज़रूरी है
    • इस समस्या को सीधे SafetyCenter स्क्रीन से हल किया जा सकता है या नहीं, यह बताने के लिए बूलियन (डिफ़ॉल्ट रूप से false पर सेट होता है)
    • CharSequence हो जाने का वैकल्पिक मैसेज. इसे उपयोगकर्ता को तब दिखाया जाएगा, जब सुरक्षा केंद्र की स्क्रीन पर ही समस्या हल हो जाएगी
  • ज़रूरी नहीं 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_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 है, तो समस्या और कार्रवाई का आईडी देना ज़रूरी है

नीचे दिए गए उदाहरण में बताया गया है कि कोई सोर्स, सुरक्षा केंद्र को डेटा कैसे उपलब्ध करा सकता है (इस मामले में, एक चेतावनी कार्ड के साथ एक एंट्री दी जा रही है):

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 इंस्टेंस भी दिया जा सकता है. यह टेस्टिंग के लिए भी काम का है.

सुरक्षा केंद्र को दिया गया पिछला डेटा पाने के लिए, इस कोड का इस्तेमाल करें:

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
    • यह तब ट्रिगर होता है, जब सुरक्षा केंद्र किसी ऐप्लिकेशन के सुरक्षा सोर्स के डेटा को रीफ़्रेश करने का अनुरोध भेजता है.
    • सुरक्षित इंटेंट, जिसे सिर्फ़ सिस्टम भेज सकता है
    • यह मैसेज कॉन्फ़िगरेशन फ़ाइल में सभी सुरक्षा सोर्स को साफ़ तौर पर भेजा गया है. इसके लिए, 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 अनुमति ज़रूरी है

इस इंटेंट कार्रवाई से, डिवाइस पर सुरक्षा केंद्र से जुड़ी सुविधाओं को चालू या बंद करने में मदद मिलती है.

समाधान की कार्रवाइयां लागू करें

समस्या हल करने की कार्रवाई, 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 बटन) पर टैप करना होगा.
  • जब कोई उपयोगकर्ता किसी समस्या को खारिज करता है, तो अगर समस्या बनी रहती है, तो उसे यूज़र इंटरफ़ेस (यूआई) में फिर से नहीं दिखाया जाएगा.
  • डिवाइस को फिर से चालू करने के दौरान, डिस्क को बार-बार खारिज करने की सुविधा मौजूद रहती है.
  • अगर सुरक्षा केंद्र का सोर्स, समस्या की जानकारी देना बंद कर देता है और बाद में उसे फिर से उपलब्ध कराता है, तो वह समस्या फिर से दिखने लगती है. यह ऐसी स्थितियों की अनुमति देता है जब उपयोगकर्ता को चेतावनी दिखती है, उसे खारिज कर दिया जाता है, और फिर ऐसी कार्रवाई की जाती है जिससे समस्या कम हो जानी चाहिए. हालांकि, ऐसा करने के बाद, उपयोगकर्ता फिर से कुछ ऐसा करता है जिसकी वजह से वही समस्या होती है. ऐसा होने पर, चेतावनी वाला कार्ड फिर से दिखने लगेगा.
  • चेतावनी वाले पीले और लाल कार्ड, हर 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 और शेल को अनुमति दी गई

सेटिंग ऐप्लिकेशन

सुरक्षा केंद्र पर रीडायरेक्ट करना

डिफ़ॉल्ट रूप से, सेफ़्टी सेंटर को 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 कोड सर्च की मदद से उपलब्ध है.

ये मुख्य तौर पर निजता से जुड़े सिग्नल होते हैं, जैसे:

  • सुलभता
  • इस्तेमाल न होने वाले ऐप्लिकेशन अपने-आप रद्द होने की सुविधा
  • जगह की जानकारी का ऐक्सेस
  • सूचना को सुनने की सुविधा
  • काम से जुड़ी नीति की जानकारी