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

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

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

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

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

अनुमतियां

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

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

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

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

इन कार्रवाइयों को ठीक करने के लिए, सुरक्षा केंद्र का सोर्स किसी सेवा का इस्तेमाल कर सकता है, अगर कार्रवाई में कुछ समय लग सकता है (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
    • इसका इस्तेमाल, Safety Center के इंटरनल एपीआई के लिए किया जाता है
    • सिर्फ़ PermissionController और शेल को अनुमति दी गई

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

Safety Center पर रीडायरेक्ट करना

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

सुरक्षा केंद्र के चालू होने पर:

  • लेगसी निजता एंट्री छिपी हुई है कोड
  • लेगसी सुरक्षा की एंट्री छिपा दी गई है कोड
  • सुरक्षा और निजता से जुड़ी नई एंट्री जोड़ी गई है कोड
  • सुरक्षा और निजता से जुड़ी नई एंट्री, सुरक्षा केंद्र के कोड पर रीडायरेक्ट करती है
  • android.settings.PRIVACY_SETTINGS और android.settings.SECURITY_SETTINGS इंटेंट ऐक्शन को सुरक्षा केंद्र (कोड: सिक्योरिटी, निजता)

बेहतर सुरक्षा और निजता पेज

सेटिंग ऐप्लिकेशन में, सुरक्षा से जुड़ी अन्य सेटिंग में, अतिरिक्त सेटिंग शामिल होती हैं और निजता सेटिंग से जुड़ी अन्य सेटिंग के टाइटल, सुरक्षा केंद्र में उपलब्ध हैं:

सुरक्षा से जुड़े सोर्स

सुरक्षा केंद्र, सुरक्षा स्रोतों के खास सेट के साथ इंटिग्रेट किया जाता है. ये संसाधन, सेटिंग ऐप्लिकेशन:

  • लॉक स्क्रीन की सुरक्षा से जुड़ा सोर्स, यह पुष्टि करता है कि लॉक स्क्रीन को पासवर्ड (या अन्य सुरक्षा) के साथ सेट अप किया गया है. इससे यह पक्का होता है कि उपयोगकर्ता की निजी जानकारी को बाहरी ऐक्सेस से सुरक्षित रखा जाए.
  • फ़िंगरप्रिंट या चेहरे के सेंसर के साथ इंटिग्रेट करने के लिए, बायोमेट्रिक्स सुरक्षा सोर्स (डिफ़ॉल्ट रूप से छिपा होता है) दिखता है.

सुरक्षा केंद्र के इन सोर्स का सोर्स कोड, Android के कोड खोजने की सुविधा की मदद से ऐक्सेस किया जा सकता है. अगर सेटिंग ऐप्लिकेशन में कोई बदलाव नहीं किया गया है (पैकेज के नाम में बदलाव नहीं किए गए हैं, सोर्स कोड या ऐसा सोर्स कोड जो लॉक स्क्रीन और बायोमेट्रिक्स से जुड़ा हो), तो यह इंटिग्रेशन अलग तरीके से काम करेगा. अगर ऐसा नहीं है, तो आपको कुछ बदलाव करने पड़ सकते हैं. जैसे, सेटिंग ऐप्लिकेशन के पैकेज के नाम और Safety Center के साथ इंटिग्रेट किए गए सोर्स के नाम को बदलने के लिए, कॉन्फ़िगरेशन फ़ाइल में बदलाव करना. ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन अपडेट करना फ़ाइल और इंटिग्रेशन सेटिंग का इस्तेमाल करें.

PendingIntent के बारे में जानकारी

अगर आप Android में सेटिंग ऐप्लिकेशन के सुरक्षा केंद्र के इंटिग्रेशन का इस्तेमाल करते हैं 14 या उसके बाद के वर्शन में बताई गई गड़बड़ी को ठीक कर दिया गया है. इस मामले में इस सेक्शन को पढ़ने की ज़रूरत नहीं है.

जब आप पक्का हो जाएं कि गड़बड़ी मौजूद नहीं है, तो एक्सएमएल बूलियन रिसॉर्स सेट करें सेटिंग ऐप्लिकेशन में कॉन्फ़िगरेशन मान config_isSafetyCenterLockScreenPendingIntentFixed से true सुरक्षा केंद्र में समाधान की जानकारी.

PendingIntent के समाधान

यह गड़बड़ी तब होती है, जब सेटिंग में यह तय करने के लिए कि Intent इंस्टेंस एक्स्ट्रा का इस्तेमाल किया जाता है फ़्रैगमेंट खोलें. क्योंकि Intent#equals, Intent इंस्टेंस नहीं लेता अतिरिक्त चीज़ों को ध्यान में रखते हुए, गियर मेन्यू आइकॉन के लिए PendingIntent इंस्टेंस और एंट्री को बराबर माना जाता है और उसी यूज़र इंटरफ़ेस (यूआई) पर नेविगेट करना होता है (भले ही वे के लिए डिज़ाइन किया गया है). इस समस्या को क्यूपीआर रिलीज़ में ठीक किया गया है: अनुरोध कोड के हिसाब से, PendingIntent इंस्टेंस को अलग-अलग करें. इसके अलावा, इसमें Intent#setId का इस्तेमाल करके अंतर किया जा सकता है.

सुरक्षा के अंदरूनी सोर्स

सुरक्षा केंद्र के कुछ स्रोत आंतरिक होते हैं और परमिशन कंट्रोलर मॉड्यूल के अंदर अनुमति कंट्रोलर सिस्टम ऐप्लिकेशन. ये सोर्स, सुरक्षा केंद्र के सामान्य सोर्स की तरह काम करते हैं और इन्हें कोई खास प्राथमिकता नहीं दी जाती. इन सोर्स का कोड, Android कोड के ज़रिए उपलब्ध है खोजें.

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

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