कॉन्टेंट देने वाला ऐप्लिकेशन बनाएं

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

हालांकि, कॉन्टेंट देने वालों का मकसद दूसरे लोगों को डेटा उपलब्ध कराना होता है तो आपके पास ऐसी गतिविधियां हो सकती हैं जिनसे उपयोगकर्ता क्वेरी और आपके कंपनी की ओर से प्रबंधित डेटा में बदलाव करें.

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

प्रॉपर्टी बनाना शुरू करने से पहले

सेवा देने वाली कंपनी बनाने से पहले, इन बातों का ध्यान रखें:

  • तय करें कि आपको कॉन्टेंट देने वाले की ज़रूरत है या नहीं. आपको एक सामग्री बनानी होगी प्रोवाइडर को भेजें, जब आपको इनमें से एक या ज़्यादा सुविधाएं देनी हों:
    • आप अन्य ऐप्लिकेशन को जटिल डेटा या फ़ाइलें ऑफ़र करना चाहते हैं.
    • आपको उपयोगकर्ताओं को यह सुविधा देनी है कि वे आपके ऐप्लिकेशन से मुश्किल डेटा को दूसरे ऐप्लिकेशन में कॉपी कर सकें.
    • आपको खोज फ़्रेमवर्क का इस्तेमाल करके, खोज से जुड़े पसंद के मुताबिक सुझाव देने हैं.
    • आप अपना ऐप्लिकेशन डेटा विजेट को दिखाना चाहते हैं.
    • AbstractThreadedSyncAdapter लागू करना है, CursorAdapter या CursorLoader क्लास.

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

  • अगर आपने अब तक ऐसा नहीं किया है, तो इसे पढ़ें कॉन्टेंट देने वालों के बारे में बुनियादी बातें पढ़ें.

इसके बाद, अपना प्रोवाइडर बनाने के लिए यह तरीका अपनाएं:

  1. अपने डेटा के लिए रॉ स्टोरेज डिज़ाइन करें. कॉन्टेंट देने वाले दो तरीके से डेटा उपलब्ध कराते हैं:
    फ़ाइल डेटा
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ऐसा डेटा जो आम तौर पर फ़ाइलों में जाता है, जैसे फ़ोटो, ऑडियो या वीडियो. फ़ाइलों को अपने ऐप्लिकेशन के निजी फ़ोल्डर में सेव करें स्पेस. किसी अन्य ऐप्लिकेशन से फ़ाइल पाने के अनुरोध के जवाब में, प्रोवाइडर, फ़ाइल को हैंडल करने का विकल्प दे सके.
    "स्ट्रक्चर्ड" डेटा
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ऐसा डेटा जो आम तौर पर किसी डेटाबेस, कलेक्शन या मिलते-जुलते स्ट्रक्चर में जाता है. डेटा को ऐसे फ़ॉर्म में स्टोर करें जो पंक्तियों और कॉलम की टेबल के साथ काम करे. A पंक्ति किसी इकाई के बारे में बताता है. जैसे, इन्वेंट्री में मौजूद कोई व्यक्ति या आइटम. कॉलम दिखाता है इकाई का कुछ डेटा, जैसे कि किसी व्यक्ति का नाम या किसी आइटम की कीमत. यह जानने का एक सामान्य तरीका इस तरह के डेटा को SQLite डेटाबेस में सेव किया जाता है. हालांकि, आपके पास किसी भी तरह के डेटा को स्थायी स्टोरेज. इसमें उपलब्ध स्टोरेज टाइप के बारे में ज़्यादा जानने के लिए, Android सिस्टम के लिए, डेटा स्टोरेज डिज़ाइन करें सेक्शन.
  2. ContentProvider क्लास को ठोस तौर पर लागू करने के बारे में बताएं और भी ज़रूरी तरीके हैं. यह क्लास आपके डेटा और बाकी के डेटा के बीच का इंटरफ़ेस है Android सिस्टम. इस क्लास के बारे में ज़्यादा जानकारी के लिए, देखें ContentProvider क्लास सेक्शन लागू करें.
  3. प्रोवाइडर की अथॉरिटी स्ट्रिंग, कॉन्टेंट यूआरआई, और कॉलम के नाम तय करें. अगर आपको सेवा देने वाली कंपनी का ऐप्लिकेशन, इंटेंट को हैंडल करने के साथ-साथ इंटेंट कार्रवाइयों, अतिरिक्त डेटा, फ़्लैग करें. साथ ही, उन ऐप्लिकेशन के लिए अनुमतियां तय करें जो आपका डेटा ऐक्सेस करने के लिए. इन सभी वैल्यू को कॉन्सटेंट के तौर पर परिभाषित करें: अलग कॉन्ट्रैक्ट क्लास का उपयोग करना होगा. बाद में, इस क्लास को दूसरे डेवलपर को दिखाया जा सकता है. ज़्यादा के लिए कॉन्टेंट यूआरआई के बारे में जानकारी देखें, तो कॉन्टेंट यूआरआई सेक्शन. इंटेंट के बारे में ज़्यादा जानकारी के लिए, इंटेंट और डेटा ऐक्सेस सेक्शन.
  4. सैंपल डेटा या लागू करने की प्रक्रिया जैसे अन्य वैकल्पिक हिस्से जोड़ें का AbstractThreadedSyncAdapter जो डेटा सिंक कर सकता है क्लाउड-आधारित डेटा इकट्ठा कर सकते हैं.

डिज़ाइन डेटा स्टोरेज

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

Android पर उपलब्ध, डेटा सेव करने वाली कुछ टेक्नोलॉजी के बारे में यहां बताया गया है:

  • अगर स्ट्रक्चर्ड डेटा का इस्तेमाल किया जा रहा है, तो या तो रिलेशनल डेटाबेस का इस्तेमाल करें, जैसे कि SQLite या गैर-रिलेशनल की-वैल्यू डेटास्टोर, जैसे कि levelDB. अगर आप काम कर रहे हैं, तो को अनस्ट्रक्चर्ड डेटा के साथ रखा जा सकता है. जैसे, ऑडियो, इमेज या वीडियो मीडिया. इसके बाद, डेटा को फ़ाइलों के रूप में सेव किया जाता है. अलग-अलग तरह के स्टोरेज को एक साथ मिलाया जा सकता है और उन्हें बिना अनुमति के सार्वजनिक किया जा सकता है किसी एक कॉन्टेंट प्रोवाइडर का इस्तेमाल करें.
  • Android सिस्टम, रूम परसिस्टेंस लाइब्रेरी से इंटरैक्ट कर सकता है. इससे SQLite के डेटाबेस एपीआई का ऐक्सेस मिलता है, जिसे Android की कंपनियां उपलब्ध कराती हैं का इस्तेमाल टेबल-ओरिएंटेड डेटा को स्टोर करने के लिए किया जाता है. इसका इस्तेमाल करके डेटाबेस बनाने के लिए लाइब्रेरी, इसकी सब-क्लास को इंस्टैंशिएट करें RoomDatabase, जैसा कि इसमें बताया गया है रूम का इस्तेमाल करके, किसी स्थानीय डेटाबेस में डेटा सेव करना.

    डेटा स्टोर करने की जगह को लागू करने के लिए, आपको किसी डेटाबेस का इस्तेमाल करने की ज़रूरत नहीं है. सेवा देने वाली कंपनी बाहरी रूप से टेबल के सेट के तौर पर दिखता है. यह रिलेशनल डेटाबेस की तरह ही दिखता है, लेकिन यह देने की ज़रूरत नहीं होती.

  • फ़ाइल का डेटा सेव करने के लिए, Android में कई तरह के फ़ाइल ओर ध्यान देने वाले एपीआई हैं. फ़ाइल स्टोरेज के बारे में ज़्यादा जानने के लिए, डेटा और फ़ाइल स्टोरेज की खास जानकारी. अगर आप: मीडिया से जुड़ा डेटा, जैसे कि संगीत या वीडियो उपलब्ध कराने वाली कंपनी डिज़ाइन करके, एक ऐसा प्रोवाइडर है जो टेबल डेटा और फ़ाइलों को जोड़ता है.
  • बहुत कम मामलों में, आपको लागू होता है. उदाहरण के लिए, हो सकता है कि आप विजेट के साथ कुछ डेटा शेयर करना चाहें. और दूसरे के साथ शेयर करने के लिए डेटा का एक अलग सेट दिखा सकता है. का इस्तेमाल करें.
  • नेटवर्क-आधारित डेटा के साथ काम करने के लिए, java.net में क्लास का इस्तेमाल करें और android.net. नेटवर्क-आधारित डेटा को लोकल डेटा के साथ भी सिंक किया जा सकता है सेव कर सकते हैं और फिर डेटा को टेबल या फ़ाइलों के रूप में पेश कर सकते हैं.

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

डेटा डिज़ाइन से जुड़ी ज़रूरी बातें

कंपनी का डेटा स्ट्रक्चर डिज़ाइन करने के लिए, यहां कुछ सुझाव दिए गए हैं:

  • टेबल डेटा में हमेशा "प्राइमरी पासकोड" होना चाहिए कॉलम जो जानकारी इकट्ठा करता है का इस्तेमाल करें. इस वैल्यू का इस्तेमाल, लाइन को मिलती-जुलती वैल्यू से लिंक करने के लिए किया जा सकता है पंक्तियों में डाला जाना चाहिए (इसका इस्तेमाल "विदेशी कुंजी" के तौर पर करके किया जाता है). हालांकि, आप कोई भी नाम इस्तेमाल कर सकते हैं इस कॉलम के लिए, BaseColumns._ID का इस्तेमाल करना सबसे अच्छा है क्योंकि किसी कंपनी की क्वेरी के नतीजों को ListView का नाम रखने के लिए, वापस मिले कॉलम में से किसी एक का नाम होना ज़रूरी है _ID.
  • यदि आप बिटमैप चित्र या फ़ाइल-आधारित डेटा के अन्य बहुत बड़े हिस्से प्रदान करना चाहते हैं, तो डेटा को फ़ाइल में सेव करता है और फिर इसे सीधे टेबल. ऐसा करने पर, आपको सेवा देने वाली कंपनी के उपयोगकर्ताओं को बताना होगा कि उन्हें डेटा ऐक्सेस करने के लिए, फ़ाइल का ContentResolver तरीका.
  • अलग-अलग साइज़ वाला या जिसमें बदलाव हो सकता है. उदाहरण के लिए, BLOB कॉलम का इस्तेमाल करके प्रोटोकॉल बफ़र या JSON का स्ट्रक्चर.

    स्कीमा-इंडिपेंडेंट टेबल को लागू करने के लिए, बीएलओबी का इस्तेमाल भी किया जा सकता है. तय सीमा में इस तरह की टेबल में, आप प्राथमिक कुंजी कॉलम, MIME टाइप वाला कॉलम, और एक या BLOB के तौर पर ज़्यादा सामान्य कॉलम. बीएलओबी कॉलम में डेटा का मतलब बताया गया है डालने का विकल्प होता है. इससे आपको अलग-अलग तरह की लाइन सेव करने की सुविधा मिलती है एक ही टेबल होगी. संपर्क सूची का "डेटा" मेज़ ContactsContract.Data एक स्कीमा-इंडिपेंडेंट का उदाहरण है टेबल.

कॉन्टेंट यूआरआई डिज़ाइन करें

कॉन्टेंट यूआरआई एक यूआरआई है, जिससे सेवा देने वाली कंपनी में डेटा की पहचान की जाती है. कॉन्टेंट यूआरआई में ये शामिल हैं सेवा देने वाली पूरी कंपनी का सांकेतिक नाम (इसकी प्राधिकारी) और वह नाम जो किसी टेबल या फ़ाइल (पाथ) पर ले जाता हो. आईडी का वैकल्पिक हिस्सा टेबल की हर लाइन में. डेटा ऐक्सेस करने का हर तरीका ContentProvider में तर्क के तौर पर कॉन्टेंट यूआरआई है. इससे आपको ऐक्सेस करने के लिए टेबल, पंक्ति या फ़ाइल तय करें.

कॉन्टेंट यूआरआई के बारे में जानकारी के लिए देखें कॉन्टेंट देने वाले के बारे में बुनियादी बातें.

संस्था का डिज़ाइन बनाना

आम तौर पर, सेवा देने वाली कंपनी के पास एक अधिकार होता है, जो उसका Android इंटरनल नाम होता है. यहां की यात्रा पर हूं अन्य कंपनियों के साथ विवादों से बचें, इंटरनेट डोमेन के मालिकाना हक का इस्तेमाल करें (गलत तरीके से) के आधार पर दी गई है. क्योंकि यह सुझाव Android के लिए भी सही है पैकेज के नाम, तो आप सेवा देने वाली कंपनी के प्राधिकरण को नाम के एक्सटेंशन के रूप में परिभाषित कर सकते हैं जोड़ें.

उदाहरण के लिए, अगर आपके Android पैकेज का नाम com.example.<appname>, अपनी कंपनी को सर्टिफ़िकेट देने वाली संस्था या निकाय com.example.<appname>.provider.

पाथ का स्ट्रक्चर डिज़ाइन करना

डेवलपर आम तौर पर, यूआरएल के यूआरएल पर ले जाने वाले पाथ को जोड़कर, संस्था या निकाय से कॉन्टेंट यूआरआई बनाते हैं अलग-अलग टेबल का इस्तेमाल करें. उदाहरण के लिए, अगर आपके पास दो टेबल हैं, table1 और table2, पिछले उदाहरण में दी गई जानकारी के साथ उन्हें मिलाकर कॉन्टेंट यूआरआई com.example.<appname>.provider/table1 और com.example.<appname>.provider/table2. पाथ एक सेगमेंट तक सीमित होता है और पाथ के हर लेवल के लिए कोई टेबल होनी ज़रूरी नहीं है.

कॉन्टेंट के यूआरआई आईडी मैनेज करना

सेवा देने वाली कंपनियां, कॉन्टेंट के यूआरआई को स्वीकार करके टेबल की एक पंक्ति का ऐक्सेस देती हैं और यूआरआई के आखिर में लाइन के लिए एक आईडी वैल्यू डालें. साथ ही, कन्वेंशन के मुताबिक, सेवा देने वाली कंपनियां टेबल के _ID कॉलम के लिए आईडी मान और मेल खाने वाली पंक्ति.

यह तरीका, सेवा देने वाली कंपनी को ऐक्सेस करने वाले ऐप्लिकेशन के डिज़ाइन पैटर्न को आसान बनाता है. ऐप्लिकेशन सेवा देने वाली कंपनी के ख़िलाफ़ क्वेरी करता है और नतीजे के तौर पर Cursor दिखाता है CursorAdapter का इस्तेमाल करके, ListView में. CursorAdapter की परिभाषा के लिए, Cursor को _ID मिलेगा

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

कॉन्टेंट यूआरआई पैटर्न

यह चुनने में आपकी मदद करने के लिए कि इनकमिंग कॉन्टेंट यूआरआई के लिए कौनसी कार्रवाई की जाए, प्रोवाइडर एपीआई में सुविधा क्लास UriMatcher, जो कॉन्टेंट यूआरआई पैटर्न को मैप करती है पूर्णांक वैल्यू का इस्तेमाल करें. आप switch कथन में पूर्णांक मानों का इस्तेमाल कर सकते हैं, जो किसी खास पैटर्न से मेल खाने वाले कॉन्टेंट यूआरआई या यूआरआई के लिए पसंदीदा कार्रवाई चुनता है.

कॉन्टेंट यूआरआई पैटर्न, वाइल्डकार्ड वर्णों का इस्तेमाल करके कॉन्टेंट यूआरआई से मैच करता है:

  • *, किसी भी लंबाई के मान्य वर्णों की स्ट्रिंग से मेल खाता है.
  • # किसी भी लंबाई के संख्या वाले वर्णों की स्ट्रिंग से मेल खाता है.

कॉन्टेंट यूआरआई को डिज़ाइन और कोडिंग के उदाहरण के तौर पर, ऐसी कंपनी मानें जिसके पास com.example.app.provider देने वाली संस्था, जो इन कॉन्टेंट यूआरआई की पहचान करती है टेबल पर ले जाते हैं:

  • content://com.example.app.provider/table1: table1 नाम की टेबल.
  • content://com.example.app.provider/table2/dataset1: नाम की टेबल dataset1.
  • content://com.example.app.provider/table2/dataset2: नाम की टेबल dataset2.
  • content://com.example.app.provider/table3: table3 नाम की टेबल.

प्रोवाइडर इन कॉन्टेंट यूआरआई की पहचान तब भी करता है, जब उनमें लाइन आईडी जोड़ा गया हो. जैसे, पहचानी गई लाइन के लिए content://com.example.app.provider/table3/1 table3 में 1.

ये कॉन्टेंट यूआरआई पैटर्न इस्तेमाल किए जा सकते हैं:

content://com.example.app.provider/*
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है प्रोवाइडर में मौजूद किसी भी कॉन्टेंट यूआरआई से मेल खाता है.
content://com.example.app.provider/table2/*
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है dataset1 टेबल के कॉन्टेंट यूआरआई से मेल खाता है और dataset2, लेकिन table1 या के लिए सामग्री यूआरआई से मेल नहीं खाता या table3.
content://com.example.app.provider/table3/#
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है कॉन्टेंट के यूआरआई से मेल खाता है table3 में सिंगल पंक्तियों के लिए, जैसे कि इनसे पहचानी गई लाइन के लिए content://com.example.app.provider/table3/6 6.

यह कोड स्निपेट दिखाता है कि UriMatcher में तरीके कैसे काम करते हैं. यह कोड किसी पूरी टेबल के यूआरआई को, कॉन्टेंट यूआरआई पैटर्न का इस्तेमाल करके सिंगल लाइन content://<authority>/<path> टेबल और एक लाइन के लिए content://<authority>/<path>/<id>.

तरीका addURI() प्राधिकरण और पथ का एक पूर्णांक मान है. तरीका match(), यूआरआई के लिए पूर्णांक वैल्यू दिखाता है. switch का स्टेटमेंट पूरी टेबल को क्वेरी करने और किसी एक रिकॉर्ड के लिए क्वेरी करने का विकल्प चुनता है.

Kotlin

private val sUriMatcher = UriMatcher(UriMatcher.NO_MATCH).apply {
    /*
     * The calls to addURI() go here for all the content URI patterns that the provider
     * recognizes. For this snippet, only the calls for table 3 are shown.
     */

    /*
     * Sets the integer value for multiple rows in table 3 to 1. Notice that no wildcard is used
     * in the path.
     */
    addURI("com.example.app.provider", "table3", 1)

    /*
     * Sets the code for a single row to 2. In this case, the # wildcard is
     * used. content://com.example.app.provider/table3/3 matches, but
     * content://com.example.app.provider/table3 doesn't.
     */
    addURI("com.example.app.provider", "table3/#", 2)
}
...
class ExampleProvider : ContentProvider() {
    ...
    // Implements ContentProvider.query()
    override fun query(
            uri: Uri?,
            projection: Array<out String>?,
            selection: String?,
            selectionArgs: Array<out String>?,
            sortOrder: String?
    ): Cursor? {
        var localSortOrder: String = sortOrder ?: ""
        var localSelection: String = selection ?: ""
        when (sUriMatcher.match(uri)) {
            1 -> { // If the incoming URI was for all of table3
                if (localSortOrder.isEmpty()) {
                    localSortOrder = "_ID ASC"
                }
            }
            2 -> {  // If the incoming URI was for a single row
                /*
                 * Because this URI was for a single row, the _ID value part is
                 * present. Get the last path segment from the URI; this is the _ID value.
                 * Then, append the value to the WHERE clause for the query.
                 */
                localSelection += "_ID ${uri?.lastPathSegment}"
            }
            else -> { // If the URI isn't recognized,
                // do some error handling here
            }
        }

        // Call the code to actually do the query
    }
}

Java

public class ExampleProvider extends ContentProvider {
...
    // Creates a UriMatcher object.
    private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    static {
        /*
         * The calls to addURI() go here for all the content URI patterns that the provider
         * recognizes. For this snippet, only the calls for table 3 are shown.
         */

        /*
         * Sets the integer value for multiple rows in table 3 to one. No wildcard is used
         * in the path.
         */
        uriMatcher.addURI("com.example.app.provider", "table3", 1);

        /*
         * Sets the code for a single row to 2. In this case, the # wildcard is
         * used. content://com.example.app.provider/table3/3 matches, but
         * content://com.example.app.provider/table3 doesn't.
         */
        uriMatcher.addURI("com.example.app.provider", "table3/#", 2);
    }
...
    // Implements ContentProvider.query()
    public Cursor query(
        Uri uri,
        String[] projection,
        String selection,
        String[] selectionArgs,
        String sortOrder) {
...
        /*
         * Choose the table to query and a sort order based on the code returned for the incoming
         * URI. Here, too, only the statements for table 3 are shown.
         */
        switch (uriMatcher.match(uri)) {


            // If the incoming URI was for all of table3
            case 1:

                if (TextUtils.isEmpty(sortOrder)) sortOrder = "_ID ASC";
                break;

            // If the incoming URI was for a single row
            case 2:

                /*
                 * Because this URI was for a single row, the _ID value part is
                 * present. Get the last path segment from the URI; this is the _ID value.
                 * Then, append the value to the WHERE clause for the query.
                 */
                selection = selection + "_ID = " + uri.getLastPathSegment();
                break;

            default:
            ...
                // If the URI isn't recognized, do some error handling here
        }
        // Call the code to actually do the query
    }

एक अन्य क्लास, ContentUris, काम करने के लिए आसान तरीके उपलब्ध कराती है सामग्री यूआरआई के id हिस्से के साथ. क्लास Uri और Uri.Builder में मौजूदा पार्स करने के लिए सुविधा विधियां शामिल हैं Uri ऑब्जेक्ट और नए ऑब्जेक्ट बनाना.

ContentProvider क्लास लागू करें

ContentProvider इंस्टेंस, ऐक्सेस मैनेज करता है अन्य ऐप्लिकेशन के अनुरोधों को हैंडल करके, डेटा के स्ट्रक्चर्ड सेट में बदल दिया जाता है. सभी फ़ॉर्म आख़िरकार, ContentResolver को कॉल किया जाता है, जो इसके बाद लोगों को ContentProvider का तरीका इस्तेमाल करके ऐक्सेस पाएं.

ज़रूरी तरीके

ऐब्स्ट्रैक्ट क्लास ContentProvider में ऐसे छह ऐब्सट्रैक्ट तरीकों के बारे में बताया गया है जो जिसे अपने कंक्रीट सब-क्लास के हिस्से के तौर पर लागू किया जाता है. इन सभी तरीकों को छोड़कर onCreate() को क्लाइंट ऐप्लिकेशन से कॉल किया गया है जो आपके कॉन्टेंट प्रोवाइडर को ऐक्सेस करने की कोशिश कर रहा है.

query()
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सेवा देने वाली कंपनी से डेटा वापस पाएं. टेबल को चुनने के लिए, आर्ग्युमेंट का इस्तेमाल करें क्वेरी, दी जाने वाली पंक्तियों और कॉलम, और नतीजे को क्रम से लगाने का तरीका. डेटा को Cursor ऑब्जेक्ट के तौर पर दिखाएं.
insert()
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सेवा देने वाली कंपनी के नाम में एक नई पंक्ति जोड़ें. आर्ग्युमेंट का इस्तेमाल करके डेस्टिनेशन टेबल और कॉलम की वैल्यू पाने के लिए. इस नई डाली गई पंक्ति.
update()
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अपने प्रोवाइडर में मौजूदा पंक्तियों को अपडेट करें. टेबल और पंक्तियां चुनने के लिए, आर्ग्युमेंट का इस्तेमाल करें का इस्तेमाल करें. अपडेट की गई लाइनों की संख्या दिखाता है.
delete()
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अपने प्रोवाइडर से पंक्तियां मिटाएं. टेबल और पंक्तियां चुनने के लिए आर्ग्युमेंट का इस्तेमाल करें मिटाएं. मिटाई गई पंक्तियों की संख्या दिखाता है.
getType()
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है कॉन्टेंट यूआरआई से जुड़ा MIME टाइप दें. इस तरीके के बारे में ज़्यादा जानकारी यहां दी गई है कॉन्टेंट देने वाले MIME टाइप लागू करें सेक्शन में दी गई जानकारी देखें.
onCreate()
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है प्रोवाइडर बनाने की प्रक्रिया शुरू करें. Android सिस्टम, इस तरीके को कॉल करने के तुरंत बाद आपकी कंपनी बनाती है. आपको सेवा देने वाली कंपनी तब तक नहीं बनती है, जब तक ContentResolver ऑब्जेक्ट उसे ऐक्सेस करने की कोशिश करता है.

इन तरीकों में एक जैसे नाम वाले हस्ताक्षर हैं ContentResolver तरीके.

इन तरीकों को लागू करने के दौरान, आपको इन बातों का ध्यान रखना होगा:

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

क्वेरी() तरीका लागू करें

कॉन्टेंट बनाने ContentProvider.query() तरीके से Cursor ऑब्जेक्ट दिखना चाहिए या अगर यह है, तो विफल होता है, तो Exception फेंकें. अगर SQLite डेटाबेस का इस्तेमाल अपने डेटा के तौर पर किया जा रहा है को वापस नहीं करते हैं, तो आप इनमें से किसी एकCursor SQLiteDatabase क्लास के query() तरीके.

अगर क्वेरी किसी भी पंक्ति से मैच नहीं करती है, तो Cursor दिखाएं उदाहरण के लिए, जिसके getCount() तरीके से 0 वैल्यू मिलती है. null सिर्फ़ तब दिखाएं, जब क्वेरी प्रोसेस के दौरान कोई अंदरूनी गड़बड़ी हुई हो.

अगर डेटा स्टोरेज के तौर पर SQLite डेटाबेस का इस्तेमाल नहीं किया जा रहा है, तो किसी एक कंक्रीट सब-क्लास का इस्तेमाल करें Cursor पेज चुने जा सकते हैं. उदाहरण के लिए, MatrixCursor क्लास कर्सर को लागू करता है. इसमें हर पंक्ति, Object इंस्टेंस की अरे होती है. इस क्लास से, नई पंक्ति जोड़ने के लिए addRow() का इस्तेमाल करें.

Android सिस्टम ऐसा होना चाहिए जो Exception को सही से काम कर सके हर तरह की प्रोसेस के बारे में जानते हैं. Android, काम के इन अपवादों के मामले में ऐसा कर सकता है क्वेरी की गड़बड़ियों से निपटने में:

Insert() तरीके को लागू करना

insert() तरीका ContentValues के मानों का उपयोग करके, उचित तालिका में नई पंक्ति जोड़ें तर्क है. अगर कॉलम का नाम ContentValues आर्ग्युमेंट में नहीं है, तो हो सकता है कि आप अपने प्रोवाइडर कोड या अपने डेटाबेस में इसके लिए डिफ़ॉल्ट वैल्यू देना चाहें स्कीमा चुनें.

यह तरीका नई लाइन के लिए कॉन्टेंट यूआरआई दिखाता है. इसे बनाने के लिए, नया जोड़ें पंक्ति की प्राथमिक कुंजी, आमतौर पर _ID मान को, तालिका के सामग्री यूआरआई के लिए, इनका इस्तेमाल करके withAppendedId().

Delete() वाला तरीका लागू करें

delete() तरीका को आपके डेटा स्टोरेज से पंक्तियां मिटाने की ज़रूरत नहीं होती. सिंक अडैप्टर का इस्तेमाल करने पर अगर आप सेवा देने वाली कंपनी के साथ हैं, तो मिटाई गई पंक्ति को मार्क करें "मिटाओ" के साथ फ़्लैग करें. सिंक अडैप्टर यह कर सकता है मिटाई गई पंक्तियों की जांच करें और सेवा देने वाली कंपनी से मिटाने से पहले उन्हें सर्वर से हटा दें.

updated() तरीके को लागू करें

update() वाला तरीका, उसी ContentValues आर्ग्युमेंट को इस्तेमाल करता है जिसका इस्तेमाल किया गया है insert() और selection और selectionArgs आर्ग्युमेंट का इस्तेमाल किया गया delete() और ContentProvider.query(). इससे, इन तरीकों के बीच कोड का फिर से इस्तेमाल किया जा सकता है.

onCreate() तरीका लागू करें

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

नीचे दिए गए दो स्निपेट, एक-दूसरे से जुड़े ContentProvider.onCreate() और Room.databaseBuilder(). पहला स्निपेट में, ContentProvider.onCreate() जहां डेटाबेस ऑब्जेक्ट बनाया जाता है और डेटा ऐक्सेस ऑब्जेक्ट को हैंडल करने के साथ ही इन्हें बनाया जाता है:

Kotlin

// Defines the database name
private const val DBNAME = "mydb"
...
class ExampleProvider : ContentProvider() {

    // Defines a handle to the Room database
    private lateinit var appDatabase: AppDatabase

    // Defines a Data Access Object to perform the database operations
    private var userDao: UserDao? = null

    override fun onCreate(): Boolean {

        // Creates a new database object
        appDatabase = Room.databaseBuilder(context, AppDatabase::class.java, DBNAME).build()

        // Gets a Data Access Object to perform the database operations
        userDao = appDatabase.userDao

        return true
    }
    ...
    // Implements the provider's insert method
    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        // Insert code here to determine which DAO to use when inserting data, handle error conditions, etc.
    }
}

Java

public class ExampleProvider extends ContentProvider

    // Defines a handle to the Room database
    private AppDatabase appDatabase;

    // Defines a Data Access Object to perform the database operations
    private UserDao userDao;

    // Defines the database name
    private static final String DBNAME = "mydb";

    public boolean onCreate() {

        // Creates a new database object
        appDatabase = Room.databaseBuilder(getContext(), AppDatabase.class, DBNAME).build();

        // Gets a Data Access Object to perform the database operations
        userDao = appDatabase.getUserDao();

        return true;
    }
    ...
    // Implements the provider's insert method
    public Cursor insert(Uri uri, ContentValues values) {
        // Insert code here to determine which DAO to use when inserting data, handle error conditions, etc.
    }
}

ContentProvider MIME टाइप लागू करें

ContentProvider क्लास में MIME टाइप के लिए दो तरीके होते हैं:

getType()
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यह उन ज़रूरी तरीकों में से एक है जिन्हें आपने सेवा देने वाली किसी भी कंपनी के लिए लागू किया है.
getStreamTypes()
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अगर सेवा देने वाली कंपनी, फ़ाइलें उपलब्ध कराती है, तो आपसे उम्मीद की जाती है कि यह तरीका लागू किया जाएगा.

टेबल के लिए MIME टाइप

getType() तरीका नतीजे के तौर पर MIME फ़ॉर्मैट में String, जो कॉन्टेंट से मिले डेटा के टाइप की जानकारी देता है यूआरआई आर्ग्युमेंट. Uri आर्ग्युमेंट किसी खास यूआरआई के बजाय पैटर्न हो सकता है. इस मामले में, पैटर्न.

टेक्स्ट, एचटीएमएल या JPEG जैसे सामान्य डेटा के लिए, getType() मानक नतीजे देता है उस डेटा का MIME प्रकार. इन मानक प्रकारों की पूरी सूची यहां उपलब्ध है: आईएएनए एमआईएमई मीडिया टाइप वेबसाइट.

टेबल डेटा की किसी पंक्ति या लाइन पर ले जाने वाले कॉन्टेंट यूआरआई के लिए, getType() का शुल्क देकर, प्रॉडक्ट को लौटाया जा सकता है Android के वेंडर के लिए बने MIME फ़ॉर्मैट में MIME टाइप:

  • टाइप का हिस्सा: vnd
  • सब-टाइप का हिस्सा:
    • अगर यूआरआई पैटर्न किसी एक पंक्ति के लिए है: android.cursor.item/
    • अगर यूआरआई पैटर्न एक से ज़्यादा पंक्तियों के लिए है: android.cursor.dir/
  • सेवा देने वाली कंपनी के हिसाब से खास पार्ट: vnd.<name>.<type>

    आप <name> और <type> सप्लाई करते हैं. <name> की वैल्यू, दुनिया भर में यूनीक है, और <type> वैल्यू, संबंधित यूआरआई के हिसाब से यूनीक है पैटर्न. <name> के लिए अच्छा विकल्प, आपकी कंपनी का नाम है या आपके ऐप् लिकेशन के Android पैकेज नाम का कुछ भाग. एक अच्छा विकल्प <type> एक स्ट्रिंग है, जो यूआरआई.

उदाहरण के लिए, अगर सेवा देने वाली कंपनी को com.example.app.provider पर क्लिक करता है और table1, table1 की एक से ज़्यादा पंक्तियों का MIME टाइप इस तरह है:

vnd.android.cursor.dir/vnd.com.example.provider.table1

table1 की एक लाइन के लिए, MIME टाइप इस तरह है:

vnd.android.cursor.item/vnd.com.example.provider.table1

फ़ाइलों के लिए MIME टाइप

अगर सेवा देने वाली कंपनी, फ़ाइलें ऑफ़र करती है, तो getStreamTypes(). यह तरीका, आपको सेवा देने वाली कंपनी की फ़ाइलों के लिए, MIME टाइप के String कलेक्शन दिखाता है दिए गए कॉन्टेंट यूआरआई के हिसाब से नतीजे दे सकता है. MIME टाइप के हिसाब से, आपके पास उपलब्ध MIME टाइप को फ़िल्टर करें फ़िल्टर तर्क का इस्तेमाल करें, ताकि आप सिर्फ़ वे MIME टाइप दिखाएं जिन्हें क्लाइंट मैनेज करना चाहता है.

उदाहरण के लिए, किसी ऐसी कंपनी पर विचार करें जो फ़ोटो इमेज को फ़ाइलों के रूप में JPG, PNG और GIF फ़ॉर्मैट. अगर कोई ऐप्लिकेशन ऐसी चीज़ के लिए ContentResolver.getStreamTypes() को फ़िल्टर स्ट्रिंग image/* के साथ कॉल करता है एक "इमेज" है, तो ContentProvider.getStreamTypes() तरीका, अरे को नतीजे के तौर पर दिखाता है:

{ "image/jpeg", "image/png", "image/gif"}

अगर ऐप्लिकेशन सिर्फ़ JPG फ़ाइलों में दिलचस्पी रखता है, तो यह कॉल कर सकता है फ़िल्टर स्ट्रिंग *\/jpeg वाला ContentResolver.getStreamTypes(), और getStreamTypes() के ज़रिए लौटाया गया:

{"image/jpeg"}

अगर सेवा देने वाली कंपनी, फ़िल्टर स्ट्रिंग में अनुरोध किए गए किसी भी तरह के MIME टाइप नहीं देती है, getStreamTypes() अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है null दिखाता है.

कॉन्ट्रैक्ट क्लास लागू करना

कॉन्ट्रैक्ट क्लास एक public final क्लास होती है, जिसमें डेटा देने वाली कंपनी से जुड़े यूआरआई, कॉलम के नाम, MIME टाइप, और अन्य मेटा-डेटा. क्लास सेवा देने वाली कंपनी और अन्य ऐप्लिकेशन के बीच एक अनुबंध बनाता है. इसके लिए, यह पक्का किया जाता है कि कंपनी सही तरीके से ऐक्सेस किया जा सकता है, भले ही यूआरआई, कॉलम के नामों, और आगे भी इसी तरह.

कॉन्ट्रैक्ट क्लास से डेवलपर को भी मदद मिलती है, क्योंकि आम तौर पर इसमें अपने कॉन्सटेंट के नाम याद रखने वाले शब्द होते हैं, इसलिए, इस बात की संभावना कम होती है कि डेवलपर कॉलम के नामों या यूआरआई के लिए गलत वैल्यू का इस्तेमाल करेंगे. क्योंकि यह क्लास है, तो इसमें Javadoc दस्तावेज़ हो सकता है. इंटिग्रेटेड डेवलपमेंट एनवायरमेंट, जैसे कि Android Studio, कॉन्ट्रैक्ट क्लास से कॉन्सटैंट नाम को अपने-आप पूरा कर सकता है और स्थिरांक.

डेवलपर आपके ऐप्लिकेशन से, कॉन्ट्रैक्ट क्लास की क्लास फ़ाइल ऐक्सेस नहीं कर सकते. हालांकि, वे ये काम कर सकते हैं आपकी उपलब्ध कराई गई JAR फ़ाइल से, उसे अपने ऐप्लिकेशन में स्टैटिक तरीके से कंपाइल करें.

ContactsContract क्लास और इसकी नेस्ट की गई क्लास इनके उदाहरण हैं कॉन्ट्रैक्ट क्लास.

कॉन्टेंट देने वाले को दी गई अनुमतियां लागू करना

Android सिस्टम के सभी पहलुओं की अनुमतियों और ऐक्सेस के बारे में यहां बताया गया है सुरक्षा से जुड़ी सलाह. डेटा और फ़ाइल स्टोरेज की खास जानकारी भी यह अलग-अलग तरह के स्टोरेज की सुरक्षा और अनुमतियों के बारे में बताती है. कम शब्दों में, यहां अहम बातें बताई गई हैं:

  • डिफ़ॉल्ट रूप से, डिवाइस के स्टोरेज में सेव की गई डेटा फ़ाइलें, डिफ़ॉल्ट रूप से निजी रहती हैं ऐप्लिकेशन और कंपनी उपलब्ध कराता है.
  • आपके बनाए गए SQLiteDatabase डेटाबेस आपके लिए निजी होते हैं ऐप्लिकेशन और कंपनी उपलब्ध कराता है.
  • डिफ़ॉल्ट रूप से, बाहरी स्टोरेज में सेव की जाने वाली डेटा फ़ाइलें सार्वजनिक होती हैं और दुनिया में पढ़ने लायक. फ़ाइलों के ऐक्सेस पर पाबंदी लगाने के लिए, कॉन्टेंट देने वाले का इस्तेमाल नहीं किया जा सकता बाहरी मेमोरी का उपयोग कर सकते हैं, क्योंकि अन्य ऐप्लिकेशन उन्हें पढ़ने और लिखने के लिए अन्य API कॉल का उपयोग कर सकते हैं.
  • इस तरीके में, आपके डिवाइस के इंटरनल स्टोरेज पर फ़ाइलें या SQLite डेटाबेस खोलने या बनाने का तरीका बताया जाता है स्टोरेज, अन्य सभी ऐप्लिकेशन को पढ़ने और उनमें बदलाव करने का ऐक्सेस दे सकता है. अगर आपको को उपलब्ध कराने वाले के डेटा स्टोर करने की जगह के रूप में किसी इंटरनल फ़ाइल या डेटाबेस का इस्तेमाल करना चाहिए और आप उसे "दुनिया में पढ़ने लायक" या "दुनिया के लिखने लायक" ऐक्सेस दें, जो अनुमतियां आपने अपने प्रोवाइडर के लिए सेट की हैं इसका मेनिफ़ेस्ट आपके डेटा की सुरक्षा नहीं करता. इसमें फ़ाइलों और डेटाबेस के लिए डिफ़ॉल्ट ऐक्सेस डिवाइस का स्टोरेज "निजी" है; इसे न बदलें.

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

अनुमतियां लागू करना

डिफ़ॉल्ट रूप से, सभी ऐप्लिकेशन आपकी सेवा देने वाली कंपनी की जानकारी को पढ़ सकते हैं या उसे लिख सकते हैं. भले ही, ऐप्लिकेशन में मौजूद डेटा निजी है, क्योंकि डिफ़ॉल्ट रूप से आपको सेवा देने वाली कंपनी के पास अनुमतियां सेट नहीं हैं. इसे बदलने के लिए, विशेषताओं या चाइल्ड का उपयोग करके, अपनी मेनिफ़ेस्ट फ़ाइल में अपने प्रोवाइडर के लिए अनुमतियां सेट करें <provider> एलिमेंट के एलिमेंट. आपके पास सेवा देने वाली पूरी कंपनी पर लागू होने वाली अनुमतियां सेट करने का विकल्प होता है. कुछ टेबल, कुछ रिकॉर्ड या तीनों में से कोई भी एक प्रॉपर्टी हो सकती है.

आप अपने प्रोवाइडर के लिए एक या एक से ज़्यादा अनुमतियों के बारे में बताते हैं आपकी मेनिफ़ेस्ट फ़ाइल में <permission> एलिमेंट शामिल हैं. आसानी से अनुमति नहीं है, तो आपके एपीआई के लिए Java-स्टाइल स्कोपिंग का इस्तेमाल करें android:name एट्रिब्यूट की वैल्यू सबमिट करें. उदाहरण के लिए, पढ़ने की अनुमति को नाम दें com.example.app.provider.permission.READ_PROVIDER.

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

कॉन्टेंट को पढ़ने और लिखने के लिए, सेवा देने वाली कंपनी के लेवल पर एक बार अनुमति
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सेवा देने वाली पूरी कंपनी के लिए, पढ़ने और लिखने, दोनों को कंट्रोल करने वाली एक अनुमति. यह अनुमति दी गई है इसकी android:permission एट्रिब्यूट की वैल्यू के साथ <provider> एलिमेंट.
लिखने और पढ़ने की सेवा देने वाली कंपनी के लेवल की अनुमतियों को अलग करना
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सेवा देने वाली पूरी कंपनी के लिए, पढ़ने और लिखने की अनुमति. आप उन्हें तय करें android:readPermission और android:writePermission एट्रिब्यूट <provider> एलिमेंट. इन्हें इस प्रक्रिया के लिए ज़रूरी अनुमति से ज़्यादा अहमियत दी जाती है android:permission.
पाथ-लेवल की अनुमति
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है आपके प्रोवाइडर में कॉन्टेंट यूआरआई के लिए, पढ़ने, लिखने या पढ़ने/लिखने की अनुमति. आप तय करें प्रत्येक यूआरआई जिन्हें आप <path-permission> चाइल्ड एलिमेंट <provider> एलिमेंट. अपने तय किए गए हर कॉन्टेंट यूआरआई के लिए, पढ़ने/लिखने की अनुमति, पढ़ने की अनुमति, लिखने की अनुमति या तीनों. पढ़ना और पढ़ने/लिखने की अनुमति के मुकाबले, लिखने की अनुमतियों को प्राथमिकता दी जाती है. साथ ही, पाथ-लेवल पर सेवा देने वाली कंपनी के स्तर की अनुमतियों के मुकाबले अनुमति को प्राथमिकता दी जाती है.
कुछ समय के लिए अनुमति
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अनुमति का ऐसा लेवल जो किसी ऐप्लिकेशन को कुछ समय के लिए ऐक्सेस देता है. भले ही, ऐप्लिकेशन के पास सामान्य रूप से ज़रूरी अनुमतियां नहीं हैं. अस्थायी ऐक्सेस करने की सुविधा, ऐप्लिकेशन को मांगी जाने वाली अनुमतियों की संख्या कम कर देती है मेनिफ़ेस्ट फ़ाइल फ़ॉर्मैट में. जब आप कुछ समय के लिए दी जाने वाली अनुमतियों को चालू करते हैं, तो सिर्फ़ वे ऐप्लिकेशन जिन्हें इसकी ज़रूरत होती है स्थायी अनुमतियां वे होती हैं, जो आपका डेटा.

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

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

कुछ समय के लिए दी जाने वाली अनुमतियां चालू करने के लिए, android:grantUriPermissions एट्रिब्यूट <provider> एलिमेंट जोड़ें या एक या उससे ज़्यादा एलिमेंट जोड़ें आपके <grant-uri-permission> चाइल्ड एलिमेंट <provider> एलिमेंट. कॉल करें Context.revokeUriPermission() जब भी आप अपने कंपनी.

एट्रिब्यूट की वैल्यू से यह तय होता है कि सेवा देने वाली कंपनी के कितने हिस्से को ऐक्सेस किया जा सकता है. अगर एट्रिब्यूट को "true" पर सेट किया जाता है, तो सिस्टम कुछ समय के लिए अनुमति देता है को ऐक्सेस करने की अनुमति दें. करने की अनुमति देता है.

अगर इस फ़्लैग को "false" पर सेट किया जाता है, तो जोड़ें आपके <grant-uri-permission> चाइल्ड एलिमेंट <provider> एलिमेंट. हर चाइल्ड एलिमेंट, कॉन्टेंट यूआरआई की जानकारी देता है या वे यूआरआई जिनके लिए कुछ समय का ऐक्सेस दिया गया है.

किसी ऐप्लिकेशन को कुछ समय के लिए ऐक्सेस देने के लिए, इंटेंट में यह शामिल होना चाहिए FLAG_GRANT_READ_URI_PERMISSION फ़्लैग, FLAG_GRANT_WRITE_URI_PERMISSION फ़्लैग या दोनों. ये setFlags() तरीके का इस्तेमाल करके सेट किए गए हैं.

अगर android:grantUriPermissions एट्रिब्यूट मौजूद नहीं है, तो उसे "false".

<provider> एलिमेंट

Activity और Service कॉम्पोनेंट की तरह, ContentProvider की एक सब-क्लास को मेनिफ़ेस्ट फ़ाइल में <provider> एलिमेंट. Android सिस्टम को नीचे दी गई जानकारी इनसे मिलती है: एलिमेंट:

अथॉरिटी (android:authorities)
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सिंबल वाले ऐसे नाम जो सिस्टम में सेवा देने वाली पूरी कंपनी की पहचान करते हैं. यह एट्रिब्यूट के बारे में ज़्यादा जानकारी यहां दी गई है कॉन्टेंट यूआरआई सेक्शन.
सेवा देने वाली कंपनी की क्लास का नाम (android:name)
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ContentProvider को लागू करने वाली क्लास. यह क्लास ज़्यादा जानकारी के लिए, ContentProvider क्लास सेक्शन लागू करें.
अनुमतियां
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ऐसे एट्रिब्यूट जो उन अनुमतियों के बारे में बताते हैं जो ऐक्सेस करने के लिए दूसरे ऐप्लिकेशन के पास होनी चाहिए कंपनी का डेटा:
  • android:grantUriPermissions: अस्थायी तौर पर दी जाने वाली अनुमति से जुड़ा फ़्लैग
  • android:permission: सेवा देने वाली एक ही कंपनी के लिए, पढ़ने/लिखने की अनुमति
  • android:readPermission: सेवा देने वाली कंपनी को पढ़ने की अनुमति
  • android:writePermission: सेवा देने वाली कंपनी के हिसाब से लिखने की अनुमति

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

स्टार्टअप और कंट्रोल एट्रिब्यूट
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ये एट्रिब्यूट तय करते हैं कि Android सिस्टम, सेवा देने वाली कंपनी को कैसे और कब शुरू करता है, प्रोसेस की विशेषताएं, और अन्य रनटाइम सेटिंग:
  • android:enabled: सेवा देने वाली कंपनी को सिस्टम शुरू करने की अनुमति देने वाला फ़्लैग करें
  • android:exported: अन्य ऐप्लिकेशन को इस कंपनी का इस्तेमाल करने की अनुमति देने वाला फ़्लैग करें
  • android:initOrder: वह क्रम जिसमें यह कंपनी शुरू की गई, सेवा देने वाली दूसरी कंपनियों की तुलना में, एक ही प्रक्रिया में
  • android:multiProcess: सेवा देने वाली कंपनी को सिस्टम शुरू करने की अनुमति देने वाला फ़्लैग करें उसी प्रक्रिया में जो कॉल क्लाइंट को
  • android:process: उस प्रोसेस का नाम जिसमें सेवा देने वाली कंपनी चलाती है
  • android:syncable: यह बताता है कि सेवा देने वाले का डेटा सर्वर पर डेटा के साथ सिंक किया गया

ये एट्रिब्यूट, आपकी गाइड <provider> एलिमेंट.

जानकारी देने वाले एट्रिब्यूट
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सेवा देने वाली कंपनी के लिए एक वैकल्पिक आइकॉन और लेबल:
  • android:icon: ड्रॉ करने लायक संसाधन, जिसमें प्रोवाइडर का आइकॉन होता है. यह आइकॉन, सेवा देने वाली कंपनी के लेबल के बगल में मौजूद ऐप्लिकेशन की सूची में दिखता है सेटिंग > ऐप्लिकेशन > सभी.
  • android:label: सेवा देने वाली कंपनी के बारे में जानकारी देने वाला लेबल डेटा या दोनों में से कुछ भी हो सकता है. लेबल इसमें ऐप्लिकेशन की सूची में दिखाई देता है सेटिंग > ऐप्लिकेशन > सभी.

ये एट्रिब्यूट, आपकी गाइड <provider> एलिमेंट.

ध्यान दें: अगर आपको Android 11 या इसके बाद वाले वर्शन को टारगेट करना है, तो पैकेज के दिखने की जानकारी से जुड़े दस्तावेज़ का इस्तेमाल करें.

इंटेंट और डेटा ऐक्सेस

ऐप्लिकेशन किसी Intent से, कॉन्टेंट देने वाले किसी व्यक्ति या कंपनी को सीधे तौर पर ऐक्सेस नहीं कर सकते. ऐप्लिकेशन, ContentResolver में से किसी भी तरीके को कॉल नहीं करता या ContentProvider. इसके बजाय, यह एक इंटेंट भेजता है जिससे एक गतिविधि शुरू होती है, जो अक्सर सेवा देने वाली कंपनी के ऐप्लिकेशन का हिस्सा होती है. डेस्टिनेशन की गतिविधि, इसका कंट्रोल है इसके यूज़र इंटरफ़ेस (यूआई) में डेटा वापस पाने और दिखाने की सुविधा.

इंटेंट में कार्रवाई के आधार पर, डेस्टिनेशन गतिविधि से भी उपयोगकर्ता को प्रोवाइडर के डेटा में बदलाव करने का प्रॉम्प्ट मिल सकता है. किसी इंटेंट में "अतिरिक्त" भी हो सकते हैं वह डेटा जिसे डेस्टिनेशन गतिविधि में दिखाया जाता है डालें. इसके बाद, उपयोगकर्ता इस डेटा का इस्तेमाल करके, डेटा है.

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

अगर आप चाहते हैं कि डेवलपर इंटेंट ऐक्सेस का इस्तेमाल करें, तो उसका अच्छी तरह से दस्तावेज़ बनाना न भूलें. यह बताएं कि अपने ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करके इंटेंट ऐक्सेस करना, डेटा को उनके कोड से बदल सकते हैं.

आने वाले किसी ऐसे इंटेंट को मैनेज करना जो आपके प्रोवाइडर के डेटा में बदलाव करना चाहता है. अन्य इंटेंट को हैंडल करने में. इंटेंट इंटेंट और इंटेंट फ़िल्टर.

इससे जुड़ी अतिरिक्त जानकारी के लिए, इसे देखें: कैलेंडर की सेवा देने वाली कंपनी की खास जानकारी.