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

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

कोई भी ऐप्लिकेशन, 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 कोड सर्च की मदद से उपलब्ध है.

ये मुख्य रूप से निजता सिग्नल होते हैं. उदाहरण के लिए:

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