Android 4.0 के लिए API

एपीआई लेवल: 14

Android 4.0 (ICE_CREAM_SANDWICH) एक मुख्य प्लैटफ़ॉर्म रिलीज़ है, जिसमें लोगों और ऐप्लिकेशन के लिए कई तरह की नई सुविधाएं जोड़ी गई हैं डेवलपर. यहां बताई गई सभी नई सुविधाओं और एपीआई के अलावा, Android 4.0 एक अहम प्लैटफ़ॉर्म रिलीज़ है. इसकी वजह यह है कि इसमें Android 3.x से, एपीआई और होलोग्राफ़िक थीम का बड़ा सेट छोटी स्क्रीन पर उपलब्ध कराया गया है. ऐप्लिकेशन डेवलपर के तौर पर, अब आपके पास एक ही प्लैटफ़ॉर्म और यूनिफ़ाइड एपीआई फ़्रेमवर्क है की सहायता से आप अपने ऐप्लिकेशन को ऐसे एकल APK से विकसित और प्रकाशित कर सकते है जो हैंडसेट, टैबलेट वगैरह के लिए, ऑप्टिमाइज़ किया गया उपयोगकर्ता अनुभव देता है, जब Android—Android 4.0 (एपीआई लेवल 14) या उसके बाद का वर्शन.

डेवलपर के लिए, Android 4.0 प्लैटफ़ॉर्म, Android SDK टूल के लिए डाउनलोड किए जा सकने वाले कॉम्पोनेंट के तौर पर उपलब्ध है. डाउनलोड किए जा सकने वाले प्लैटफ़ॉर्म में, Android लाइब्रेरी और सिस्टम इमेज के साथ-साथ, इम्यूलेटर स्किन का एक सेट और अन्य चीज़ें शामिल होती हैं. Android 4.0 के लिए ऐप्लिकेशन डेवलप करने या टेस्ट करने के लिए, Android SDK मैनेजर का इस्तेमाल करके, अपने SDK टूल में प्लैटफ़ॉर्म डाउनलोड करें.

एपीआई की खास जानकारी

नीचे दिए गए सेक्शन में, Android 4.0 में नए एपीआई के बारे में तकनीकी जानकारी दी गई है.

Contacts Provider में सोशल मीडिया एपीआई

ContactsContract की सेवा देने वाली कंपनी ने संपर्क एपीआई को तय किया है डिवाइस के मालिक के लिए निजी प्रोफ़ाइल जैसी नई सामाजिक सुविधाओं का इस्तेमाल करने के लिए तैयार किया गया है और उपयोगकर्ताओं के लिए सोशल नेटवर्क पर अलग-अलग संपर्कों को आमंत्रित करने की क्षमता डिवाइस.

उपयोगकर्ता प्रोफ़ाइल

Android में अब एक ऐसी निजी प्रोफ़ाइल शामिल की गई है जो डिवाइस के मालिक की जानकारी देती है. ContactsContract.Profile टेबल. उपयोगकर्ता की पहचान बनाए रखने वाले सोशल ऐप्लिकेशन, ContactsContract.Profile में नई ContactsContract.RawContacts एंट्री बनाकर, उपयोगकर्ता की प्रोफ़ाइल के डेटा में योगदान दे सकते हैं. इसका मतलब है कि रॉ संपर्क, जो डिवाइस इस्तेमाल करने वाले व्यक्ति की जानकारी देते हैं पारंपरिक रॉ संपर्क टेबल में नहीं होने चाहिए, जिसे ContactsContract.RawContacts यूआरआई के मुताबिक तय किया गया है; इसके बजाय, आपको टेबल CONTENT_RAW_CONTACTS_URI में है. इसके बाद, इस टेबल में मौजूद रॉ कॉन्टैक्ट को "मेरी" लेबल वाली एक प्रोफ़ाइल में इकट्ठा किया जाता है. यह प्रोफ़ाइल, उपयोगकर्ता को दिखती है.

प्रोफ़ाइल के लिए एक नया अपरिष्कृत संपर्क जोड़ने के लिए यह आवश्यक है android.Manifest.permission#WRITE_PROFILE की अनुमति. इसी तरह, प्रोफ़ाइल से पढ़ने के लिए टेबल के लिए, आपको android.Manifest.permission#READ_PROFILE की अनुमति का अनुरोध करना होगा. हालांकि, ज़्यादातर ऐप्लिकेशन को उपयोगकर्ता की प्रोफ़ाइल पढ़ने की ज़रूरत नहीं होती. भले ही, वे प्रोफ़ाइल में डेटा जोड़ रहे हों. उपयोगकर्ता की प्रोफ़ाइल को पढ़ना एक संवेदनशील अनुमति है. आपको उम्मीद करनी चाहिए कि उपयोगकर्ता करने को लेकर दुविधा में न पड़ें.

न्योता भेजने का इंटेंट

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

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

बड़ी फ़ोटो

Android अब संपर्कों के लिए हाई रिज़ॉल्यूशन वाली फ़ोटो इस्तेमाल करने की सुविधा देता है. अब, जब आप किसी फ़ोटो को संपर्क रिकॉर्ड है, तो सिस्टम उसे 96x96 थंबनेल (जैसा कि पहले किया जा चुका है) और 256x256 "डिसप्ले फ़ोटो" एक नए फ़ाइल-आधारित फ़ोटो स्टोर में संग्रहित किया जाता है (यानी वे सटीक आयाम इसलिए, ऐसा हो सकता है कि आने वाले समय में सिस्टम का फ़ैसला बदल जाए. किसी संपर्क में बड़ी फ़ोटो जोड़ी जा सकती है. इसके लिए, डेटा लाइन के सामान्य PHOTO कॉलम में बड़ी फ़ोटो डालें. इसके बाद, सिस्टम उसे सही थंबनेल में प्रोसेस करेगा और फ़ोटो रिकॉर्ड दिखाएगा.

संपर्क के इस्तेमाल से जुड़ा सुझाव, राय या शिकायत

नए ContactsContract.DataUsageFeedback एपीआई की मदद से, यह ट्रैक किया जा सकता है कि उपयोगकर्ता लोगों से संपर्क करने के लिए, किसी खास तरीके का कितनी बार इस्तेमाल करता है. जैसे, उपयोगकर्ता हर फ़ोन नंबर या ईमेल पते का कितनी बार इस्तेमाल करता है. इस जानकारी से हर संपर्क की रैंकिंग को बेहतर बनाने में मदद मिलती है तरीका होता है और हर व्यक्ति से संपर्क करने के लिए बेहतर सुझाव देते हैं.

कैलेंडर की सेवा देने वाली कंपनी

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

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

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

  • CalendarContract.Calendars टेबल में कैलेंडर की खास जानकारी होती है जानकारी. इस टेबल की हर लाइन में, किसी एक कैलेंडर की जानकारी होती है. जैसे, नाम, रंग, सिंक करने की जानकारी वगैरह.
  • CalendarContract.Events टेबल में इवेंट की खास जानकारी होती है. इस टेबल की हर लाइन में किसी एक इवेंट की जानकारी होती है, जैसे कि इवेंट का टाइटल, जगह, शुरू होने का समय, खत्म होने का समय वगैरह. इवेंट एक बार या कई बार हो सकता है. मेहमानों, रिमाइंडर, और एक्सटेंडेड प्रॉपर्टी को अलग-अलग टेबल में सेव किया जाता है. इवेंट के _ID का इस्तेमाल करके, उन्हें इवेंट से लिंक करें.
  • CalendarContract.Instances टेबल में, किसी इवेंट के होने के समय की जानकारी होती है. इस टेबल की हर लाइन, किसी एक घटना के बारे में बताती है. एक बार होने वाले इवेंट के लिए, इंस्टेंस और इवेंट के बीच एक-एक मैपिंग होती है. बार-बार होने वाले इवेंट के लिए, कई पंक्तियां अपने-आप जनरेट होती हैं. ये पंक्तियां, उस इवेंट के कई बार होने के हिसाब से होती हैं.
  • CalendarContract.Attendees टेबल में, इवेंट में शामिल होने वाला व्यक्ति या मेहमान का न्योता होता है जानकारी. हर पंक्ति किसी इवेंट के एक मेहमान को दिखाती है. यह बताता है कि व्यक्ति है और व्यक्ति का जवाब.
  • CalendarContract.Reminders टेबल में सूचना/सूचना का डेटा होता है. हर पंक्ति किसी इवेंट के लिए एक सूचना दिखाती है. किसी इवेंट के लिए एक से ज़्यादा रिमाइंडर सेट किए जा सकते हैं. हर इवेंट के लिए रिमाइंडर की संख्या, MAX_REMINDERS में बताई गई होती है. इसे उस सिंक अडैप्टर सेट करता है जिसके पास उस कैलेंडर का मालिकाना हक होता है. रिमाइंडर, इवेंट शेड्यूल होने से पहले मिनटों की संख्या में तय किए जाते हैं. साथ ही, इनमें अलार्म का तरीका भी तय किया जाता है. जैसे, उपयोगकर्ता को रिमाइंडर देने के लिए सूचना, ईमेल या एसएमएस का इस्तेमाल करना.
  • CalendarContract.ExtendedProperties टेबल में, ओपेक डेटा फ़ील्ड हैं का इस्तेमाल करता है. सेवा देने वाली कंपनी, इस टेबल में मौजूद आइटम के लिए कोई कार्रवाई नहीं करती. हालांकि, जब उनसे जुड़े इवेंट मिटाए जाते हैं, तो उन्हें भी मिटा दिया जाता है.

Calendar की सेवा देने वाली कंपनी की मदद से, किसी उपयोगकर्ता का कैलेंडर डेटा ऐक्सेस करने के लिए, आपके ऐप्लिकेशन को READ_CALENDAR अनुमति (रीड ऐक्सेस के लिए) और WRITE_CALENDAR (लिखने का ऐक्सेस) का अनुरोध करना होगा.

इवेंट का मकसद

अगर आपको उपयोगकर्ता के कैलेंडर में कोई इवेंट जोड़ना है, तो Events.CONTENT_URI में तय किए गए डेटा के साथ ACTION_INSERT इंटेंट का इस्तेमाल करें. ऐसा करने पर, Calendar ऐप्लिकेशन में होने वाली ऐसी गतिविधि जिससे नए इवेंट बनाए जा सकते हैं. इंटेंट का इस्तेमाल करने के लिए किसी अनुमति है और आप निम्न अतिरिक्त चीज़ों के साथ इवेंट विवरण दर्ज कर सकते हैं:

  • Events.TITLE: इवेंट का नाम
  • CalendarContract.EXTRA_EVENT_BEGIN_TIME: इवेंट की शुरुआत का समय Epoch
  • CalendarContract.EXTRA_EVENT_END_TIME: इवेंट Epoch के लिए, मिलीसेकंड में खत्म होने का समय
  • Events.EVENT_LOCATION: इवेंट की जगह
  • Events.DESCRIPTION: इवेंट ब्यौरा
  • Intent.EXTRA_EMAIL: जिन लोगों को न्योता भेजना है उनके ईमेल पते
  • Events.RRULE: बार-बार होने वाला इवेंट के लिए नियम
  • Events.ACCESS_LEVEL: इवेंट निजी है या सार्वजनिक
  • Events.AVAILABILITY: इस इवेंट की समयावधि में दूसरे इवेंट एक ही समय पर शेड्यूल किए जा सकते हैं या नहीं

वॉइसमेल की सेवा देने वाली कंपनी

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

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

VoicemailContract क्लास, वॉइसमेल की सेवा देने वाली कंपनी के लिए कॉन्टेंट उपलब्ध कराने वाले व्यक्ति या कंपनी के बारे में बताती है. VoicemailContract.Voicemails और VoicemailContract.Status सब-क्लास में ऐसी टेबल मौजूद होती हैं जिनमें ऐप्लिकेशन ये काम कर सकते हैं डिवाइस पर स्टोरेज के लिए वॉइसमेल डेटा डालें. वॉइसमेल की सुविधा देने वाले ऐप्लिकेशन का उदाहरण देखने के लिए, वॉइसमेल की सुविधा देने वाले ऐप्लिकेशन का डेमो देखें.

मल्टीमीडिया

Android 4.0 में, फ़ोटो, वीडियो, और संगीत जैसे मीडिया के साथ इंटरैक्ट करने वाले ऐप्लिकेशन के लिए कई नए एपीआई जोड़े गए हैं.

मीडिया इफ़ेक्ट

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

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

  1. वे किसी GL_TEXTURE_2D बनावट चित्र से बंधे होने चाहिए
  2. इनमें कम से कम एक मिपमैप लेवल होना चाहिए

Effect ऑब्जेक्ट, सिंगल मीडिया इफ़ेक्ट के बारे में बताता है, जिसे लागू किया जा सकता है एक इमेज फ़्रेम होता है. Effect बनाने का बुनियादी वर्कफ़्लो यह है:

  1. अपने OpenGL ES 2.0 कॉन्टेक्स्ट से EffectContext.createWithCurrentGlContext() को कॉल करें.
  2. EffectContext.getFactory() को कॉल करने के लिए, रिटर्न किए गए EffectContext का इस्तेमाल करें. इससे EffectFactory का एक इंस्टेंस मिलता है.
  3. createEffect() पर कॉल करें, इसे पास करें @link android.media.effect.impactfact} से मिला इफ़ेक्ट का नाम. जैसे, EFFECT_FISHEYE या EFFECT_VIGNETTE.

किसी इफ़ेक्ट के पैरामीटर में बदलाव करने के लिए, setParameter() को कॉल करें. इसके बाद, पैरामीटर का नाम और पैरामीटर की वैल्यू पास करें. हर तरह का इफ़ेक्ट स्वीकार किया जाता है अलग-अलग पैरामीटर, जिन्हें इफ़ेक्ट के नाम के साथ दस्तावेज़ किया गया है. उदाहरण के लिए, EFFECT_FISHEYE मेंscale डिस्टॉर्शन.

किसी टेक्चर पर इफ़ेक्ट लागू करने के लिए, Effect पर apply() को कॉल करें. साथ ही, इनपुट टेक्चर, उसकी चौड़ाई और ऊंचाई, और आउटपुट टेक्चर को पास करें. इनपुट टेक्स्चर को GL_TEXTURE_2D टेक्स्चर इमेज से बंधा होना चाहिए. आम तौर पर, ऐसा glTexImage2D() फ़ंक्शन को कॉल करके किया जाता है. आप एक से ज़्यादा मिपमैप लेवल दे सकते हैं. अगर आउटपुट टेक्सचर को किसी टेक्सचर इमेज से बंधा नहीं गया है, तो यह इफ़ेक्ट के तौर पर GL_TEXTURE_2D और एक मिपमैप लेवल (0) के साथ अपने-आप बंध जाएगा. इसका साइज़, इनपुट के साइज़ के बराबर होगा.

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

रिमोट कंट्रोल क्लाइंट

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

अपने मीडिया प्लेयर के लिए रिमोट कंट्रोल क्लाइंट चालू करने के लिए, RemoteControlClient को उसके कंस्ट्रक्टर से इंस्टैंशिएट करें. इसके बाद, उसे ACTION_MEDIA_BUTTON को ब्रॉडकास्ट करने वाला PendingIntent दें. इंटेंट में, आपके ऐप्लिकेशन में मौजूद उस BroadcastReceiver कॉम्पोनेंट के बारे में भी साफ़ तौर पर बताया जाना चाहिए जो ACTION_MEDIA_BUTTON इवेंट को मैनेज करता है.

यह बताने के लिए कि आपका प्लेयर कौनसे मीडिया कंट्रोल इनपुट मैनेज कर सकता है, आपको अपने RemoteControlClient पर setTransportControlFlags() को कॉल करना होगा. साथ ही, FLAG_KEY_MEDIA_* फ़्लैग का एक सेट पास करना होगा, जैसे कि FLAG_KEY_MEDIA_PREVIOUS और FLAG_KEY_MEDIA_NEXT.

इसके बाद, आपको RemoteControlClient को MediaManager.registerRemoteControlClient() के पास पास करके, उसे रजिस्टर करना होगा. रजिस्टर होने के बाद, RemoteControlClient को इंस्टैंशिएट करते समय आपने जिस ब्रॉडकास्ट रिसीवर का एलान किया था उसे ACTION_MEDIA_BUTTON मिलेगा रिमोट कंट्रोल से कोई बटन दबाने पर इवेंट. आपको जो इंटेंट मिलता है उसमें दबाए गए मीडिया बटन के लिए KeyEvent शामिल होता है. इसे getParcelableExtra(Intent.EXTRA_KEY_EVENT) की मदद से इंटेंट से वापस पाया जा सकता है.

चल रहे मीडिया की जानकारी रिमोट कंट्रोल पर दिखाने के लिए, editMetaData() को कॉल करें और लौटाए गए मीडिया कॉन्टेंट में मेटाडेटा जोड़ें RemoteControlClient.MetadataEditor. आप मीडिया आर्टवर्क के लिए बिट मैप दे सकते हैं, अंकों वाली जानकारी, जैसे कि बीता हुआ समय और टेक्स्ट की जानकारी, जैसे कि ट्रैक का टाइटल. उपलब्ध कुंजियों के बारे में जानकारी के लिए, MediaMetadataRetriever में METADATA_KEY_* फ़्लैग देखें.

इसे लागू करने का सैंपल देखने के लिए, रैंडम म्यूज़िक प्लेयर देखें. यह डिवाइसों के साथ काम करने का ऐसा लॉजिक उपलब्ध कराता है जिससे Android 4.0 डिवाइसों पर रिमोट कंट्रोल क्लाइंट चालू हो जाता है. साथ ही, यह Android 2.1 तक के डिवाइसों के साथ भी काम करता है.

मीडिया प्लेयर

  • MediaPlayer से ऑनलाइन मीडिया स्ट्रीम करने के लिए, अब INTERNET की अनुमति लेनी होगी. अगर आप MediaPlayer का इस्तेमाल इन कामों के लिए करते हैं इंटरनेट से कॉन्टेंट चलाएं, तो INTERNET जोड़ना न भूलें मेनिफ़ेस्ट की अनुमति नहीं दी है या फिर Android पर मीडिया चलाने की सुविधा काम नहीं करेगी 4.0.
  • setSurface() की मदद से, Surface को सेट किया जा सकता है, ताकि वह वीडियो सिंक की तरह काम करे.
  • setDataSource() आपको इसकी अनुमति देता है अपने अनुरोध के साथ अतिरिक्त एचटीटीपी हेडर भेजें. ये एचटीटीपी(एस) लाइव स्ट्रीमिंग के लिए काम के हो सकते हैं
  • एचटीटीपी या एचटीटीपीएस से जुड़ी लाइव स्ट्रीमिंग अब सभी अनुरोधों के लिए एचटीटीपी कुकी का इस्तेमाल करती है

मीडिया प्रकार

Android 4.0 के लिए समर्थन जोड़ता है:

  • एचटीटीपी/एचटीटीपीएस लाइव स्ट्रीमिंग प्रोटोकॉल का वर्शन 3
  • ADTS रॉ AAC ऑडियो एन्कोडिंग
  • WebP इमेज
  • Matroska का वीडियो

ज़्यादा जानकारी के लिए, मदद करने वाला मीडिया पेज देखें फ़ॉर्मैट.

कैमरा

Camera क्लास में अब चेहरों का पता लगाने और उन्हें कंट्रोल करने के लिए एपीआई शामिल हैं फ़ोकस और मीटरिंग एरिया.

चेहरे की पहचान

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

अपने कैमरा ऐप्लिकेशन में चेहरों का पता लगाने के लिए, आपको setFaceDetectionListener() को कॉल करके Camera.FaceDetectionListener रजिस्टर करना होगा. इसके बाद, शुरू किया जा सकता है और startFaceDetection() पर कॉल करके चेहरों की पहचान करना शुरू करें.

जब सिस्टम कैमरे के फ़्रेम में एक या एक से ज़्यादा चेहरों का पता लगाता है, तो वह Camera.FaceDetectionListener के लागू होने पर onFaceDetection() कॉलबैक को कॉल करता है. इसमें Camera.Face ऑब्जेक्ट का कलेक्शन भी शामिल होता है.

Camera.Face क्लास का एक इंस्टेंस, इन विषयों के बारे में अलग-अलग जानकारी देता है पहचाने गए चेहरे की पहचान हो गई है. इसमें ये शामिल हैं:

  • ऐसा Rect जो कैमरे के मौजूदा फ़ील्ड ऑफ़ व्यू के हिसाब से, चेहरे की सीमाओं की जानकारी देता है
  • 1 से 100 के बीच का पूर्णांक. इससे पता चलता है कि ऑब्जेक्ट, ऑब्जेक्ट के बारे में कितना भरोसा करता है इंसान का चेहरा
  • यूनीक आईडी, ताकि आप एक से ज़्यादा चेहरों को ट्रैक कर सकें
  • Point की कई चीज़ें, जो बताती हैं कि आंखें और मुंह कहां पर हैं CANNOT TRANSLATE

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

फ़ोकस और मीटरिंग क्षेत्र

कैमरा ऐप्लिकेशन अब उन जगहों को कंट्रोल कर सकते हैं जिनका इस्तेमाल कैमरा फ़ोकस करने के लिए करता है. साथ ही, ऐप्लिकेशन व्हाइट बैलेंस और ऑटो एक्सपोज़र को मेज़र करने के लिए भी इन जगहों का इस्तेमाल कर सकते हैं. दोनों सुविधाएं, जानकारी देने के लिए नई Camera.Area क्लास का इस्तेमाल करती हैं कैमरे के मौजूदा व्यू का वह हिस्सा जिसका फ़ोकस या सीमित होना चाहिए. Camera.Area क्लास का एक इंस्टेंस, उस इलाके की सीमाओं को Rect और इलाके के वज़न के साथ तय करता है—जिससे उस इलाके की अहमियत का पता चलता है पूर्णांक के साथ अन्य क्षेत्रों की तुलना में—क्षेत्रफल.

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

फ़ोकस और मीटरिंग की जगह के बारे में बताने के लिए, बस setFocusAreas() या setMeteringAreas() को कॉल करें. हर एक Camera.Area ऑब्जेक्ट का List लेता है. यह उन एरिया के बारे में बताता है जिन पर विचार करना चाहिए का इस्तेमाल करें. उदाहरण के लिए, कोई ऐसी सुविधा लागू की जा सकती है जिससे उपयोगकर्ता, फ़ोकस एरिया को छूकर, झलक के उस हिस्से पर फ़ोकस किया जा सकता है जिसका अनुवाद Camera.Area ऑब्जेक्ट में किया जाता है. इसके बाद, कैमरे को सीन के उस हिस्से पर फ़ोकस करने का अनुरोध किया जाता है. उस जगह का फ़ोकस या एक्सपोज़र, उस जगह के सीन में बदलाव होने पर लगातार अपडेट होता रहेगा.

फ़ोटो के लिए लगातार ऑटो फ़ोकस

अब फ़ोटो खींचते समय, लगातार ऑटो फ़ोकस (सीएएफ़) की सुविधा चालू की जा सकती है. अपने कैमरा ऐप्लिकेशन में सीएफ़ चालू करने के लिए, FOCUS_MODE_CONTINUOUS_PICTURE को setFocusMode() पर पास करें. फ़ोटो लेने के लिए, autoFocus() को कॉल करें. आपके Camera.AutoFocusCallback को तुरंत कॉलबैक मिलता है, ताकि यह पता लगाया जा सके कि क्या फ़ोकस हासिल किया गया. कॉलबैक मिलने के बाद सीएफ़ को फिर से शुरू करने के लिए, आपको cancelAutoFocus() को कॉल करना होगा.

ध्यान दें: वीडियो रिकॉर्ड करते समय, लगातार ऑटो फ़ोकस की सुविधा भी काम करती है वीडियो में FOCUS_MODE_CONTINUOUS_VIDEO का इस्तेमाल किया गया, जो एपीआई लेवल 9 में जोड़ा गया.

कैमरे की अन्य सुविधाएं

  • वीडियो रिकॉर्ड करते समय, अब takePicture() को कॉल किया जा सकता है. इससे वीडियो सेशन में कोई रुकावट नहीं आएगी. साथ ही, फ़ोटो सेव की जा सकेगी. ऐसा करने से पहले, आपको isVideoSnapshotSupported() पर कॉल करके यह पक्का करना चाहिए कि आपका हार्डवेयर, इस सुविधा के साथ काम करता है या नहीं.
  • अब setAutoExposureLock() और setAutoWhiteBalanceLock() की मदद से, ऑटो एक्सपोज़र और व्हाइट बैलेंस को लॉक किया जा सकता है, ताकि इन्हें रोका जा सके इन प्रॉपर्टी में कोई बदलाव नहीं होगा.
  • अब कैमरे की झलक दिखाने की सुविधा चालू होने के दौरान, setDisplayOrientation() को कॉल किया जा सकता है. पहले, झलक देखने की प्रोसेस शुरू करने से पहले ही, स्क्रीन की दिशा बदली जा सकती थी. हालांकि, अब इसे किसी भी समय बदला जा सकता है.

कैमरे के ब्रॉडकास्ट इंटेंट

  • Camera.ACTION_NEW_PICTURE: इससे पता चलता है कि उपयोगकर्ता ने कोई नई फ़ोटो कैप्चर की है. पहले से मौजूद Camera ऐप्लिकेशन इसे शुरू करता है फ़ोटो कैप्चर होने के बाद ब्रॉडकास्ट करना. तीसरे पक्ष के कैमरा ऐप्लिकेशन को भी इस इंटेंट को ब्रॉडकास्ट करना चाहिए कम कर सकते हैं.
  • Camera.ACTION_NEW_VIDEO: इससे पता चलता है कि उपयोगकर्ता ने नया वीडियो कैप्चर किया है. पहले से मौजूद Camera ऐप्लिकेशन इसे शुरू करता है वीडियो रिकॉर्ड होने के बाद ब्रॉडकास्ट करना. तीसरे पक्ष के कैमरा ऐप्लिकेशन को भी इस इंटेंट को ब्रॉडकास्ट करना चाहिए को कम नहीं किया जा सकता.

Android Beam (एनएफ़सी की मदद से NDEF पुश)

'Android बीम' एक नई एनएफ़सी सुविधा है. इसकी मदद से, एक डिवाइस से दूसरे डिवाइस पर NDEF मैसेज भेजे जा सकते हैं किसी अन्य प्रोसेस (एक प्रोसेस को “NDEF पुश” के नाम से भी जाना जाता है). डेटा ट्रांसफ़र तब शुरू होता है, जब Android Beam की सुविधा वाले दो Android डिवाइस, एक-दूसरे के करीब (लगभग 4 सेंटीमीटर) हों. आम तौर पर, दोनों डिवाइसों के पीछे के हिस्से एक-दूसरे को छूते हों. एनडीएफ़ मैसेज में ऐसा कोई भी डेटा शामिल किया जा सकता है जिसे आपको डिवाइसों के बीच शेयर करना है. उदाहरण के लिए, लोग ऐप संपर्क शेयर करता है, YouTube वीडियो शेयर करता है और ब्राउज़र Android बीम का इस्तेमाल करके यूआरएल शेयर करता है.

Android Beam का इस्तेमाल करके, एक डिवाइस से दूसरे डिवाइस पर डेटा ट्रांसफ़र करने के लिए, आपको एक NdefMessage बनाना होगा. इसमें वह जानकारी शामिल होनी चाहिए जिसे आपको फ़ोरग्राउंड में अपनी गतिविधि के दौरान शेयर करना है. इसके बाद, आपको NdefMessage को सिस्टम में दो में से किसी एक में पास करना होगा तरीके:

  • गतिविधि के दौरान पुश करने के लिए एक NdefMessage तय करें:

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

  • Android बीम के शुरू होने पर पुश करने के लिए NdefMessage तय करें:

    NfcAdapter.CreateNdefMessageCallback लागू करें, जिसमें createNdefMessage() को लागू करना तरीका वह NdefMessage लौटाता है जिसे आप भेजना चाहते हैं. इसके बाद, NfcAdapter.CreateNdefMessageCallback लागू करने की प्रक्रिया को setNdefPushMessageCallback() पर पास करें.

    इस मामले में, जब आपकी गतिविधि फ़ोरग्राउंड में होने के दौरान, Android Beam किसी दूसरे डिवाइस पर चालू होता है, तो सिस्टम उस NdefMessage को वापस पाने के लिए createNdefMessage() को कॉल करता है जिसे आपको भेजना है. इससे आप NdefMessage को इस तरह परिभाषित कर सकते हैं कि वह 'Android बीम' के शुरू होने के बाद ही डिलीवर करे. ऐसा तब किया जा सकता है, जब कॉन्टेंट के मैसेज अलग-अलग हो सकता है. यह बदलाव गतिविधि के दौरान अलग-अलग हो सकता है.

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

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

अगर आपको अपने NdefMessage में यूआरआई शामिल करना है, तो अब स्ट्रिंग या Uri ऑब्जेक्ट के आधार पर नया NdefRecord बनाने के लिए, आसान तरीका createUri का इस्तेमाल किया जा सकता है. अगर यूआरआई हो एक विशेष फ़ॉर्मेट है जिसे आप चाहते हैं कि आपका ऐप्लिकेशन किसी Android बीम इवेंट के दौरान भी मिले, को आपकी गतिविधि के लिए एक ही यूआरआई स्कीम का इस्तेमाल करके इंटेंट फ़िल्टर बनाना चाहिए, ताकि NDEF का इनकमिंग मैसेज.

आपको “Android ऐप्लिकेशन रिकॉर्ड" अपने NdefMessage के साथ यह गारंटी देने के लिए कि आपका ऐप्लिकेशन आने वाले NDEF संदेश का प्रबंधन करता है, भले ही अन्य ऐप्लिकेशन फ़िल्टर. createApplicationRecord() को कॉल करके, अपने ऐप्लिकेशन के पैकेज का नाम डालकर, Android ऐप्लिकेशन का रिकॉर्ड बनाया जा सकता है. जब दूसरे डिवाइस को ऐप्लिकेशन रिकॉर्ड के साथ एनडीएफ़ मैसेज मिलता है और कई ऐप्लिकेशन में ऐसी गतिविधियां होती हैं जो तय किए गए इंटेंट को मैनेज करती हैं, तो सिस्टम हमेशा मैच करने वाले ऐप्लिकेशन रिकॉर्ड के आधार पर, आपके ऐप्लिकेशन में मौजूद गतिविधि को मैसेज डिलीवर करता है. अगर लक्ष्य डिवाइस में अभी आपका ऐप्लिकेशन इंस्टॉल नहीं है, तो सिस्टम, Google Play को लॉन्च करने और उपयोगकर्ता को तो उसे इंस्टॉल किया जा सकता है.

यदि आपका ऐप्लिकेशन NDEF पुश संदेश सेवा निष्पादित करने के लिए NFC API का उपयोग नहीं करता है, तो Android एक डिफ़ॉल्ट व्यवहार: जब आपका ऐप्लिकेशन किसी एक डिवाइस पर फ़ोरग्राउंड में होता है और Android बीम का अनुरोध किसी अन्य Android डिवाइस के साथ किया जाता है, तो दूसरे डिवाइस को Android ऐप्लिकेशन रिकॉर्ड, जिससे आपके ऐप्लिकेशन की पहचान होती है. अगर पाने वाले डिवाइस में ऐप्लिकेशन इंस्टॉल होता है, तो सिस्टम इसे लॉन्च करता है; अगर आपका ऐप्लिकेशन इंस्टॉल नहीं किया जाता है, तो Google Play इस ऐप्लिकेशन में खुलता है और उपयोगकर्ता को आपके ऐप्लिकेशन पर इंस्टॉल करने के लिए उस पर जाएं.

NFC की बुनियादी बातें डेवलपर गाइड में, Android Beam और NFC की अन्य सुविधाओं के बारे में ज़्यादा पढ़ा जा सकता है. कोड के कुछ उदाहरणों के लिए Android बीम का इस्तेमाल करके, Android बीम डेमो.

वाई-फ़ाई P2P

Android, अब Android से चलने वाले डिवाइसों और डिवाइस के दूसरे टाइप (Wi-Fi Alliance के Wi-Fi DirectTM का पालन करते हुए) सर्टिफ़िकेशन प्रोग्राम में हिस्सा लेने की सुविधा देती हैं. Android फ़्रेमवर्क, वाई-फ़ाई पी2पी एपीआई का एक सेट उपलब्ध कराता है. इसकी मदद से, वाई-फ़ाई पी2पी की सुविधा वाले अन्य डिवाइसों को ढूंढा और उनसे कनेक्ट किया जा सकता है. इसके बाद, ब्लूटूथ कनेक्शन की तुलना में ज़्यादा दूरी पर, तेज़ी से डेटा ट्रांसफ़र किया जा सकता है.

नए पैकेज, android.net.wifi.p2p में पीयर-टू-पीयर परफ़ॉर्म करने वाले सभी एपीआई शामिल हैं वाई-फ़ाई से कनेक्ट करें. आपको WifiP2pManager के साथ काम करना होगा. इसे पाने के लिए, getSystemService(WIFI_P2P_SERVICE) पर कॉल करें. WifiP2pManager में ऐसे एपीआई शामिल हैं जो आपको ये काम करने की अनुमति देते हैं:

  • initialize() पर कॉल करके P2P कनेक्शन के लिए अपना ऐप्लिकेशन शुरू करें
  • discoverPeers() पर कॉल करके, आस-पास मौजूद डिवाइसों के बारे में जानें
  • connect() को कॉल करके पी2पी कनेक्शन शुरू करना
  • अन्य डेटा

कई अन्य इंटरफ़ेस और क्लास भी ज़रूरी हैं, जैसे:

  • WifiP2pManager.ActionListener इंटरफ़ेस की मदद से, आपको कॉलबैक मिल सकते हैं. ये कॉलबैक तब मिलते हैं, जब किसी ऑपरेशन को पूरा करने में सफलता मिलती है या वह पूरा नहीं हो पाता. जैसे, पीयर डिस्कवर करना या उनसे कनेक्ट करना.
  • WifiP2pManager.PeerListListener इंटरफ़ेस की मदद से, आपको ढूंढे गए पीयर के बारे में जानकारी मिलती है. कॉलबैक एक WifiP2pDeviceList उपलब्ध कराता है. इससे, रेंज में मौजूद हर डिवाइस के लिए WifiP2pDevice ऑब्जेक्ट को वापस पाया जा सकता है. साथ ही, डिवाइस का नाम, पता, डिवाइस का टाइप, डिवाइस के साथ काम करने वाले WPS कॉन्फ़िगरेशन वगैरह की जानकारी भी मिल सकती है.
  • WifiP2pManager.GroupInfoListener इंटरफ़ेस की मदद से, ये काम किए जा सकते हैं P2P ग्रुप के बारे में जानकारी पाएं. कॉलबैक से WifiP2pGroup ऑब्जेक्ट मिलता है. इससे ग्रुप की जानकारी मिलती है, जैसे कि मालिक, नेटवर्क का नाम, और पासफ़्रेज़.
  • WifiP2pManager.ConnectionInfoListener इंटरफ़ेस की मदद से, ये काम किए जा सकते हैं आपको मौजूदा कनेक्शन के बारे में जानकारी मिलेगी. कॉलबैक से WifiP2pInfo ऑब्जेक्ट मिलता है. इसमें यह जानकारी होती है कि ग्रुप बना है या नहीं और ग्रुप का मालिक कौन है.

वाई-फ़ाई P2P एपीआई का इस्तेमाल करने के लिए, आपके ऐप्लिकेशन को उपयोगकर्ता की इन अनुमतियों का अनुरोध करना होगा:

  • ACCESS_WIFI_STATE
  • CHANGE_WIFI_STATE
  • INTERNET (हालांकि, आपका ऐप्लिकेशन तकनीकी रूप से कनेक्ट नहीं करता है से इंटरनेट से कनेक्ट करने के लिए, मानक Java सॉकेट के साथ WiFi P2P पीयर से संचार करने के लिए इंटरनेट की आवश्यकता होती है अनुमति).

Android सिस्टम, कुछ WiFi P2P इवेंट के दौरान कई अलग-अलग कार्रवाइयां भी ब्रॉडकास्ट करता है:

ज़्यादा जानकारी के लिए, WifiP2pManager दस्तावेज़ देखें. साथ ही इसे देखो वाई-फ़ाई P2P डेमो सैंपल ऐप्लिकेशन.

ब्लूटूथ हेल्थ डिवाइस

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

सामान्य हेडसेट और A2DP प्रोफ़ाइल डिवाइसों की तरह ही, प्रोफ़ाइल से कनेक्ट करने के लिए, आपको getProfileProxy() को BluetoothProfile.ServiceListener और HEALTH प्रोफ़ाइल टाइप के साथ कॉल करना होगा प्रॉक्सी ऑब्जेक्ट.

Health Profile प्रॉक्सी (BluetoothHealth ऑब्जेक्ट) हासिल करने के बाद, जोड़े गए स्वास्थ्य से जुड़े डिवाइसों से कनेक्ट करने और उनसे बातचीत करने के लिए, इन नई ब्लूटूथ क्लास का इस्तेमाल किया जाता है:

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

ब्लूटूथ हेल्थ प्रोफ़ाइल का इस्तेमाल करने के बारे में ज़्यादा जानकारी के लिए, BluetoothHealth के दस्तावेज़ देखें.

सुलभता

Android 4.0 में, टच करके एक्सप्लोर करने के नए मोड और बेहतर एपीआई की मदद से, देखने में दिक्कत वाले लोगों के लिए ऐक्सेस की सुविधा को बेहतर बनाया गया है. इन एपीआई की मदद से, कॉन्टेंट देखने के बारे में ज़्यादा जानकारी दी जा सकती है या ऐक्सेस की बेहतर सेवाएं उपलब्ध कराई जा सकती हैं.

छूकर, उससे जुड़ी जानकारी सुनने वाला मोड

जिन लोगों की आंखों की रोशनी कम है वे अब स्क्रीन को अपनी उंगली से छूकर और खींचकर, स्क्रीन पर मौजूद कॉन्टेंट के बारे में जानकारी सुन सकते हैं. क्योंकि टच-बाय-टच मोड इस तरह काम करता है जैसे वर्चुअल कर्सर के साथ-साथ, यह स्क्रीन रीडर को उसी तरह से जानकारी देने वाले टेक्स्ट की पहचान करने देता है जैसे स्क्रीन जब उपयोगकर्ता डी-पैड या ट्रैकबॉल के साथ नेविगेट करता है—तो उपयोगकर्ता दी गई जानकारी को पढ़कर, यह काम कर सकते हैं सिम्युलेट किए गए "होवर" पर android:contentDescription और setContentDescription() ने इवेंट. इसलिए, इसे एक रिमाइंडर के तौर पर लें कि आपको अपने ऐप्लिकेशन में व्यू के लिए जानकारी देने वाला टेक्स्ट देना चाहिए. खास तौर पर, ImageButton, EditText, ImageView, और ऐसे अन्य विजेट के लिए जिनमें जानकारी देने वाला टेक्स्ट अपने-आप नहीं दिखता.

व्यू के लिए सुलभता

स्क्रीन रीडर जैसी सुलभता सेवाओं में उपलब्ध जानकारी को बेहतर बनाने के लिए, अपने कस्टम View कॉम्पोनेंट में, सुलभता इवेंट के लिए कॉलबैक के नए तरीके लागू करें.

यह जानना ज़रूरी है कि Android में sendAccessibilityEvent() तरीका कैसे काम करता है 4.0. Android के पिछले वर्शन की तरह ही, जब उपयोगकर्ता डिवाइस पर सुलभता सेवाओं को चालू करता है और क्लिक या कर्सर घुमाने जैसा कोई इनपुट इवेंट होता है, तो उस व्यू को sendAccessibilityEvent() को कॉल करके सूचना दी जाती है. पहले, sendAccessibilityEvent() को लागू करने पर AccessibilityEvent शुरू करें और उसे AccessibilityManager को भेजें. नए व्यवहार में कुछ अतिरिक्त कॉलबैक तरीकों का इस्तेमाल किया जाता है. इनकी मदद से, व्यू और उसके पैरंट, इवेंट में ज़्यादा संदर्भ वाली जानकारी जोड़ सकते हैं:

  1. sendAccessibilityEvent() और sendAccessibilityEventUnchecked() मेथड को कॉल करने पर, वे onInitializeAccessibilityEvent() पर भेज दिए जाते हैं.

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

  2. इवेंट शुरू होने के बाद, अगर वह कई तरह के इवेंट में से एक है जिसे टेक्स्ट जानकारी से पॉप्युलेट किया जाना चाहिए, तो व्यू को dispatchPopulateAccessibilityEvent() को कॉल मिलता है. यह कॉल, onPopulateAccessibilityEvent() कॉलबैक को भेजा जाता है.

    आम तौर पर, View को कस्टम तरीके से लागू करने पर onPopulateAccessibilityEvent() को लागू किया जाना चाहिए. ऐसा इसलिए, ताकि ज़्यादा जानकारी जोड़ने के लिए अगर android:contentDescription टेक्स्ट मौजूद नहीं है, तो AccessibilityEvent के लिए टेक्स्ट कॉन्टेंट या काफ़ी नहीं है. अधिक टेक्स्ट विवरण जोड़ने के लिए AccessibilityEvent, getText() को कॉल करें.add().

  3. ऐसा होने पर View, कॉल करके इवेंट को व्यू हैरारकी में ऊपर ले जाता है requestSendAccessibilityEvent() पैरंट व्यू. हर पैरंट व्यू में, सुलभता की जानकारी को बेहतर बनाया जा सकता है. इसके लिए, AccessibilityRecord जोड़ा जा रहा है आखिर में रूट व्यू पर पहुंच जाता है, जो sendAccessibilityEvent() के साथ इवेंट को AccessibilityManager को भेजता है.

ऊपर दिए गए नए तरीकों के अलावा, View क्लास को एक्सटेंंड करते समय, इन इवेंट कॉलबैक को किसी भी View पर इंटरसेप्ट किया जा सकता है. इसके लिए, AccessibilityDelegate को एक्सटेंंड करके, उसे setAccessibilityDelegate() के साथ व्यू पर सेट करें. ऐसा करने पर, व्यू में मौजूद हर सुलभता का तरीका कॉल को ऐक्सेस दिया है. उदाहरण के लिए, जब व्यू को onPopulateAccessibilityEvent() का कॉल मिलता है, तो वह इसे View.AccessibilityDelegate में मौजूद उसी मेथड पर पास करता है. डिलीगेट के ज़रिए मैनेज नहीं किए गए किसी भी तरीके को डिफ़ॉल्ट तरीके के तौर पर व्यू में वापस भेज दिया जाता है. इससे, View क्लास को एक्सटेंड किए बिना, किसी भी व्यू के लिए ज़रूरी तरीकों को ही बदला जा सकता है.

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

सुलभता सेवाएं

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

अगर स्क्रीन रीडर जैसी कोई सुलभता सेवा डेवलप की जा रही है, तो नीचे दी गई प्रक्रिया का इस्तेमाल करके कॉन्टेंट की अतिरिक्त जानकारी और ट्रैवर्स व्यू की हैरारकी:

  1. किसी ऐप्लिकेशन से AccessibilityEvent मिलने पर, किसी AccessibilityRecord की जानकारी पाने के लिए, AccessibilityEvent.getRecord() पर कॉल करें. ऐसा हो सकता है कि इवेंट).
  2. AccessibilityEvent या किसी AccessibilityRecord से, AccessibilityNodeInfo ऑब्जेक्ट वापस पाने के लिए, getSource() पर कॉल किया जा सकता है.

    AccessibilityNodeInfo किसी एक नोड को दिखाता है एक ऐसे फ़ॉर्मैट में होनी चाहिए जो आपको उस फ़ाइल के बारे में सुलभता जानकारी के लिए नोड के लिए अलग-अलग हैं. AccessibilityEvent से मिला AccessibilityNodeInfo ऑब्जेक्ट, इवेंट के सोर्स की जानकारी देता है, जबकि सोर्स से मिला सोर्स AccessibilityRecord इवेंट के पहले के बारे में बताता है स्रोत.

  3. AccessibilityNodeInfo की मदद से, जानकारी पाने के लिए क्वेरी की जा सकती है इस बारे में, व्यू को ढूंढने के लिए getParent() या getChild() पर कॉल करें और यहां तक कि नोड में चाइल्ड व्यू भी जोड़ सकते हैं.

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

सुलभता से जुड़े अन्य एपीआई

अगर आपको डिवाइस की सुलभता की स्थिति जाननी है, तो AccessibilityManager में कुछ नए एपीआई हैं, जैसे:

  • AccessibilityManager.AccessibilityStateChangeListenerएक इंटरफ़ेस है. इसकी मदद से, सुलभता मोड चालू या बंद होने पर, आपको कॉलबैक मिलता है.
  • getEnabledAccessibilityServiceList() से यह जानकारी मिलती है कि फ़िलहाल कौनसी सुलभता सेवाएं चालू हैं.
  • isTouchExplorationEnabled() से पता चलता है कि टच करके एक्सप्लोर करने की सुविधा चालू है या नहीं.

स्पेल चेकर की सेवाएं

नए स्पेल चेकर फ़्रेमवर्क की मदद से, ऐप्लिकेशन स्पेल चेकर बना सकते हैं. यह तरीका, इनपुट मेथड फ़्रेमवर्क (आईएमई के लिए) से मिलता-जुलता है. नया स्पेल-चेकर बनाने के लिए, आपको एक ऐसी सेवा लागू करनी होगी जो बढ़ाएं SpellCheckerService और स्पेलिंग के सुझाव देने के लिए, SpellCheckerService.Session क्लास को बढ़ाएं इंटरफ़ेस के कॉलबैक तरीकों से मिले टेक्स्ट पर. SpellCheckerService.Session कॉलबैक के तरीकों में, आपको वर्तनी के सुझावों को SuggestionsInfo ऑब्जेक्ट के तौर पर दिखाना होगा.

स्पेल चेकर सेवा वाले ऐप्लिकेशन को सेवा के लिए ज़रूरी BIND_TEXT_SERVICE अनुमति के बारे में एलान करना होगा. सेवा को इंटेंट की कार्रवाई के तौर पर, <action android:name="android.service.textservice.SpellCheckerService" /> के साथ एक इंटेंट फ़िल्टर का एलान भी करना चाहिए. ऐसा <meta-data> एलिमेंट शामिल करें जो स्पेल के लिए कॉन्फ़िगरेशन की जानकारी देता है चेकर.

उदाहरण के लिए, स्पेल चेकर सेवा ऐप्लिकेशन का सैंपल और स्पेल चेकर क्लाइंट ऐप्लिकेशन का सैंपल देखें.

लिखाई को बोली में बदलने वाले इंजन

Android के लिखाई को बोली में बदलने (टीटीएस) एपीआई को काफ़ी हद तक बढ़ाया गया है, ताकि ऐप्लिकेशन कस्टम TTS इंजन का उपयोग ज़्यादा आसानी से किया जा सकता है, जबकि जो एप्लिकेशन किसी TTS इंजन का उपयोग करना चाहते हैं, उनके पास इंजन चुनने के लिए कुछ नए एपीआई.

लिखाई को बोली में बदलने वाले इंजन का इस्तेमाल करना

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

getEngines() का इस्तेमाल करके, उपलब्ध टीटीएस इंजन के बारे में भी क्वेरी की जा सकती है. यह मेथड, TextToSpeech.EngineInfo ऑब्जेक्ट की सूची दिखाता है. इसमें इंजन का आइकॉन, लेबल, और पैकेज का नाम जैसे मेटाडेटा शामिल होते हैं.

लिखाई को बोली में बदलने वाले इंजन बनाना

पहले, कस्टम इंजन के लिए यह ज़रूरी था कि इंजन को ऐसे नेटिव हेडर का इस्तेमाल करके बनाया जाए जो दस्तावेज़ में नहीं है फ़ाइल से लिए जाते हैं. Android 4.0 में, टीटीएस इंजन बनाने के लिए फ़्रेमवर्क एपीआई का पूरा सेट होता है.

बुनियादी सेटअप के लिए, TextToSpeechService को लागू करना ज़रूरी है, जो INTENT_ACTION_TTS_SERVICE इंटेंट का जवाब देता है. कॉन्टेंट बनाने टीटीएस इंजन का मुख्य काम, किसी सेवा में onSynthesizeText() कॉलबैक के दौरान होता है जो TextToSpeechService तक बढ़ाई जा सकती है. सिस्टम इस तरीके के साथ दो ऑब्जेक्ट डिलीवर करता है:

  • SynthesisRequest: इसमें अलग-अलग तरह का डेटा शामिल होता है. जैसे, टेक्स्ट को सिंथेसाइज़ करने के लिए, स्थानीय भाषा, बोलने की रफ़्तार, और आवाज़ की पिच.
  • SynthesisCallback: यह वह इंटरफ़ेस है जिससे आपका TTS इंजन इसकी वजह से, स्पीच डेटा को ऑडियो स्ट्रीमिंग के तौर पर डिलीवर किया जाता है. सबसे पहले, इंजन को start() को कॉल करना होगा, ताकि यह बताया जा सके कि इंजन डिलीवर करने के लिए तैयार है ऑडियो को सुनें, फिर audioAvailable() पर कॉल करें, उसे ऑडियो डेटा को बाइट बफ़र में पास करना. जब आपका इंजन सभी ऑडियो को बफ़र, done() कॉल करें.

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

नए एपीआई का इस्तेमाल करने वाले टीटीएस इंजन का उदाहरण देखने के लिए, टेक्स्ट को बोली में बदलने वाले इंजन का सैंपल ऐप्लिकेशन देखें.

नेटवर्क का इस्तेमाल

Android 4.0 की मदद से, उपयोगकर्ता यह सटीक तरीके से देख सकते हैं कि उनके ऐप्लिकेशन नेटवर्क का कितना डेटा इस्तेमाल कर रहे हैं. Settings ऐप्लिकेशन में, उपयोगकर्ताओं को नेटवर्क डेटा के इस्तेमाल की तय सीमा को मैनेज करने की सुविधा मिलती है. साथ ही, वे अलग-अलग ऐप्लिकेशन के लिए बैकग्राउंड डेटा के इस्तेमाल को बंद भी कर सकते हैं. उपयोगकर्ताओं द्वारा आपकी साइट को अक्षम होने से बचाने के लिए बैकग्राउंड में मौजूद डेटा को ऐक्सेस करने की अनुमति के लिए, आपको डेटा इस्तेमाल करने की रणनीतियां बनानी चाहिए और आपके डिवाइस के इस्तेमाल में बदलाव ला सकता है.

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

<activity android:name="DataPreferences" android:label="@string/title_preferences">
    <intent-filter>
       <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />
       <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

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

साथ ही ध्यान रखें कि getBackgroundDataSetting() अब बंद करता है और हमेशा सही दिखाता है—इसके बजाय getActiveNetworkInfo() का इस्तेमाल करें. नेटवर्क से जुड़ा कोई भी लेन-देन करने से पहले, आपको हमेशा getActiveNetworkInfo() को कॉल करके, NetworkInfo पाना चाहिए. इससे आपको मौजूदा नेटवर्क के बारे में पता चलता है. साथ ही, isConnected() को क्वेरी करके यह भी पता चलता है कि डिवाइस में नेटवर्क कनेक्शन है या नहीं. इसके बाद, कनेक्शन की अन्य प्रॉपर्टी देखी जा सकती हैं. जैसे, डिवाइस रोमिंग में है या वाई-फ़ाई से कनेक्ट है.

Enterprise

Android 4.0, एंटरप्राइज़ ऐप्लिकेशन के लिए इन सुविधाओं के साथ, ज़्यादा काम करने की सुविधा देता है.

वीपीएन सेवाएं

नया VpnService, ऐप्लिकेशन को अपना वीपीएन (वर्चुअल तौर पर) बनाने की अनुमति देता है निजी नेटवर्क), जो Service के तौर पर चल रहा है. वीपीएन सेवा, वर्चुअल नेटवर्क के लिए इंटरफ़ेस बनाती है. इसमें अपने पते और रूटिंग नियम होते हैं. साथ ही, फ़ाइल डिस्क्रिप्टर की मदद से, डेटा को पढ़ने और लिखने की सभी कार्रवाइयां की जाती हैं.

वीपीएन सेवा बनाने के लिए, VpnService.Builder का इस्तेमाल करें. इससे आपको यह तय करने में मदद मिलती है कि नेटवर्क पता, DNS सर्वर, नेटवर्क रूट वगैरह. पूरा होने के बाद, आपके पास establish() को कॉल करके इंटरफ़ेस खोजें, जो ParcelFileDescriptor दिखाता है.

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

डिवाइस से जुड़ी नीतियां

डिवाइस से जुड़ी पाबंदियों को मैनेज करने वाले ऐप्लिकेशन, अब setCameraDisabled() और USES_POLICY_DISABLE_CAMERA प्रॉपर्टी (नीति कॉन्फ़िगरेशन फ़ाइल में <disable-camera /> एलिमेंट पर लागू होता है) का इस्तेमाल करके, कैमरा बंद कर सकते हैं.

सर्टिफ़िकेट मैनेजमेंट

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

डिवाइस के सेंसर

Android 4.0 में दो नए तरह के सेंसर जोड़े गए हैं:

  • TYPE_AMBIENT_TEMPERATURE: तापमान मापने वाला ऐसा सेंसर जो नतीजे देता है डिग्री सेल्सियस में वातावरण (कमरे) का तापमान.
  • TYPE_RELATIVE_HUMIDITY: नमी मापने वाला ऐसा सेंसर जो प्रतिशत के तौर पर, कमरे में मौजूद नमी की मात्रा को मापा जाता है.

अगर किसी डिवाइस में TYPE_AMBIENT_TEMPERATURE और TYPE_RELATIVE_HUMIDITY, दोनों सेंसर हैं, तो ड्यू पॉइंट का हिसाब लगाने के लिए इनका इस्तेमाल किया जा सकता है और पूरी नमी.

तापमान मापने वाला पिछला सेंसर TYPE_TEMPERATURE, बंद कर दिया गया है. इसके बजाय, आपको TYPE_AMBIENT_TEMPERATURE सेंसर का इस्तेमाल करना चाहिए.

इसके अलावा, Android के तीन सिंथेटिक सेंसर को काफ़ी बेहतर बनाया गया है. इसलिए, अब ये सेंसर कम हो गए हैं बिना किसी रुकावट के काम करता है. इन सेंसर में गुरुत्वाकर्षण सेंसर (TYPE_GRAVITY), रोटेशन वेक्टर सेंसर (TYPE_ROTATION_VECTOR), और लीनियर ऐक्सेलरेशन सेंसर (TYPE_LINEAR_ACCELERATION) शामिल हैं. बेहतर सेंसर जाइरोस्कोप पर निर्भर करते हैं सेंसर का इस्तेमाल कर सकते हैं. इसलिए, सेंसर सिर्फ़ जाइरोस्कोप वाले डिवाइस पर दिखते हैं.

ऐक्शन बार

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

स्प्लिट ऐक्शन बार

अगर आपके ऐक्शन बार में कई ऐक्शन आइटम शामिल हैं, तो वे सभी एक छोटी स्क्रीन पर मौजूद ऐक्शन बार में फ़िट नहीं होंगे. इसलिए, सिस्टम उनमें से ज़्यादा आइटम को ओवरफ़्लो मेन्यू में डाल देगा. हालांकि, Android 4.0 इसकी मदद से, “स्प्लिट ऐक्शन बार" को चालू किया जा सकता है ताकि स्क्रीन पर ज़्यादा ऐक्शन आइटम दिख सकें पर क्लिक करें. स्प्लिट ऐक्शन बार की सुविधा चालू करने के लिए, अपनी मेनिफ़ेस्ट फ़ाइल में <application> टैग या अलग-अलग <activity> टैग में "splitActionBarWhenNarrow" के साथ android:uiOptions जोड़ें. इसे चालू करने पर, सिस्टम इसके नीचे एक अतिरिक्त बार जोड़ देगा स्क्रीन छोटी होने पर सभी ऐक्शन आइटम के लिए स्क्रीन (मुख्य ऐक्शन आइटम ऐक्शन बार).

अगर आपको ActionBar.Tab API से मिले नेविगेशन टैब का इस्तेमाल करना है, तो लेकिन ऊपर मौजूद मुख्य कार्रवाई बार की ज़रूरत नहीं है (आपको सिर्फ़ सबसे ऊपर टैब दिखने चाहिए) फिर चालू करें स्प्लिट ऐक्शन बार का इस्तेमाल करें औरsetDisplayShowHomeEnabled(false) ऐप्लिकेशन आइकॉन पर क्लिक करें. मुख्य कार्रवाई बार में कुछ भी नहीं बचा है, गायब हो जाता है—बस सबसे ऊपर नेविगेशन टैब और पर क्लिक करें.

ऐक्शन बार के स्टाइल

अगर आपको ऐक्शन बार पर कस्टम स्टाइलिंग लागू करनी है, तो बैकग्राउंड लागू करने के लिए, नई स्टाइल प्रॉपर्टी backgroundStacked और backgroundSplit का इस्तेमाल करें ड्रॉ करने लायक या कलर करने के लिए, स्टैक किए गए बार और स्प्लिट बार का इस्तेमाल किया जाता है. आप इन शैलियों को यहां भी सेट कर सकते हैं: setStackedBackgroundDrawable() और setSplitBackgroundDrawable() के साथ रनटाइम.

कार्रवाई करने वाली कंपनी

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

उदाहरण के लिए, ShareActionProvider, ActionProvider का एक्सटेंशन है, जो "शेयर" की सुविधा देता है कार्रवाई चुनें. का उपयोग करने के बजाय ट्रेडिशनल ऐक्शन आइटम, जो ACTION_SEND इंटेंट को शुरू करता है. हालांकि, इसकी मदद से कार्रवाई करने वाले इस ऐप्लिकेशन का इस्तेमाल, उन ऐप्लिकेशन की ड्रॉप-डाउन सूची के साथ कार्रवाई व्यू पेश करने के लिए करें जो हैंडल कर सकते हैं ACTION_SEND इंटेंट. जब उपयोगकर्ता किसी ऐप्लिकेशन को चुनता है, तो ShareActionProvider उस ऐप्लिकेशन को याद रखता है और उसे ऐक्शन व्यू में दिखाता है, ताकि उस ऐप्लिकेशन के साथ फ़ाइलें तेज़ी से शेयर की जा सकें.

किसी ऐक्शन आइटम के लिए ऐक्शन प्रोवाइडर का एलान करने के लिए, अपनी गतिविधि के विकल्प मेन्यू के लिए <item> एलिमेंट में android:actionProviderClass एट्रिब्यूट शामिल करें. साथ ही, वैल्यू के तौर पर ऐक्शन प्रोवाइडर के क्लास का नाम डालें. उदाहरण के लिए:

<item android:id="@+id/menu_share"
      android:title="Share"
      android:showAsAction="ifRoom"
      android:actionProviderClass="android.widget.ShareActionProvider" />

आपकी गतिविधि के onCreateOptionsMenu() में कॉलबैक तरीका है, मेन्यू आइटम से ऐक्शन प्रोवाइडर का इंस्टेंस फिर से पाएं और इंटेंट:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options, menu)
    val shareActionProvider = menu.findItem(R.id.menu_share)?.actionProvider as? ShareActionProvider
    // Set the share intent of the share action provider.
    shareActionProvider?.setShareIntent(createShareIntent())
    ...
    return super.onCreateOptionsMenu(menu)
}

Java

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);
    ShareActionProvider shareActionProvider =
          (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();
    // Set the share intent of the share action provider.
    shareActionProvider.setShareIntent(createShareIntent());
    ...
    return super.onCreateOptionsMenu(menu);
}

ShareActionProvider का इस्तेमाल करने वाले उदाहरण के लिए, ApiDemos में ActionBarShareActionProviderActivity देखें.

छोटे किए जा सकने वाले ऐक्शन व्यू

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

अगर आपको यह बताना है कि ऐक्शन व्यू वाले किसी ऐक्शन आइटम को छोटा किया जा सकता है, तो मेन्यू की एक्सएमएल फ़ाइल में <item> एलिमेंट के लिए android:showAsAction एट्रिब्यूट में “collapseActionView" फ़्लैग शामिल करें.

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

छोटे किए जा सकने वाले ऐक्शन व्यू को कंट्रोल करने के लिए, collapseActionView() और expandActionView() को इस पर कॉल किया जा सकता है संबंधित MenuItem.

कस्टम ऐक्शन व्यू बनाते समय, नया CollapsibleActionView इंटरफ़ेस भी लागू किया जा सकता है. इससे, व्यू को बड़ा और छोटा करने पर कॉलबैक मिलते हैं.

ऐक्शन बार के लिए अन्य एपीआई

  • setHomeButtonEnabled() से आपको यह तय करने की सुविधा मिलती है कि आइकॉन/लोगो, होम पेज पर जाने या “ऊपर” जाने के लिए बटन की तरह काम करता है (“सही” को पास करें, ताकि इसे इस तरह व्यवहार किया जा सके (एक बटन).
  • setIcon() और setLogo() की मदद से, रनटाइम के दौरान ऐक्शन बार के आइकॉन या लोगो को तय किया जा सकता है.
  • Fragment.setMenuVisibility() आपको इसे चालू करने की अनुमति देता है या फ़्रैगमेंट से बताए गए विकल्प मेन्यू आइटम के दिखने की सुविधा बंद करें. यह तब काम आता है, जब गतिविधि में फ़्रैगमेंट जोड़ा गया हो, लेकिन वह दिख न रहा हो. इसलिए, मेन्यू आइटम छिपाए जाने चाहिए.
  • FragmentManager.invalidateOptionsMenu() की मदद से, फ़्रैगमेंट लाइफ़साइकल की अलग-अलग स्थितियों में, ऐक्टिविटी के विकल्पों वाले मेन्यू को अमान्य किया जा सकता है. ऐसा तब किया जा सकता है, जब Activity के मिलते-जुलते तरीके का इस्तेमाल उपलब्ध न हो.

यूज़र इंटरफ़ेस और व्यू

Android 4.0 में कई नए व्यू और यूज़र इंटरफ़ेस (यूआई) के अन्य कॉम्पोनेंट शामिल किए गए हैं.

ग्रिडलेआउट

GridLayout एक नया व्यू ग्रुप है, जो चाइल्ड व्यू को रेक्टैंगल ग्रिड में दिखाता है. TableLayout के उलट, GridLayout फ़्लैट पर निर्भर करता है साथ ही, इसमें स्ट्रक्चर उपलब्ध कराने के लिए टेबल की पंक्तियों जैसे इंटरमीडिएट व्यू का इस्तेमाल नहीं किया जाता है. इसके बजाय, चाइल्ड तय करते हैं कि उन्हें कौनसी लाइन और कॉलम शामिल होने चाहिए (सेल एक से ज़्यादा हो सकती हैं) पंक्तियां और/या कॉलम), डिफ़ॉल्ट रूप से ग्रिड की पंक्तियों और कॉलम में एक क्रम में रखी जाती हैं. GridLayout ओरिएंटेशन से यह तय होता है कि क्रम से मौजूद चाइल्ड एलिमेंट, डिफ़ॉल्ट रूप से हॉरिज़ॉन्टल या वर्टिकल तौर पर दिखेंगे. बच्चों के बीच की जगह को इनमें से किसी एक का इस्तेमाल करके तय किया जा सकता है नए Space व्यू के इंस्टेंस या काम के मार्जिन पैरामीटर सेट करके बच्चों पर कितना असर पड़ेगा.

GridLayout का इस्तेमाल करके सैंपल देखने के लिए, ApiDemos देखें.

TextureView

TextureView एक नया व्यू है, जिससे आप कॉन्टेंट स्ट्रीम दिखा सकते हैं, जैसे को वीडियो या OpenGL सीन के तौर पर इस्तेमाल किया जा सकता है. SurfaceView की तरह ही, TextureView भी एक यूनीक ऑब्जेक्ट है. हालांकि, यह अलग विंडो बनाने के बजाय, सामान्य व्यू की तरह काम करता है. इसलिए, इसे किसी भी दूसरे View ऑब्जेक्ट की तरह इस्तेमाल किया जा सकता है. उदाहरण के लिए, ट्रांसफ़ॉर्म लागू किए जा सकते हैं, ViewPropertyAnimator का इस्तेमाल करके ऐनिमेशन जोड़ा जा सकता है या setAlpha() की मदद से उसकी ओपैसिटी में बदलाव किया जा सकता है.

ध्यान रखें कि TextureView सिर्फ़ हार्डवेयर से तेज़ी लाएं सुविधा वाली विंडो में काम करता है.

ज़्यादा जानकारी के लिए, TextureView दस्तावेज़ देखें.

विजेट बदलें

नया Switch विजेट, दो स्थितियों वाला टॉगल है. उपयोगकर्ता किसी विकल्प को एक से दूसरी स्थिति पर टॉगल करने के लिए, उसे एक ओर से दूसरी ओर खींचकर ले जा सकते हैं या उस पर टैप कर सकते हैं.

android:textOn और android:textOff एट्रिब्यूट का इस्तेमाल करके, यह तय किया जा सकता है कि स्विच के चालू और बंद होने पर, उस पर कौनसा टेक्स्ट दिखे. android:text एट्रिब्यूट की मदद से, स्विच के बगल में लेबल भी लगाया जा सकता है.

स्विच का इस्तेमाल करने वाले सैंपल के लिए, switches.xml लेआउट फ़ाइल देखें और संबंधित स्विच गतिविधि.

Android 3.0 में पॉप-अप होने वाले छोटे प्रासंगिक मेन्यू बनाने के लिए, PopupMenu लॉन्च किया गया आपके चुने हुए ऐंकर पॉइंट पर ऊपर की ओर ले जाएं. आम तौर पर, चुने गए आइटम के पॉइंट पर. Android 4.0 में PopupMenu के साथ कुछ काम की सुविधाएं भी मिलती हैं:

  • अब inflate() की मदद से, एक्सएमएल मेन्यू रिसॉर्स से पॉप-अप मेन्यू के कॉन्टेंट को आसानी से फ़ुल फ़ॉर्मैट में बदला जा सकता है. इसके लिए, मेन्यू रिसॉर्स आईडी को पास करना होगा.
  • अब ऐसा PopupMenu.OnDismissListener भी बनाया जा सकता है जिसे मेन्यू बंद करने पर कॉलबैक मिलता है.

प्राथमिकताएं

एक नई TwoStatePreference एब्स्ट्रैक्ट क्लास, प्राथमिकताओं के आधार के तौर पर काम करती है. यह दो स्टेटस में से किसी एक को चुनने का विकल्प देती है. नया SwitchPreference, TwoStatePreference का एक एक्सटेंशन है. यह प्राथमिकता व्यू में Switch विजेट उपलब्ध कराता है. इससे उपयोगकर्ता, प्राथमिकता वाली किसी स्क्रीन या डायलॉग खोले बिना, सेटिंग को टॉगल कर सकते हैं. उदाहरण के लिए, Settings ऐप्लिकेशन में वाई-फ़ाई और ब्लूटूथ सेटिंग के लिए SwitchPreference का इस्तेमाल किया जाता है.

सिस्टम की थीम

Android 4.0 को टारगेट करने वाले सभी ऐप्लिकेशन की डिफ़ॉल्ट थीम (इसके लिए, targetSdkVersion या minSdkVersion से “14" या उससे ज़्यादा) अब "डिवाइस की डिफ़ॉल्ट सेटिंग" थीम: Theme.DeviceDefault. यह गहरे रंग वाली Holo थीम या किसी डिवाइस के हिसाब से तय की गई गहरे रंग वाली कोई दूसरी थीम हो सकती है.

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

अगर आपको अपने ऐप्लिकेशन को डिवाइस की थीम के साथ ब्लेंड करना है, तो आपको Theme.DeviceDefault फ़ैमिली की थीम को साफ़ तौर पर लागू करना चाहिए. ऐसा तब करना चाहिए, जब अलग-अलग OEM, सिस्टम के लिए अलग-अलग डिफ़ॉल्ट थीम उपलब्ध कराते हों.

विकल्प मेन्यू बटन

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

सबसे अच्छे उपयोगकर्ता अनुभव के लिए, नए और अपडेट किए गए ऐप्लिकेशन को मेन्यू आइटम का ऐक्सेस देने के लिए, ActionBar का इस्तेमाल करना चाहिए. साथ ही, नए फ़्रेमवर्क के डिफ़ॉल्ट व्यवहार का फ़ायदा पाने के लिए, targetSdkVersion को "14" पर सेट करना चाहिए.

सिस्टम यूज़र इंटरफ़ेस (यूआई) दिखने के लिए कंट्रोल

Android के शुरुआती दिनों से, सिस्टम में एक यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट होता है, जिसे स्टेटस बार कहा जाता है. यह हैंडसेट डिवाइसों में सबसे ऊपर होता है और इसमें कैरियर सिग्नल, समय, सूचनाएं वगैरह जैसी जानकारी दिखती है. Android 3.0 में टैबलेट के लिए सिस्टम बार जोड़ा गया डिवाइस, जो सिस्टम नेविगेशन कंट्रोल (होम, और आगे बताए गए हैं) के साथ-साथ उन एलिमेंट के लिए इंटरफ़ेस भी है जो पारंपरिक रूप से स्टेटस बार में दिए जाते हैं. Android 4.0 में, सिस्टम एक नए तरह का सिस्टम यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराता है. इसे नेविगेशन बार कहा जाता है. आपने लोगों तक पहुंचाया मुफ़्त में नेविगेशन बार को सिस्टम बार का वह वर्शन माना जा सकता है जिसे हैंडसेट—यह नेविगेशन कंट्रोल देता है के लिए, जिनमें सिस्टम को नेविगेट करने के लिए हार्डवेयर काउंटर नहीं हैं, लेकिन यह सिस्टम बार की सूचना का यूज़र इंटरफ़ेस (यूआई) और सेटिंग कंट्रोल. इसलिए, नेविगेशन प्रदान करने वाला कोई डिवाइस बार में सबसे ऊपर स्टेटस बार भी होता है.

आज तक, आप FLAG_FULLSCREEN फ़्लैग का इस्तेमाल करके हैंडसेट पर स्टेटस बार को छिपा सकते हैं. Android 4.0 में, सिस्टम बार के दिखने को कंट्रोल करने वाले एपीआई को अपडेट किया गया है. इससे सिस्टम बार और नेविगेशन बार, दोनों के व्यवहार को बेहतर तरीके से दिखाया जा सकता है:

  • SYSTEM_UI_FLAG_LOW_PROFILE फ़्लैग, STATUS_BAR_HIDDEN फ़्लैग की जगह ले लेता है. सेट होने पर, यह फ़्लैग सिस्टम बार या नेविगेशन बार के लिए “लो प्रोफ़ाइल" मोड चालू करता है. नेविगेशन बटन मंद हो जाते हैं और सिस्टम बार में मौजूद अन्य एलिमेंट भी छिप जाते हैं. सक्षम कर रहा है इससे सिस्टम नेविगेशन में किसी तरह की रुकावट के बिना, शानदार गेम बनाए जा सकते हैं बटन.
  • सिस्टम बार या नेविगेशन बार को दिखाने का अनुरोध करने के लिए, SYSTEM_UI_FLAG_VISIBLE फ़्लैग STATUS_BAR_VISIBLE फ़्लैग की जगह ले लेता है.
  • SYSTEM_UI_FLAG_HIDE_NAVIGATION एक नया फ़्लैग है, जो नेविगेशन बार को पूरी तरह से छिपाने का अनुरोध करता है. ध्यान रखें कि यह सिर्फ़ कुछ हैंडसेट के नेविगेशन बार के लिए काम करता है. यह टैबलेट पर सिस्टम बार को नहीं छिपाता. नेविगेशन जैसे ही सिस्टम को उपयोगकर्ता इनपुट मिलता है, बार दिखाई देता है. ऐसे में, यह मोड उपयोगी है मुख्य रूप से वीडियो चलाने या ऐसे अन्य मामलों में जहां पूरी स्क्रीन की ज़रूरत होती है, लेकिन उपयोगकर्ता का इनपुट ज़रूरी नहीं है.

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

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

OverscanActivity क्लास की मदद से, सिस्टम के यूज़र इंटरफ़ेस (यूआई) के अलग-अलग विकल्पों को दिखाया जा सकता है.

इनपुट फ़्रेमवर्क

Android 4.0 में कर्सर घुमाने पर होने वाले इवेंट और नए स्टाइलस और माउस बटन इवेंट के लिए सहायता जोड़ी गई है.

इवेंट पर कर्सर घुमाएं

View क्लास अब “होवर" इवेंट के साथ काम करती है. इससे पॉइंटर डिवाइसों (जैसे, माउस या स्क्रीन पर कर्सर चलाने वाले अन्य डिवाइस) का इस्तेमाल करके, बेहतर इंटरैक्शन की सुविधा मिलती है.

किसी व्यू पर होवर इवेंट पाने के लिए, View.OnHoverListener लागू करें और setOnHoverListener() पर रजिस्टर करें. कर्सर घुमाने पर व्यू में कोई इवेंट होता है, तो आपके सुनने वाले को onHover() पर एक कॉल आता है. इसके लिए, View आपको इवेंट मिला. साथ ही, एक MotionEvent मिला है जिसमें होवर इवेंट के टाइप के बारे में बताया गया है जो हुआ. होवर इवेंट इनमें से कोई एक हो सकता है:

अगर आपका View.OnHoverListener, होवर इवेंट को हैंडल करता है, तो onHover() से सही दिखना चाहिए. अगर आपके लिसनर 'गलत' दिखाता है, फिर होवर इवेंट हमेशा की तरह पैरंट व्यू पर भेज दिया जाएगा.

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

नए होवर इवेंट के प्रदर्शन के लिए, इसमें होवर क्लास देखें ApiDemos.

स्टाइलस और माउस बटन के इवेंट

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

स्टाइलस इनपुट, टच या माउस इनपुट की तरह ही काम करता है. जब स्टाइलस, डिजिटाइज़र से संपर्क में होता है, तो ऐप्लिकेशन को टच इवेंट मिलते हैं. ठीक उसी तरह जैसे डिसप्ले को उंगली से छूने पर मिलते हैं. जब स्टाइलस डिजिटाइज़र के ऊपर कर्सर घुमाता है, तब ऐप्लिकेशन पर कर्सर घुमाने पर सूचना मिलती है इवेंट बिलकुल वैसे ही होते हैं जैसे वे तब होते हैं, जब कोई बटन न होने पर माउस पॉइंटर को डिस्प्ले पर ले जाया जा रहा हो दबाए गए हैं.

आपका ऐप्लिकेशन उंगली, माउस, स्टाइलस, और इरेज़र इनपुट के बीच अंतर कर सकता है. “टूल किस तरह का है" getToolType() का इस्तेमाल करके, MotionEvent में हर पॉइंटर से जुड़ा होता है. फ़िलहाल, टूल के ये टाइप तय किए गए हैं: TOOL_TYPE_UNKNOWN, TOOL_TYPE_FINGER, TOOL_TYPE_MOUSE, TOOL_TYPE_STYLUS, और TOOL_TYPE_ERASER. टूल टाइप की क्वेरी करके, आपका ऐप्लिकेशन स्टाइलस इनपुट को उंगली या माउस इनपुट से अलग-अलग तरीकों से हैंडल करना चुन सकते हैं.

आपका ऐप्लिकेशन यह भी क्वेरी कर सकता है कि माउस या स्टाइलस के कौनसे बटन दबाए गए हैं. इसके लिए, getButtonState() का इस्तेमाल करके MotionEvent के “बटन की स्थिति” की क्वेरी की जा सकती है. फ़िलहाल, बटन की ये स्थितियां तय की गई हैं: BUTTON_PRIMARY, BUTTON_SECONDARY, BUTTON_TERTIARY, BUTTON_BACK, और BUTTON_FORWARD. सुविधा के लिए, पीछे और आगे के माउस बटन KEYCODE_BACK और KEYCODE_FORWARD बटनों के साथ अपने-आप मैप हो गया है. आपका ऐप्लिकेशन समर्थन करने के लिए इन कुंजियों को प्रबंधित कर सकता है पीछे और आगे के नेविगेशन पर आधारित माउस बटन.

किसी संपर्क की स्थिति और दबाव को सटीक तरीके से मापने के अलावा, स्टाइलस का भी इस्तेमाल किया जा सकता है ये डिवाइस, स्टाइलस टिप और डिजिटाइज़र के बीच की दूरी, स्टाइलस झुकाने के ऐंगल, और स्टाइलस के ओरिएंटेशन का ऐंगल भी देखें. आपका ऐप्लिकेशन, ऐक्सिस कोड AXIS_DISTANCE, AXIS_TILT, और AXIS_ORIENTATION का इस्तेमाल करके, getAxisValue() का इस्तेमाल करके इस जानकारी के लिए क्वेरी कर सकता है.

टूल टाइप, बटन की स्थितियों, और नए ऐक्सिस कोड के बारे में जानने के लिए, ApiDemos में TouchPaint क्लास देखें.

प्रॉपर्टी

नई Property क्लास प्रॉपर्टी सेट कर देता है, जिसकी मदद से कॉलर सामान्य रूप से टारगेट ऑब्जेक्ट पर वैल्यू सेट कर सकते हैं/पाएंगी. इससे, फ़ील्ड/मेथड के रेफ़रंस को पास करने की सुविधा भी मिलती है. साथ ही, कोड को फ़ील्ड/मेथड के बारे में जानकारी के बिना, प्रॉपर्टी की वैल्यू सेट करने/उन्हें पाने की अनुमति मिलती है.

उदाहरण के लिए, अगर आपको foo ऑब्जेक्ट पर फ़ील्ड bar की वैल्यू सेट करनी है, तो पहले यह काम किया:

Kotlin

foo.bar = value

Java

foo.bar = value;

अगर आपको किसी निजी फ़ील्ड bar के लिए सेटर को कॉल करना है, तो पहले आपको ऐसा करना होता था:

Kotlin

foo.setBar(value)

Java

foo.setBar(value);

हालांकि, अगर आपको foo इंस्टेंस को पास करना है और कोई दूसरा कोड सेट करना है, तो bar मान है, Android 4.0 से पहले ऐसा करने का कोई तरीका नहीं है.

Property क्लास का इस्तेमाल करके, क्लास Foo पर Property ऑब्जेक्ट BAR का एलान किया जा सकता है, ताकि क्लास Foo के इंस्टेंस foo पर फ़ील्ड को इस तरह सेट किया जा सके:

Kotlin

BAR.set(foo, value)

Java

BAR.set(foo, value);

View क्लास अब Property क्लास का फ़ायदा लेती है, ताकि आप अलग-अलग फ़ील्ड सेट कर सकें. जैसे, Android 3.0 में जोड़ी गई ट्रांसफ़ॉर्म प्रॉपर्टी (ROTATION, ROTATION_X, TRANSLATION_X वगैरह).

ObjectAnimator क्लास भी Property का इस्तेमाल करती है क्लास का इस्तेमाल किया जा सकता है, ताकि आप Property का इस्तेमाल करके ObjectAnimator बना सकें. यह स्ट्रिंग-आधारित टूल से ज़्यादा तेज़, बेहतर, और टाइप-सुरक्षित है अप्रोच का इस्तेमाल करें.

हार्डवेयर से तेज़ी लाने की सुविधा

Android 4.0 से, सभी विंडो के लिए हार्डवेयर से तेज़ी लाने की सुविधा डिफ़ॉल्ट रूप से चालू रहती है, अगर ऐप्लिकेशन ने या तो targetSdkVersion को सेट किया है या minSdkVersion से “14" या उससे ज़्यादा. हार्डवेयर एक्सेलरेशन की सुविधा से, आम तौर पर ऐनिमेशन और स्क्रीन पर स्क्रोल करने की प्रोसेस आसान हो जाती है. साथ ही, इससे ऐप्लिकेशन की परफ़ॉर्मेंस बेहतर होती है और उपयोगकर्ता के इंटरैक्शन का रिस्पॉन्स भी बेहतर मिलता है.

अगर ज़रूरी हो, तो hardwareAccelerated का इस्तेमाल करके, हार्डवेयर की मदद से तेज़ी लाने की सुविधा को मैन्युअल तरीके से बंद किया जा सकता है अलग-अलग <activity> एलिमेंट या <application> के लिए एट्रिब्यूट एलिमेंट. इसके अलावा, setLayerType(LAYER_TYPE_SOFTWARE) को कॉल करके, अलग-अलग व्यू के लिए हार्डवेयर से तेज़ी लाने की सुविधा बंद की जा सकती है.

हार्डवेयर की मदद से तेज़ी लाने के बारे में ज़्यादा जानकारी के लिए, जिसमें ऐसी ड्रॉइंग की सूची भी शामिल है जो इस्तेमाल नहीं की जा सकती कार्रवाइयों के बारे में जानने के लिए, हार्डवेयर ऐक्सेलरेशन दस्तावेज़.

JNI के बदलाव

Android के पिछले वर्शन में, JNI स्थानीय संदर्भ अप्रत्यक्ष हैंडल नहीं थे; Android का इस्तेमाल किया गया डायरेक्ट पॉइंटर. जब तक गै़रबेज कलेक्टर, ऑब्जेक्ट को एक जगह से दूसरी जगह नहीं ले जाता, तब तक यह कोई समस्या नहीं थी. हालांकि, ऐसा लगता है कि यह काम करता था, क्योंकि इससे गड़बड़ी वाला कोड लिखना संभव हो गया था. Android 4.0 में, यह सिस्टम अब ताकि इन गड़बड़ियों का पता लगाया जा सके.

JNI के स्थानीय संदर्भ की पूरी जानकारी को "स्थानीय और वैश्विक संदर्भ" में बताया गया है JNI Tips में शामिल है. Android 4.0 में, इन गड़बड़ियों का पता लगाने के लिए, CheckJNI को बेहतर बना दिया गया है. JNI रेफ़रंस से जुड़ी आम गड़बड़ियों और उन्हें ठीक करने के तरीके के बारे में जानने के लिए, Android डेवलपर ब्लॉग पर आने वाली पोस्ट देखें.

JNI लागू करने के तरीके में हुए इस बदलाव का असर सिर्फ़ उन ऐप्लिकेशन पर पड़ेगा जो Android 4.0 को टारगेट करते हैं. इसके लिए, targetSdkVersion या minSdkVersion को “14" या उससे ज़्यादा पर सेट किया जाता है. अगर आपने इन एट्रिब्यूट को किसी कम वैल्यू पर सेट किया है, तो JNI लोकल रेफ़रंस, पिछले वर्शन की तरह ही काम करते हैं.

वेबकिट

  • WebKit को वर्शन 534.30 में अपडेट किया गया
  • WebView और पहले से मौजूद ब्राउज़र में, इंडिक फ़ॉन्ट (देवनागरी, बांग्ला, और तमिल) के साथ काम करने की सुविधा. इसमें ग्लिफ़ को जोड़ने के लिए, जटिल वर्ण के साथ काम करने की सुविधा भी शामिल है
  • WebView में इथियोपिक, जॉर्जियन, और आर्मेनियन फ़ॉन्ट के लिए सहायता पहले से मौजूद ब्राउज़र
  • WebDriver का इस्तेमाल करने पर इससे WebView का इस्तेमाल करने वाले ऐप्लिकेशन को आसानी से टेस्ट किया जा सकता है

Android ब्राउज़र

ब्राउज़र ऐप्लिकेशन, वेब ऐप्लिकेशन पर काम करने के लिए ये सुविधाएं जोड़ता है:

अनुमतियां

ये नई अनुमतियां हैं:

  • ADD_VOICEMAIL: इससे वॉइसमेल सेवा, डिवाइस में वॉइसमेल मैसेज जोड़ सकती है.
  • BIND_TEXT_SERVICE: SpellCheckerService को लागू करने वाली सेवा को भी इस अनुमति की ज़रूरत होगी.
  • BIND_VPN_SERVICE: VpnService को लागू करने वाली सेवा के लिए, यह अनुमति लेना ज़रूरी है.
  • android.Manifest.permission#READ_PROFILE: इससे ContactsContract.Profile प्रोवाइडर को प्रोफ़ाइल को पढ़ने का ऐक्सेस मिलता है.
  • android.Manifest.permission#WRITE_PROFILE: यह सेवा, ContactsContract.Profile की सेवा देने वाली कंपनी को लिखने का ऐक्सेस देती है.

डिवाइस की सुविधाएं

डिवाइस की नई सुविधाएं:

  • FEATURE_WIFI_DIRECT: इससे पता चलता है कि ऐप्लिकेशन उपयोग पीयर-टू-पीयर कम्यूनिकेशन के लिए वाई-फ़ाई.

Android 4.0 (एपीआई लेवल 14) में एपीआई से जुड़े सभी बदलावों के बारे में ज़्यादा जानने के लिए, एपीआई के बीच अंतर की रिपोर्ट देखें.

पिछले एपीआई

ऊपर बताई गई सभी सुविधाओं के अलावा, Android 4.0, पिछली रिलीज़ के सभी एपीआई के साथ काम करता है. क्योंकि Android 3.x प्लेटफ़ॉर्म केवल बड़ी स्क्रीन वाले उपकरणों के लिए ही उपलब्ध है, यदि आपके पास मुख्य रूप से हैंडसेट के लिए डेवलप किया जा रहा हो, तो हो सकता है कि आपको Android में जोड़े गए सभी एपीआई के बारे में जानकारी न हो हाल ही में रिलीज़ हुए वर्शन में किया गया है.

यहां कुछ ऐसे सबसे खास एपीआई दिए गए हैं जो हो सकता है कि आपसे छूट गए हों और अब उपलब्ध हैं हैंडसेट पर भी:

Android 3.0
  • Fragment: एक फ़्रेमवर्क कॉम्पोनेंट, जिसकी मदद से किसी गतिविधि के एलिमेंट को सेल्फ़-कंटेन्ड मॉड्यूल में इकट्ठा करता है, जो उसका यूज़र इंटरफ़ेस (यूआई) और लाइफ़साइकल तय करता है. फ़्रैगमेंट के लिए डेवलपर गाइड देखें.
  • ActionBar: गतिविधि विंडो के सबसे ऊपर मौजूद, सामान्य टाइटल बार की जगह. इसमें बाईं ओर ऐप्लिकेशन का लोगो शामिल होता है. साथ ही, मेन्यू आइटम के लिए नया इंटरफ़ेस भी मिलता है. देखें कार्रवाई बार डेवलपर गाइड.
  • Loader: यह एक फ़्रेमवर्क कॉम्पोनेंट है, जो यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट के साथ मिलकर, डेटा को असाइनोक्रोनस तरीके से लोड करने में मदद करता है. इससे मुख्य थ्रेड को ब्लॉक किए बिना, डेटा को डाइनैमिक तरीके से लोड किया जा सकता है. देखें लोडर डेवलपर गाइड.
  • सिस्टम क्लिपबोर्ड: ऐप्लिकेशन, सिस्टम-वाइड क्लिपबोर्ड में डेटा (सिर्फ़ टेक्स्ट के अलावा) कॉपी और चिपकाने की अनुमति रखते हैं. क्लिप किया गया डेटा, सादा टेक्स्ट, यूआरआई या इंटेंट हो सकता है. कॉपी और चिपकाने से जुड़ी डेवलपर गाइड देखें.
  • खींचें और छोड़ें: व्यू फ़्रेमवर्क में एपीआई का एक सेट जोड़ा गया है, जो खींचें और छोड़ें वाले ऑपरेशन को आसान बनाता है. देखें खींचें और छोड़ें डेवलपर गाइड.
  • इस नए और सुविधाजनक ऐनिमेशन फ़्रेमवर्क की मदद से, किसी भी प्रॉपर्टी की आर्बिट्रेरी प्रॉपर्टी को ऐनिमेट किया जा सकता है ऑब्जेक्ट (व्यू, ड्रॉ करने लायक, फ़्रैगमेंट, ऑब्जेक्ट या कुछ और) से जुड़ा हो और ऐनिमेशन के पहलुओं को अवधि, इंटरपोलेशन, दोहराव और बहुत कुछ के रूप में. नए फ़्रेमवर्क से Android में ऐनिमेशन बनाए जाते हैं पहले से ज़्यादा आसान हो गया है. प्रॉपर्टी ऐनिमेशन के लिए डेवलपर गाइड देखें.
  • RenderScript ग्राफ़िक्स और कंप्यूट इंजन: RenderScript, नेटिव लेवल पर बेहतर परफ़ॉर्मेंस वाला 3D ग्राफ़िक्स रेंडरिंग और कंप्यूट एपीआई उपलब्ध कराता है. इसे C (C99 स्टैंडर्ड) में लिखा जाता है. यह आपको नेटिव एनवायरमेंट से मिलने वाली परफ़ॉर्मेंस देता है. साथ ही, यह अलग-अलग सीपीयू और जीपीयू पर काम करता है. देखें RenderScript डेवलपर पढ़ें.
  • हार्डवेयर से बेहतर परफ़ॉर्म करने वाले 2D ग्राफ़िक: अब अपने ऐप्लिकेशन के लिए OpenGL रेंडरर को चालू किया जा सकता है. इसके लिए, अपने मेनिफ़ेस्ट एलिमेंट के <application> एलिमेंट में {android:hardwareAccelerated="true"} सेट करें या अलग-अलग <activity> एलिमेंट के लिए सेट करें. यह नतीजा स्मूद ऐनिमेशन, आसानी से स्क्रोल करने की सुविधा, और बेहतर परफ़ॉर्मेंस के साथ-साथ लोगों को जवाब देने की सुविधा भी मिलती है इंटरैक्शन.

    ध्यान दें: अगर आपने अपने ऐप्लिकेशन के minSdkVersion या targetSdkVersion को "14" या उससे ज़्यादा पर सेट किया है, तो हार्डवेयर से तेज़ी लाने की सुविधा डिफ़ॉल्ट रूप से चालू हो जाती है.

  • साथ ही और भी बहुत कुछ. ज़्यादा जानकारी के लिए, Android 3.0 प्लैटफ़ॉर्म के बारे में नोट देखें.
Android 3.1
  • यूएसबी एपीआई: कनेक्ट किए गए सहायक डिवाइसों (जैसे, कीबोर्ड, माउस, मॉनिटर, वेबकैम वगैरह) के साथ इंटिग्रेट करने के लिए, बेहतरीन नए एपीआई Android ऐप्लिकेशन. ये एपीआई, प्लैटफ़ॉर्म में पहले से मौजूद यूएसबी स्टैक और सेवाओं पर आधारित होते हैं. इनमें यूएसबी होस्ट और डिवाइस इंटरैक्शन, दोनों के लिए सहायता शामिल होती है. यूएसबी होस्ट और ऐक्सेसरी डेवलपर गाइड देखें.
  • MTP/PTP API: ऐप्लिकेशन सीधे कनेक्ट किए गए कैमरों और अन्य PTP के साथ इंटरैक्ट कर सकते हैं डिवाइसों के अटैच होने और हटाए जाने पर सूचना पाने के लिए, इन डिवाइसों पर फ़ाइलें और स्टोरेज मैनेज करें और उनसे फ़ाइलों और मेटाडेटा को ट्रांसफ़र किया जा सकता है. MTP API, MTP (मीडिया ट्रांसफ़र प्रोटोकॉल) स्पेसिफ़िकेशन के PTP (पिक्चर ट्रांसफ़र प्रोटोकॉल) सबसेट को लागू करता है. देखें android.mtp दस्तावेज़.
  • आरटीपी एपीआई: Android, अपने पहले से मौजूद आरटीपी (रीयल-टाइम ट्रांसपोर्ट प्रोटोकॉल) स्टैक के लिए एक एपीआई उपलब्ध कराता है. ऐप्लिकेशन, इस एपीआई का इस्तेमाल ऑन-डिमांड या इंटरैक्टिव डेटा स्ट्रीमिंग को मैनेज करने के लिए कर सकते हैं. खास तौर पर, एपीआई का इस्तेमाल करके, वीओआईपी, पुश-टू-टॉक, कॉन्फ़्रेंसिंग, और ऑडियो स्ट्रीमिंग की सुविधा देने वाले ऐप्लिकेशन, सेशन शुरू कर सकते हैं. साथ ही, किसी भी उपलब्ध नेटवर्क पर डेटा स्ट्रीम भेज या पा सकते हैं. android.net.rtp दस्तावेज़ देखें.
  • जॉयस्टिक और अन्य सामान्य मोशन इनपुट के लिए सहायता.
  • ज़्यादा नए एपीआई के बारे में जानने के लिए, Android 3.1 प्लैटफ़ॉर्म के नोट देखें.
Android 3.2
  • नई स्क्रीन पर ऐसे एपीआई काम करते हैं जो आपको अपने ऐप्लिकेशन पर ज़्यादा कंट्रोल देते हैं जो अलग-अलग साइज़ की स्क्रीन पर दिखाए जाते हैं. यह एपीआई, स्क्रीन के मौजूदा सपोर्ट मॉडल को डाइमेंशन के हिसाब से, स्क्रीन के खास साइज़ की रेंज को सटीक तरीके से टारगेट करने की क्षमता डेंसिटी-इंडिपेंडेंट पिक्सल यूनिट (जैसे कि 600dp या 720dp चौड़ी), न कि उनके सामान्य स्क्रीन साइज़ (जैसे कि बड़ा या बहुत बड़ा). उदाहरण के लिए, आपकी मदद करने के लिए यह ज़रूरी है 5" के बीच का अंतर बताएं डिवाइस और 7" डिवाइस, जिसे पारंपरिक रूप से दोनों बकेट के रूप में बकेट किया जाता है "बड़ा" स्क्रीन. यह ब्लॉग पोस्ट देखें, स्क्रीन के साइज़ मैनेज करने के लिए नए टूल.
  • <uses-feature> के लिए नए कॉन्सटेंट लैंडस्केप या पोर्ट्रेट स्क्रीन ओरिएंटेशन की ज़रूरी शर्तों के बारे में बताया जाना चाहिए.
  • डिवाइस का "स्क्रीन का साइज़" स्क्रीन ओरिएंटेशन के दौरान अब कॉन्फ़िगरेशन बदल जाता है बदलें. अगर आपका ऐप्लिकेशन, एपीआई लेवल 13 या उसके बाद के वर्शन को टारगेट करता है, तो आपको "screenSize" कॉन्फ़िगरेशन में हुए बदलाव को मैनेज करना होगा. ऐसा तब भी करना होगा, जब आपको "orientation" कॉन्फ़िगरेशन में हुए बदलाव को मैनेज करना हो. ज़्यादा जानकारी के लिए, android:configChanges देखें.
  • Android 3.2 प्लैटफ़ॉर्म देखें अन्य नए API के लिए नोट.

एपीआई लेवल

Android 4.0 एपीआई को एक पूर्णांक आइडेंटिफ़ायर—14—असाइन किया जाता है. इसे सिस्टम में ही सेव किया जाता है. "एपीआई लेवल" कहे जाने वाले इस आइडेंटिफ़ायर की मदद से, सिस्टम को सही तरीके से यह तय करने में मदद मिलती है कि ऐप्लिकेशन के इंस्टॉल होने से पहले ही, ऐप्लिकेशन सिस्टम के साथ काम करता हो.

अपने ऐप्लिकेशन में Android 4.0 में प्रस्तुत किए गए API का उपयोग करने के लिए, आपको ऐसे Android प्लैटफ़ॉर्म पर चलने वाला ऐप्लिकेशन है जो एपीआई लेवल 14 पर काम करता है या उच्च. अपनी ज़रूरतों के हिसाब से, आपको <uses-sdk> एलिमेंट में android:minSdkVersion="14" एट्रिब्यूट भी जोड़ना पड़ सकता है.

ज़्यादा जानकारी के लिए, एपीआई लेवल क्या है? लेख पढ़ें.