Android 4.1 API

एपीआई लेवल: 16

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

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

Android 4.1 वाले डिवाइसों के लिए अपने ऐप्लिकेशन को बेहतर तरीके से ऑप्टिमाइज़ करने के लिए, आपको targetSdkVersion को "16" पर सेट करना होगा. इसके बाद, इसे Android 4.1 सिस्टम इमेज पर इंस्टॉल करें और जांच करें. इसके बाद, इस बदलाव के साथ अपडेट पब्लिश करें.

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

एपीआई लेवल के काम करने के तरीके के बारे में ज़्यादा जानकारी, एपीआई लेवल क्या है? में उपलब्ध है

ऐप्लिकेशन के कॉम्पोनेंट

अलग-अलग सेवाएं

<service> टैग में android:isolatedProcess="true" की जानकारी देने पर, आपका Service, अपनी अलग यूज़र आईडी प्रोसेस के तहत चलेगा. इस प्रोसेस के पास कोई अनुमति नहीं होती.

मेमोरी मैनेज करना

TRIM_MEMORY_RUNNING_LOW और TRIM_MEMORY_RUNNING_CRITICAL जैसे नए ComponentCallbacks2 कॉन्स्टेंट, सिस्टम के onLowMemory() को कॉल करने से पहले, फ़ोरग्राउंड प्रोसेस को मेमोरी की स्थिति के बारे में ज़्यादा जानकारी देते हैं.

getMyMemoryState(ActivityManager.RunningAppProcessInfo) के नए तरीके की मदद से, मेमोरी की सामान्य स्थिति को वापस पाया जा सकता है.

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

acquireUnstableContentProviderClient() नाम के नए तरीके की मदद से, ऐसे ContentProviderClient को ऐक्सेस किया जा सकता है जो "अस्थिर" हो सकता है. इससे, कॉन्टेंट देने वाली कंपनी के ऐप्लिकेशन के क्रैश होने पर, आपका ऐप्लिकेशन क्रैश नहीं होगा. यह सुविधा तब काम आती है, जब किसी दूसरे ऐप्लिकेशन में कॉन्टेंट उपलब्ध कराने वाली कंपनियों के साथ इंटरैक्ट किया जा रहा हो.

लाइव वॉलपेपर

लाइव वॉलपेपर की झलक देखने की गतिविधि को सीधे लॉन्च करने के लिए नया इंटेंट प्रोटोकॉल, ताकि आप उपयोगकर्ताओं को अपने ऐप्लिकेशन से बाहर निकलने और होम वॉलपेपर पिकर पर जाने के बिना, आसानी से लाइव वॉलपेपर चुनने में मदद कर सकें.

लाइव वॉलपेपर पिकर को लॉन्च करने के लिए, ACTION_CHANGE_LIVE_WALLPAPER का इस्तेमाल करके Intent के साथ startActivity() को कॉल करें. साथ ही, एक और वैरिएबल जोड़ें, जो EXTRA_LIVE_WALLPAPER_COMPONENT में आपके लाइव वॉलपेपर ComponentName को स्ट्रिंग के तौर पर दिखाता हो.

ऐप्लिकेशन स्टैक का नेविगेशन

Android 4.1 में, अप नेविगेशन के लिए सही डिज़ाइन पैटर्न लागू करना बहुत आसान हो जाता है. आपको बस अपनी मेनिफ़ेस्ट फ़ाइल के हर <activity> एलिमेंट में android:parentActivityName जोड़ना होगा. जब उपयोगकर्ता ऐक्शन बार में मौजूद 'अप' बटन दबाता है, तो सिस्टम इस जानकारी का इस्तेमाल करके सही गतिविधि खोलता है. साथ ही, मौजूदा गतिविधि को भी बंद कर देता है. इसलिए, अगर हर गतिविधि के लिए android:parentActivityName का एलान किया जाता है, तो आपको ऐक्शन बार के ऐप्लिकेशन आइकॉन पर क्लिक इवेंट को मैनेज करने के लिए, onOptionsItemSelected() तरीके की ज़रूरत नहीं है. अब सिस्टम उस इवेंट को मैनेज करता है और सही गतिविधि को फिर से शुरू करता है या बनाता है.

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

ध्यान दें: जब उपयोगकर्ता आपके ऐप्लिकेशन में किसी डीप ऐक्टिविटी में जाता है और इससे आपके ऐप्लिकेशन के लिए नया टास्क बनता है, तो सिस्टम टास्क में पैरंट ऐक्टिविटी का स्टैक डालता है. इससे, 'वापस जाएं' बटन दबाने पर, माता-पिता की गतिविधियों के स्टैक से भी वापस पीछे जाया जा सकता है.

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

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

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

onNavigateUp()
जब उपयोगकर्ता अप बटन दबाता है, तो कस्टम ऐक्शन करने के लिए इसे बदलें.
navigateUpTo(Intent)
मौजूदा गतिविधि को खत्म करने और दिए गए Intent से दिखाई गई गतिविधि पर जाने के लिए, इसे कॉल करें. अगर गतिविधि बैक स्टैक में मौजूद है, लेकिन वह सबसे नज़दीकी पैरंट नहीं है, तो मौजूदा गतिविधि और इंटेंट से तय की गई गतिविधि के बीच की सभी अन्य गतिविधियां भी खत्म हो जाती हैं.
getParentActivityIntent()
Intent पाने के लिए, इसे कॉल करें. इससे मौजूदा गतिविधि के लिए लॉजिकल पैरंट शुरू हो जाएगा.
shouldUpRecreateTask(Intent)
इसका इस्तेमाल करके यह पता लगाया जा सकता है कि ऊपर जाने के लिए, एआई की मदद से बनाया गया बैक स्टैक बनाना ज़रूरी है या नहीं. अगर कोई सिंथेटिक स्टैक बनाना ज़रूरी है, तो यह फ़ंक्शन True दिखाता है. अगर सही स्टैक पहले से मौजूद है, तो यह फ़ंक्शन False दिखाता है.
finishAffinity()
इस फ़ंक्शन को कॉल करके, मौजूदा गतिविधि और उसी टास्क से जुड़ी सभी पैरंट गतिविधियों को खत्म करें जो मौजूदा गतिविधि से जुड़ी हैं. अगर onNavigateUp() जैसे डिफ़ॉल्ट व्यवहारों को बदला जाता है, तो आपको ऊपर की ओर नेविगेट करने पर सिंथेटिक बैक स्टैक बनाने के लिए, इस तरीके को कॉल करना चाहिए.
onCreateNavigateUpTaskStack
अगर आपको सिंथेटिक टास्क स्टैक बनाने का तरीका पूरी तरह से कंट्रोल करना है, तो इसे बदलें. अगर आपको अपने बैक स्टैक के इंटेंट में कुछ अतिरिक्त डेटा जोड़ना है, तो आपको onPrepareNavigateUpTaskStack()
को बदलना चाहिए

हालांकि, ज़्यादातर ऐप्लिकेशन को इन एपीआई का इस्तेमाल करने या onPrepareNavigateUpTaskStack() को लागू करने की ज़रूरत नहीं होती. हालांकि, हर <activity> एलिमेंट में android:parentActivityName जोड़कर, सही व्यवहार हासिल किया जा सकता है.

मल्टीमीडिया

मीडिया कोडेक

MediaCodec क्लास, आपके मीडिया को एन्कोड करने और डिकोड करने के लिए, लो-लेवल मीडिया कोडेक का ऐक्सेस उपलब्ध कराती है. मीडिया को कोड में बदलने के लिए, createEncoderByType() पर कॉल करके MediaCodec को इंस्टैंशिएट किया जा सकता है या मीडिया को डिकोड करने के लिए createDecoderByType() पर कॉल किया जा सकता है. इनमें से हर एक तरीके को, उस तरह के मीडिया के लिए एक MIME टाइप दिया जाता है जिसे आपको एन्कोड या डिकोड करना है. जैसे, "video/3gpp" या "audio/vorbis".

MediaCodec का एक इंस्टेंस बनाने के बाद, configure() को कॉल करके प्रॉपर्टी तय की जा सकती हैं. जैसे, मीडिया फ़ॉर्मैट या कॉन्टेंट को एन्क्रिप्ट किया गया है या नहीं.

भले ही, मीडिया को कोड में बदला जा रहा हो या डीकोड किया जा रहा हो, MediaCodec बनाने के बाद की बाकी प्रोसेस वही रहती है. इनपुट ByteBuffer ऑब्जेक्ट का कलेक्शन पाने के लिए, पहले getInputBuffers() को कॉल करें और आउटपुट ByteBuffer ऑब्जेक्ट का कलेक्शन पाने के लिए, getOutputBuffers() को कॉल करें.

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

इसी तरह, आउटपुट बफ़र के लिए, dequeueOutputBuffer() को कॉल करके ByteBuffer की इंडेक्स पोज़िशन पाएं, जहां आपको नतीजे मिलेंगे. ByteBuffer से आउटपुट पढ़ने के बाद, releaseOutputBuffer() पर कॉल करके मालिकाना हक वापस लें.

कोडेक में एन्क्रिप्ट (सुरक्षित) किए गए मीडिया डेटा को मैनेज करने के लिए, सामान्य queueInputBuffer() के बजाय, MediaCrypto एपीआई के साथ queueSecureInputBuffer() को कॉल करें.

कोडेक इस्तेमाल करने के तरीके के बारे में ज़्यादा जानकारी के लिए, MediaCodec दस्तावेज़ देखें.

क्यू के हिसाब से ऑडियो रिकॉर्ड करना

नए तरीके startRecording() की मदद से, MediaSyncEvent से तय की गई क्यू के आधार पर ऑडियो रिकॉर्डिंग शुरू की जा सकती है. MediaSyncEvent से किसी ऑडियो सेशन के बारे में पता चलता है, जैसे कि MediaPlayer से तय किया गया कोई सेशन. यह सेशन पूरा होने पर, ऑडियो रिकॉर्डर को रिकॉर्डिंग शुरू करने के लिए ट्रिगर करता है. उदाहरण के लिए, इस सुविधा का इस्तेमाल करके कोई ऑडियो टोन चलाया जा सकता है. इससे रिकॉर्डिंग सेशन शुरू होने का पता चलता है और रिकॉर्डिंग अपने-आप शुरू हो जाती है. इससे आपको टोन और रिकॉर्डिंग शुरू होने के समय को मैन्युअल तरीके से सिंक करने की ज़रूरत नहीं पड़ती.

टाइम्ड टेक्स्ट ट्रैक

MediaPlayer अब इन-बैंड और आउट-ऑफ़-बैंड टेक्स्ट ट्रैक, दोनों को हैंडल करता है. इन-बैंड टेक्स्ट ट्रैक, MP4 या 3GPP मीडिया सोर्स में टेक्स्ट ट्रैक के तौर पर आते हैं. addTimedTextSource() तरीके का इस्तेमाल करके, बाहरी टेक्स्ट सोर्स के तौर पर, आउट-ऑफ़-बैंड टेक्स्ट ट्रैक जोड़े जा सकते हैं. सभी एक्सटर्नल टेक्स्ट ट्रैक सोर्स जोड़ने के बाद, डेटा सोर्स में उपलब्ध सभी ट्रैक की रीफ़्रेश की गई सूची पाने के लिए getTrackInfo() को कॉल किया जाना चाहिए.

MediaPlayer के साथ इस्तेमाल करने के लिए ट्रैक सेट करने के लिए, आपको selectTrack() को कॉल करना होगा. इसके लिए, आपको उस ट्रैक के लिए इंडेक्स पोज़िशन का इस्तेमाल करना होगा जिसका इस्तेमाल करना है.

जब टेक्स्ट ट्रैक चलाए जाने के लिए तैयार हो, तब सूचना पाने के लिए, MediaPlayer.OnTimedTextListener इंटरफ़ेस लागू करें और उसे setOnTimedTextListener() को पास करें.

ऑडियो प्रभाव

अब AudioEffect क्लास, ऑडियो कैप्चर करते समय, प्री-प्रोसेसिंग के अतिरिक्त टाइप के साथ काम करती है:

  • AcousticEchoCanceler के साथ अकूस्टिक इको कैंसलर (एईसी) रिमोट पार्टी से मिले सिग्नल को कैप्चर किए गए ऑडियो सिग्नल से हटा देता है.
  • AutomaticGainControl के साथ ऑटोमैटिक गेन कंट्रोल (AGC) की सुविधा, कैप्चर किए गए सिग्नल के आउटपुट को अपने-आप सामान्य कर देती है.
  • NoiseSuppressor के साथ ग़ैर-ज़रूरी आवाज़ें कम करने की सुविधा (एनएस), कैप्चर किए गए सिग्नल से बैकग्राउंड का शोर हटाती है.

AudioRecord के किसी एक सबक्लास का इस्तेमाल करके, AudioRecord से कैप्चर किए गए ऑडियो पर, प्री-प्रोसेसर के ये इफ़ेक्ट लागू किए जा सकते हैं.AudioEffect

ध्यान दें: यह गारंटी नहीं है कि सभी डिवाइसों पर ये इफ़ेक्ट काम करेंगे. इसलिए, आपको हमेशा ऑडियो इफ़ेक्ट क्लास पर isAvailable() को कॉल करके, उपलब्धता की जांच करनी चाहिए.

गैपलेस प्लेबैक

अब दो अलग-अलग MediaPlayer ऑब्जेक्ट के बीच, बिना किसी रुकावट के वीडियो चलाया जा सकता है. पहला MediaPlayer खत्म होने से पहले, किसी भी समय setNextMediaPlayer() को कॉल करें. ऐसा करने पर, Android पहले प्लेयर के बंद होने के साथ ही दूसरा प्लेयर चलाने की कोशिश करता है.

मीडिया राऊटर. MediaRouter, MediaRouteActionProvider, और MediaRouteButton जैसे नए एपीआई, मीडिया चलाने की जगह चुनने के लिए स्टैंडर्ड तरीके और यूज़र इंटरफ़ेस (यूआई) उपलब्ध कराते हैं.

कैमरा

ऑटो फ़ोकस की सुविधा

नए इंटरफ़ेस Camera.AutoFocusMoveCallback की मदद से, ऑटो फ़ोकस की सुविधा में होने वाले बदलावों को सुना जा सकता है. आप अपना इंटरफ़ेस setAutoFocusMoveCallback() के साथ रजिस्टर कर सकते हैं. इसके बाद, जब कैमरा लगातार ऑटोफ़ोकस मोड (FOCUS_MODE_CONTINUOUS_VIDEO या FOCUS_MODE_CONTINUOUS_PICTURE) में होगा, तो आपको onAutoFocusMoving() पर कॉल मिलेगा. इससे आपको पता चलेगा कि ऑटो फ़ोकस शुरू हो गया है या बंद हो गया है.

कैमरे का साउंड

MediaActionSound क्लास, कैमरे या अन्य मीडिया ऐक्शन से होने वाली स्टैंडर्ड आवाज़ें बनाने के लिए, एपीआई का एक आसान सेट उपलब्ध कराती है. कस्टम स्टिल या वीडियो कैमरा बनाते समय, सही आवाज़ चलाने के लिए इन एपीआई का इस्तेमाल करें.

कोई आवाज़ चलाने के लिए, MediaActionSound ऑब्जेक्ट का उदाहरण बनाएं. इसके बाद, अपनी पसंद की आवाज़ को पहले से लोड करने के लिए load() को कॉल करें. इसके बाद, सही समय पर play() को कॉल करें.

कनेक्टिविटी

Android बीम

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

setBeamPushUris() तरीका, Uri ऑब्जेक्ट का एक कलेक्शन लेता है. यह कलेक्शन, उस डेटा के बारे में बताता है जिसे आपको अपने ऐप्लिकेशन से ट्रांसफ़र करना है. इसके अलावा, NfcAdapter.CreateBeamUrisCallback इंटरफ़ेस को लागू किया जा सकता है. setBeamPushUrisCallback() को कॉल करके, अपनी गतिविधि के लिए इस इंटरफ़ेस को तय किया जा सकता है.

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

नेटवर्क सेवा खोज

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

नए पैकेज android.net.nsd में नए एपीआई शामिल हैं. इनकी मदद से, लोकल नेटवर्क पर अपनी सेवाएं ब्रॉडकास्ट की जा सकती हैं, नेटवर्क पर मौजूद लोकल डिवाइसों को ढूंढा जा सकता है, और उनसे कनेक्ट किया जा सकता है.

अपनी सेवा को रजिस्टर करने के लिए, आपको सबसे पहले एक NsdServiceInfo ऑब्जेक्ट बनाना होगा. इसके बाद, setServiceName(), setServiceType(), और setPort() जैसे तरीकों का इस्तेमाल करके, अपनी सेवा की अलग-अलग प्रॉपर्टी तय करनी होंगी.

इसके बाद, आपको NsdManager.RegistrationListener को लागू करना होगा और अपने NsdServiceInfo के साथ registerService() को पास करना होगा.

नेटवर्क पर सेवाएं खोजने के लिए, NsdManager.DiscoveryListener लागू करें और उसे discoverServices() को पास करें.

जब आपके NsdManager.DiscoveryListener को मिली सेवाओं के बारे में कॉलबैक मिलते हैं, तो आपको resolveService() को कॉल करके सेवा को ठीक करना होगा. इसके लिए, NsdManager.ResolveListener को लागू करना होगा. इससे, आपको NsdServiceInfo ऑब्जेक्ट मिलता है, जिसमें मिली सेवा के बारे में जानकारी होती है. इसकी मदद से, कनेक्ट करने की प्रोसेस शुरू की जा सकती है.

वाई-फ़ाई P2P सेवा की खोज

Android 4.1 में वाई-फ़ाई पी2पी एपीआई को बेहतर बनाया गया है, ताकि WifiP2pManager में सेवा के जुड़ने से पहले उसकी जानकारी मिल सके. इसकी मदद से, आस-पास मौजूद डिवाइसों को ढूंढा जा सकता है और उनसे कनेक्ट करने से पहले, वाई-फ़ाई पी2पी का इस्तेमाल करके, सेवाओं के हिसाब से उन्हें फ़िल्टर किया जा सकता है. वहीं, नेटवर्क सेवा डिस्कवरी की मदद से, कनेक्ट किए गए किसी मौजूदा नेटवर्क (जैसे, लोकल वाई-फ़ाई नेटवर्क) पर सेवाएं ढूंढी जा सकती हैं.

वाई-फ़ाई पर अपने ऐप्लिकेशन को सेवा के तौर पर ब्रॉडकास्ट करने के लिए, addLocalService() को कॉल करें. साथ ही, WifiP2pServiceInfo ऑब्जेक्ट का इस्तेमाल करके, अपने ऐप्लिकेशन की सेवाओं के बारे में बताएं, ताकि दूसरे डिवाइस आपके ऐप्लिकेशन को ढूंढ सकें और उससे कनेक्ट कर सकें.

वाई-फ़ाई की मदद से आस-पास मौजूद डिवाइसों को ढूंढने की सुविधा शुरू करने के लिए, आपको सबसे पहले यह तय करना होगा कि आपको Bonjour या Upnp का इस्तेमाल करके, डिवाइसों के साथ कैसे कम्यूनिकेट करना है. Bonjour का इस्तेमाल करने के लिए, पहले setDnsSdResponseListeners() के साथ कुछ कॉलबैक लिसनर सेट अप करें. इसमें WifiP2pManager.DnsSdServiceResponseListener और WifiP2pManager.DnsSdTxtRecordListener, दोनों शामिल होते हैं. Upnp का इस्तेमाल करने के लिए, setUpnpServiceResponseListener() को कॉल करें, जिसमें WifiP2pManager.UpnpServiceResponseListener लगते हैं.

स्थानीय डिवाइसों पर सेवाएं खोजने से पहले, आपको addServiceRequest() को भी कॉल करना होगा. जब इस मेथड में पास किए गए WifiP2pManager.ActionListener को कॉलबैक मिल जाता है, तो discoverServices() को कॉल करके, स्थानीय डिवाइसों पर सेवाएं खोजी जा सकती हैं.

स्थानीय सेवाएं मिलने पर, आपको WifiP2pManager.DnsSdServiceResponseListener या WifiP2pManager.UpnpServiceResponseListener पर कॉलबैक मिलेगा. यह इस बात पर निर्भर करता है कि आपने Bonjour या Upnp का इस्तेमाल करने के लिए रजिस्टर किया है या नहीं. दोनों ही मामलों में मिलने वाले कॉलबैक में, WifiP2pDevice ऑब्जेक्ट होता है. यह ऑब्जेक्ट, पीयर डिवाइस के बारे में जानकारी देता है.

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

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

सुलभता

Accessibility service APIs

Android 4.1 में, सुलभता सेवा के एपीआई की पहुंच काफ़ी बढ़ गई है. अब इसकी मदद से, ऐसी सेवाएं बनाई जा सकती हैं जो ज़्यादा इनपुट इवेंट को मॉनिटर करती हैं और उनका जवाब देती हैं. जैसे, onGesture() और अन्य इनपुट इवेंट का इस्तेमाल करके, जटिल जेस्चर. इसके लिए, AccessibilityEvent, AccessibilityNodeInfo, और AccessibilityRecord क्लास में कुछ बदलाव किए गए हैं.

सुलभता सेवाएं भी उपयोगकर्ता की ओर से कार्रवाइयां कर सकती हैं. इनमें performAction और setMovementGranularities का इस्तेमाल करके, क्लिक करना, स्क्रोल करना, और टेक्स्ट पढ़ना शामिल है. performGlobalAction() तरीके की मदद से, सेवाएं भी 'वापस जाएं', 'होम' जैसी कार्रवाइयां कर सकती हैं. साथ ही, हाल ही में इस्तेमाल किए गए ऐप्लिकेशन और सूचनाएं भी खोल सकती हैं.

ऐप्लिकेशन के नेविगेशन में अपनी ज़रूरत के मुताबिक बदलाव करना

Android ऐप्लिकेशन बनाते समय, अब नेविगेशन स्कीम को पसंद के मुताबिक बनाया जा सकता है. इसके लिए, findFocus() और focusSearch() का इस्तेमाल करके फ़ोकस किए जा सकने वाले एलिमेंट और इनपुट विजेट ढूंढें. साथ ही, setAccessibilityFocused() का इस्तेमाल करके फ़ोकस सेट करें.

आसानी से ऐक्सेस किए जा सकने वाले विजेट

नई android.view.accessibility.AccessibilityNodeProvider क्लास की मदद से, सुलभता सेवाओं के लिए कॉम्प्लेक्स कस्टम व्यू दिखाए जा सकते हैं. इससे जानकारी को ज़्यादा सुलभ तरीके से दिखाने में मदद मिलती है. android.view.accessibility.AccessibilityNodeProvider की मदद से, उपयोगकर्ता को ऐडवांस कॉन्टेंट वाला विजेट बनाने की सुविधा मिलती है. जैसे, कैलेंडर ग्रिड. इससे, ऐक्सेसबिलिटी सेवाओं के लिए, विजेट के लेआउट स्ट्रक्चर से अलग लॉजिकल सेमैंटिक स्ट्रक्चर दिखाया जा सकता है. सिमैंटिक स्ट्रक्चर की मदद से, सुलभता सेवाएं दृष्टि बाधित उपयोगकर्ताओं के लिए ज़्यादा काम का इंटरैक्शन मॉडल पेश कर पाती हैं.

कॉपी करके चिपकाना

इंटेंट की मदद से कॉपी और चिपकाना

अब आपके पास setClipData() तरीके का इस्तेमाल करके, ClipData ऑब्जेक्ट को Intent से जोड़ने का विकल्प है. यह खास तौर पर तब मददगार होता है, जब किसी इंटेंट का इस्तेमाल करके, एक से ज़्यादा content: यूआरआई को किसी दूसरे ऐप्लिकेशन में ट्रांसफ़र किया जा रहा हो, जैसे कि एक से ज़्यादा दस्तावेज़ शेयर करते समय. इस तरह से दिए गए content: यूआरआई, पढ़ने या लिखने का ऐक्सेस देने के लिए इंटेंट के फ़्लैग का भी पालन करेंगे. इससे आपको इंटेंट में कई यूआरआई का ऐक्सेस देने की सुविधा मिलती है. ACTION_SEND या ACTION_SEND_MULTIPLE इंटेंट शुरू करने पर, इंटेंट में दिए गए यूआरआई अब ClipData पर अपने-आप भेज दिए जाते हैं, ताकि रिसीवर को ऐक्सेस दिया जा सके.

एचटीएमएल और स्ट्रिंग स्टाइल के लिए सहायता

अब ClipData क्लास, स्टाइल वाले टेक्स्ट के साथ काम करती है. एचटीएमएल या Android स्टाइल वाली स्ट्रिंग का इस्तेमाल किया जा सकता है. newHtmlText() की मदद से, ClipData में एचटीएमएल स्टाइल वाला टेक्स्ट जोड़ा जा सकता है.

रेंडरस्क्रिप्ट

Renderscript की गणना करने की सुविधा को इन सुविधाओं के साथ बेहतर बनाया गया है:

  • एक स्क्रिप्ट में एक से ज़्यादा कर्नेल के लिए सहायता.
  • नई स्क्रिप्ट एपीआई के rsSample में, कंप्यूट से फ़िल्टर किए गए सैंपलर की मदद से, ऐलोकेशन से पढ़ने की सुविधा.
  • #pragma में, एफ़पी के अलग-अलग लेवल के लिए सटीक जानकारी.
  • कंप्यूट स्क्रिप्ट से RS ऑब्जेक्ट की ज़्यादा जानकारी क्वेरी करने की सुविधा.
  • परफ़ॉर्मेंस में कई सुधार किए गए.

नए प्रैगमास भी उपलब्ध हैं, ताकि आपके कंप्यूट रेंडरस्क्रिप्ट के लिए ज़रूरी फ़्लोटिंग पॉइंट की सटीक जानकारी दी जा सके. इससे, सीपीयू पाथ पर फ़ास्ट वेक्टर मैथ ऑपरेशन जैसे NEON जैसे ऑपरेशन चालू किए जा सकते हैं. ये ऑपरेशन, पूरी तरह से IEEE 754-2008 स्टैंडर्ड के साथ नहीं किए जा सकते.

ध्यान दें: एक्सपेरिमेंट के तौर पर उपलब्ध Renderscript ग्राफ़िक्स इंजन अब काम नहीं करता.

ऐनिमेशन

ऐक्टिविटी लॉन्च ऐनिमेशन

अब ज़ूम ऐनिमेशन या अपने कस्टम ऐनिमेशन का इस्तेमाल करके, Activity लॉन्च किया जा सकता है. अपनी पसंद का ऐनिमेशन तय करने के लिए, ActivityOptions एपीआई का इस्तेमाल करके Bundle बनाएं. इसके बाद, इसे किसी भी ऐसे तरीके में पास किया जा सकता है जो गतिविधि शुरू करता है, जैसे कि startActivity().

ActivityOptions क्लास में, हर तरह के ऐनिमेशन के लिए एक अलग तरीका शामिल होता है. ऐसा इसलिए, ताकि ऐक्टिविटी खुलने पर, आपको अपनी पसंद के ऐनिमेशन दिखाए जा सकें:

makeScaleUpAnimation()
ऐनिमेशन बनाता है, जो स्क्रीन पर तय की गई शुरुआती पोज़िशन और तय किए गए शुरुआती साइज़ से, गतिविधि विंडो को बड़ा करता है. उदाहरण के लिए, Android 4.1 की होम स्क्रीन, ऐप्लिकेशन खोलने के लिए इसका इस्तेमाल करती है.
makeThumbnailScaleUpAnimation()
यह एक ऐनिमेशन बनाता है, जो तय की गई जगह से शुरू होने वाली गतिविधि विंडो को बड़ा करता है. साथ ही, यह एक थंबनेल इमेज भी उपलब्ध कराता है. उदाहरण के लिए, Android 4.1 में हाल ही में इस्तेमाल किए गए ऐप्लिकेशन की विंडो, किसी ऐप्लिकेशन पर वापस जाने के लिए इसका इस्तेमाल करती है.
makeCustomAnimation()
आपके संसाधनों के हिसाब से ऐनिमेशन बनाता है: एक ऐनिमेशन, गतिविधि के शुरू होने के लिए और दूसरा ऐनिमेशन, गतिविधि के बंद होने के लिए.

टाइम ऐनिमेशन

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

यूज़र इंटरफ़ेस

सूचनाएं

Android 4.1 में, बड़े कॉन्टेंट वाले हिस्सों, बड़ी इमेज की झलक, कई ऐक्शन बटन, और कॉन्फ़िगर की जा सकने वाली प्राथमिकता वाली सूचनाएं बनाई जा सकती हैं.

सूचना के स्टाइल

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

Notification.BigPictureStyle
ऐसी सूचनाओं के लिए जिनमें बड़ी इमेज अटैच की गई हो.
Notification.BigTextStyle
ऐसी सूचनाएं जिनमें बहुत ज़्यादा मैसेज शामिल होते हैं, जैसे कि कोई एक ईमेल.
Notification.InboxStyle
ऐसी सूचनाओं के लिए जिनमें स्ट्रिंग की सूची शामिल होती है, जैसे कि एक से ज़्यादा ईमेल के स्निपेट.
सूचना क्रियाएं

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

ऐक्शन बटन जोड़ने के लिए, addAction() को कॉल करें. इस तरीके में तीन आर्ग्युमेंट होते हैं: आइकॉन के लिए ड्रॉ करने लायक रिसॉर्स, बटन के लिए टेक्स्ट, और एक PendingIntent, जो परफ़ॉर्म करने की कार्रवाई के बारे में बताता है.

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

अब सूची में सूचना के क्रम पर असर डालने के लिए, सिस्टम को यह बताया जा सकता है कि आपकी सूचना के क्रम पर असर डालना कितना ज़रूरी है. इसके लिए, setPriority() की मदद से प्राथमिकता सेट करें. Notification क्लास में PRIORITY_* कॉन्स्टेंट की मदद से तय किए गए पांच अलग-अलग प्राथमिकता लेवल में से किसी एक को पास किया जा सकता है. डिफ़ॉल्ट तौर पर, यह वैल्यू PRIORITY_DEFAULT होती है. इसके दो लेवल ऊपर और दो लेवल नीचे होते हैं.

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

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

Android 4.0 (Ice Cream Sandwich) में नए फ़्लैग जोड़े गए हैं, ताकि सिस्टम यूज़र इंटरफ़ेस (यूआई) के एलिमेंट दिखने की सुविधा को कंट्रोल किया जा सके. जैसे, सिस्टम बार को मंद करना या हैंडसेट पर उसे पूरी तरह से हटाना. Android 4.1 में कुछ और फ़्लैग जोड़े गए हैं. इनकी मदद से, setSystemUiVisibility() को कॉल करके और ये फ़्लैग पास करके, सिस्टम यूज़र इंटरफ़ेस (यूआई) एलिमेंट और उनसे जुड़े गतिविधि लेआउट के दिखने के तरीके को और बेहतर तरीके से कंट्रोल किया जा सकता है:

SYSTEM_UI_FLAG_FULLSCREEN
ऐसा सिस्टम यूज़र इंटरफ़ेस (यूआई) छिपाता है जो ज़रूरी नहीं है. जैसे, स्टेटस बार. अगर आपकी गतिविधि, ओवरले मोड में ऐक्शन बार का इस्तेमाल करती है, तो यह फ़्लैग ऐक्शन बार को भी छिपा देता है. साथ ही, इसे छिपाने और दिखाने के दौरान, एक ही तरह के ऐनिमेशन का इस्तेमाल करता है. ऐसा करने के लिए, android:windowActionBarOverlay को चालू करें.
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
आपके ऐक्टिविटी लेआउट को उसी स्क्रीन एरिया का इस्तेमाल करने के लिए सेट करता है जो SYSTEM_UI_FLAG_FULLSCREEN चालू होने पर उपलब्ध होता है. भले ही, सिस्टम यूज़र इंटरफ़ेस (यूआई) एलिमेंट अब भी दिख रहे हों. आपके लेआउट के कुछ हिस्सों पर, सिस्टम यूज़र इंटरफ़ेस (यूआई) का लेयर दिखेगा. हालांकि, अगर आपका ऐप्लिकेशन अक्सर SYSTEM_UI_FLAG_FULLSCREEN की मदद से सिस्टम यूज़र इंटरफ़ेस (यूआई) को छिपाता और दिखाता है, तो यह सुविधा काम की है. ऐसा इसलिए, क्योंकि इससे हर बार सिस्टम यूज़र इंटरफ़ेस (यूआई) के छिपने या दिखने पर, आपके लेआउट को नए लेआउट के बॉउंड में अडजस्ट होने से रोका जा सकता है.
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
आपके ऐक्टिविटी लेआउट को उसी स्क्रीन एरिया का इस्तेमाल करने के लिए सेट करता है जो SYSTEM_UI_FLAG_HIDE_NAVIGATION (Android 4.0 में जोड़ा गया) को चालू करने पर उपलब्ध होता है. ऐसा तब भी होता है, जब सिस्टम यूज़र इंटरफ़ेस (यूआई) एलिमेंट अब भी दिख रहे हों. आपके लेआउट के कुछ हिस्सों को नेविगेशन बार के ऊपर लगाया जाएगा. हालांकि, यह तब काम आता है, जब आपका ऐप्लिकेशन अक्सर नेविगेशन बार को छिपाता और दिखाता है. इसमें SYSTEM_UI_FLAG_HIDE_NAVIGATION होता है. ऐसा इसलिए, क्योंकि जब भी नेविगेशन बार छिपता या दिखता है, तो यह आपके लेआउट को नए लेआउट के साथ अडजस्ट होने से रोकता है.
SYSTEM_UI_FLAG_LAYOUT_STABLE
अगर SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN और/या SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION का इस्तेमाल किया जा रहा है, तो हो सकता है कि आप इस फ़्लैग को जोड़ना चाहें. इससे यह पक्का किया जा सकता है कि किसी व्यू पर fitSystemWindows() को कॉल करने पर, तय किए गए सीमाएं, स्क्रीन के उपलब्ध स्पेस के हिसाब से एक जैसी बनी रहें. इसका मतलब है कि इस फ़्लैग के सेट होने पर, fitSystemWindows() ऐसा व्यवहार करेगा जैसे कि सिस्टम यूज़र इंटरफ़ेस के सभी एलिमेंट दिख रहे हों, भले ही आपने उन्हें छिपा दिया हो.

सिस्टम के यूज़र इंटरफ़ेस (यूआई) से जुड़े अन्य फ़्लैग के बारे में ज़्यादा जानने के लिए, Android 4.0 में जोड़े गए फ़्लैग के बारे में पढ़ें.

रिमोट व्यू

GridLayout और ViewStub अब रिमोट व्यू हैं. इसलिए, इनका इस्तेमाल ऐप्लिकेशन के विजेट और सूचना को पसंद के मुताबिक लेआउट के लेआउट में किया जा सकता है.

फ़ॉन्ट फ़ैमिली

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

Roboto फ़ॉन्ट के वैरिएंट का पूरा सेट यहां दिया गया है:

  • सामान्य
  • इटैलिक
  • बोल्ड
  • बोल्ड-इटैलिक
  • हल्का
  • हल्का-इटैलिक
  • कॉन्डेंस्ड रेगुलर
  • कंडेंस्ड इटैलिक
  • कंडेंस्ड बोल्ड
  • कंडेंस्ड बोल्ड-इटैलिक

इनमें से किसी एक को textStyle एट्रिब्यूट के साथ नए fontFamily एट्रिब्यूट के साथ लागू किया जा सकता है.

fontFamily के लिए ये वैल्यू इस्तेमाल की जा सकती हैं:

  • "sans-serif" for regular Roboto
  • "sans-serif-light" for Roboto Light
  • "sans-serif-condensed" for Roboto Condensed

इसके बाद, textStyle वैल्यू "bold" और "italic" का इस्तेमाल करके, बोल्ड और/या इटैलिक फ़ॉन्ट लागू किया जा सकता है. आप ऐसे दोनों तरीके लागू कर सकते हैं: android:textStyle="bold|italic".

इसके अलावा, Typeface.create() का इस्तेमाल भी किया जा सकता है. उदाहरण के लिए, Typeface.create("sans-serif-light", Typeface.NORMAL).

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

एक से ज़्यादा इनपुट डिवाइस

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

getInputDeviceIds() को कॉल करके, कनेक्ट किए गए सभी इनपुट डिवाइसों के बारे में जानकारी पाई जा सकती है. इससे पूर्णांकों का कलेक्शन मिलता है, जिसमें से हर एक किसी अलग इनपुट डिवाइस का आईडी होता है. इसके बाद, किसी इनपुट डिवाइस आईडी से InputDevice पाने के लिए, getInputDevice() को कॉल करें.

अगर आपको नए इनपुट डिवाइसों के कनेक्ट होने, बदलने या डिसकनेक्ट होने की सूचना चाहिए, तो InputManager.InputDeviceListener इंटरफ़ेस लागू करें और उसे registerInputDeviceListener() पर रजिस्टर करें.

इनपुट कंट्रोलर के लिए वाइब्रेट हो

अगर कनेक्ट किए गए इनपुट डिवाइसों में वाइब्रेशन की सुविधाएं हैं, तो अब उन डिवाइसों के वाइब्रेशन को कंट्रोल किया जा सकता है. इसके लिए, InputDevice पर getVibrator() को कॉल करके, मौजूदा Vibrator एपीआई का इस्तेमाल करें.

अनुमतियां

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

READ_EXTERNAL_STORAGE
बाहरी स्टोरेज को सुरक्षित तरीके से पढ़ने का ऐक्सेस देता है. डिफ़ॉल्ट रूप से, Android 4.1 में सभी ऐप्लिकेशन के पास अब भी पढ़ने का ऐक्सेस है. आने वाले समय में, इसकी जगह पर एक नई अनुमति दी जाएगी. इसके तहत, ऐप्लिकेशन को इस अनुमति का इस्तेमाल करके, साफ़ तौर पर डेटा पढ़ने का अनुरोध करना होगा. अगर आपके ऐप्लिकेशन ने पहले से ही लिखने का ऐक्सेस मांगा है, तो उसे अपने-आप पढ़ने का ऐक्सेस भी मिल जाएगा. डेवलपर के पास, पढ़ने के ऐक्सेस पर पाबंदी लगाने का नया विकल्प है. इससे डेवलपर यह जांच कर सकते हैं कि आने वाले समय में Android उनके ऐप्लिकेशन के साथ कैसा व्यवहार करेगा.
android.Manifest.permission.READ_USER_DICTIONARY
ऐप्लिकेशन को उपयोगकर्ता शब्दकोश को पढ़ने की अनुमति देता है. इसकी ज़रूरत सिर्फ़ किसी IME या सेटिंग ऐप्लिकेशन जैसे डिक्शनरी एडिटर को होनी चाहिए.
READ_CALL_LOG
ऐप्लिकेशन को सिस्टम का कॉल लॉग पढ़ने की अनुमति देता है. इसमें इनकमिंग और आउटगोइंग कॉल की जानकारी शामिल होती है.
WRITE_CALL_LOG
ऐप्लिकेशन को आपके फ़ोन पर सेव किए गए सिस्टम के कॉल लॉग में बदलाव करने की अनुमति देता है
android.Manifest.permission.WRITE_USER_DICTIONARY
इससे ऐप्लिकेशन को उपयोगकर्ता के शब्दकोश में लिखने की अनुमति मिलती है.

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

Android 4.1 में, उन डिवाइसों के लिए एक नई सुविधा का एलान किया गया है जो टेलिविज़न स्क्रीन पर यूज़र इंटरफ़ेस दिखाने के लिए बनाए गए हैं: FEATURE_TELEVISION. अगर आपके ऐप्लिकेशन को टेलिविज़न इंटरफ़ेस की ज़रूरत है, तो इसकी जानकारी देने के लिए अपनी मेनिफ़ेस्ट फ़ाइल में <uses-feature> एलिमेंट का इस्तेमाल करें:

<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...
</manifest>

इस सुविधा से, "टीवी" को लिविंग रूम में टीवी देखने के अनुभव के तौर पर दिखाया जाता है: यह बड़ी स्क्रीन पर दिखता है, जहां उपयोगकर्ता दूर बैठा होता है और इनपुट के लिए डी-पैड जैसा कुछ इस्तेमाल किया जाता है. आम तौर पर, टच या माउस/पॉइंटर-डिवाइस का इस्तेमाल नहीं किया जाता.