एपीआई लेवल: 18
Android 4.3 (JELLY_BEAN_MR2
)
है, जो gel Bean रिलीज़ में अपडेट किया गया है. इसमें लोगों और ऐप्लिकेशन को नई सुविधाएं दी गई हैं
डेवलपर. इस दस्तावेज़ में उन लेखों के बारे में
नए एपीआई हैं.
ऐप्लिकेशन डेवलपर के रूप में, आपको Android 4.3 सिस्टम इमेज डाउनलोड करनी चाहिए और SDK Manager से SDK प्लैटफ़ॉर्म जल्द से जल्द. यदि आपके पास Android 4.3 चलाने वाला डिवाइस नहीं है जिस पर अपने ऐप की जाँच करने के लिए, Android 4.3 सिस्टम का उपयोग करें Android एम्युलेटर पर अपने ऐप्लिकेशन की जांच करने के लिए इमेज का इस्तेमाल करें. फिर Android 4.3 प्लेटफ़ॉर्म के लिए अपने ऐप्लिकेशन बनाएं, ताकि आप नए एपीआई हैं.
टारगेट एपीआई लेवल को अपडेट करना
Android 4.3 चलाने वाले डिवाइसों के लिए अपने ऐप को बेहतर ढंग से ऑप्टिमाइज़ करने के लिए,
आपको अपने targetSdkVersion
को
"18"
, इसे Android 4.3 सिस्टम इमेज पर इंस्टॉल करें,
इसकी जांच करें, फिर इस बदलाव के साथ अपडेट पब्लिश करें.
आप Android 4.3 में API का उपयोग कर सकते हैं, जबकि पुराने वर्शन का भी समर्थन कर सकते हैं:
अपने कोड की ऐसी शर्तें सेट करें जो लागू करने से पहले सिस्टम के एपीआई लेवल की जांच करती हैं
ऐसे एपीआई जो आपके minSdkVersion
पर काम नहीं करते.
पुराने सिस्टम के साथ काम करने के तरीके को बनाए रखने के बारे में ज़्यादा जानने के लिए, Supporting बिट के वर्शन
प्लैटफ़ॉर्म के वर्शन.
Android सहायता लाइब्रेरी में कई एपीआई भी उपलब्ध हैं. इनकी मदद से पुराने वर्शन में नई सुविधाओं के बारे में बात करेंगे.
एपीआई लेवल कैसे काम करते हैं, इस बारे में ज़्यादा जानने के लिए एपीआई क्या है, यह पढ़ें लेवल?
व्यवहार में होने वाले अहम बदलाव
अगर आपने Android के लिए पहले कोई ऐप्लिकेशन पब्लिश किया था, तो ध्यान रखें कि आपका ऐप्लिकेशन Android 4.3 में हुए बदलावों का असर पड़ता है.
अगर आपका ऐप्लिकेशन इंप्लिसिट इंटेंट का इस्तेमाल करता है...
आपका ऐप्लिकेशन, प्रतिबंधित प्रोफ़ाइल में शायद ठीक से काम न करे.
प्रतिबंधित प्रोफ़ाइल वाले माहौल में रहने वाले उपयोगकर्ता शायद ये काम न कर पाएं
जिसमें सभी सामान्य Android ऐप्लिकेशन मौजूद हों. उदाहरण के लिए, प्रतिबंधित प्रोफ़ाइल में
वेब ब्राउज़र और कैमरा ऐप्लिकेशन बंद किए गए. इसलिए, आपके ऐप्लिकेशन को यह अंदाज़ा नहीं लगाना चाहिए कि कौनसे ऐप्लिकेशन
ऐसा इसलिए है, क्योंकि startActivity()
को इसके बिना कॉल करने पर
यह पुष्टि करना कि कोई ऐप्लिकेशन Intent
का इस्तेमाल कर सकता है या नहीं,
आपका ऐप्लिकेशन किसी प्रतिबंधित प्रोफ़ाइल में क्रैश हो सकता है.
इंप्लिसिट इंटेंट का इस्तेमाल करते समय, आपको हमेशा इस बात की पुष्टि करनी चाहिए कि कोई ऐप्लिकेशन, इंटेंट को हैंडल करने के लिए उपलब्ध है. इसके लिए, resolveActivity()
या queryIntentActivities()
को कॉल करें. उदाहरण के लिए:
Kotlin
val intent = Intent(Intent.ACTION_SEND) ... if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } else { Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show() }
Java
Intent intent = new Intent(Intent.ACTION_SEND); ... if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show(); }
अगर आपका ऐप्लिकेशन खातों पर निर्भर करता है...
आपका ऐप्लिकेशन, प्रतिबंधित प्रोफ़ाइल में शायद ठीक से काम न करे.
प्रतिबंधित प्रोफ़ाइल वाले एनवायरमेंट में मौजूद उपयोगकर्ताओं के पास डिफ़ॉल्ट रूप से, उपयोगकर्ता खातों का ऐक्सेस नहीं होता.
अगर आपका ऐप्लिकेशन Account
पर निर्भर है, तो हो सकता है कि आपका ऐप्लिकेशन क्रैश हो जाए या ठीक से काम करे
प्रतिबंधित प्रोफ़ाइल में उपयोग किए जाने पर अनपेक्षित रूप से.
अगर आपको प्रतिबंधित प्रोफ़ाइल को अपना ऐप्लिकेशन पूरी तरह इस्तेमाल करने से रोकना है, क्योंकि आपके
ऐप्लिकेशन, खाते की संवेदनशील जानकारी पर निर्भर करता है. इसलिए, अपने मेनिफ़ेस्ट के <application>
में android:requiredAccountType
एट्रिब्यूट के बारे में बताएं
एलिमेंट.
अगर आपको प्रतिबंधित प्रोफ़ाइल को अपने ऐप्लिकेशन का इस्तेमाल जारी रखने की अनुमति देनी है, भले ही वे ऐसा नहीं कर पा रही हों अपना खाता खुद बनाते हैं, तो आप या तो ऐप्लिकेशन की उन सुविधाओं को बंद कर सकते हैं जिनके लिए खाते की ज़रूरत होती है या प्रतिबंधित प्रोफ़ाइल को मुख्य उपयोगकर्ता के बनाए गए खातों को ऐक्सेस करने की अनुमति देना. ज़्यादा के लिए जानकारी के लिए, सेक्शन देखें प्रतिबंधित प्रोफ़ाइल में सहायक खातों की सुविधा के बारे में नीचे बताया गया है.
अगर आपका ऐप्लिकेशन VideoView का इस्तेमाल करता है...
Android 4.3 पर आपका वीडियो छोटा दिख सकता है.
Android के पिछले वर्शन में, VideoView
विजेट गलत था
layout_height
और layout_width
के लिए "wrap_content"
वैल्यू, "match_parent"
के बराबर है. इसलिए, हो सकता है कि लंबाई या चौड़ाई के लिए "wrap_content"
का इस्तेमाल करते समय, आपने पहले आपकी पसंद के वीडियो का लेआउट उपलब्ध कराया हो,
ऐसा करने से Android 4.3 और इसके बाद वाले वर्शन पर बहुत छोटे वीडियो देखने को मिल सकते हैं. इस समस्या को ठीक करने के लिए,
"match_parent"
के साथ "wrap_content"
और पुष्टि करें कि आपका वीडियो उम्मीद के मुताबिक दिखाई दे रहा है
Android 4.3 और साथ ही पुराने वर्शन पर.
प्रतिबंधित प्रोफ़ाइल
Android टैबलेट पर, उपयोगकर्ता अब मुख्य उपयोगकर्ता के आधार पर प्रतिबंधित प्रोफ़ाइल बना सकते हैं. जब उपयोगकर्ता प्रतिबंधित प्रोफ़ाइल बनाते हैं, तब वे पाबंदियां लागू कर सकते हैं. जैसे कि कौनसे ऐप्लिकेशन प्रोफ़ाइल के लिए उपलब्ध. Android 4.3 में API का नया सेट आपको बेहतर बनाने की सुविधा भी देता है आपके डेवलप किए जाने वाले ऐप्लिकेशन के लिए पाबंदी वाली सेटिंग. उदाहरण के लिए, नए API का इस्तेमाल करके, इस टूल का इस्तेमाल करके, उपयोगकर्ता यह कंट्रोल कर सकते हैं कि प्रतिबंधित प्रोफ़ाइल वातावरण.
आपकी ओर से बनाई गई पाबंदियों को कंट्रोल करने के लिए, यूज़र इंटरफ़ेस (यूआई) को सिस्टम
सेटिंग ऐप्लिकेशन. अपने ऐप्लिकेशन की पाबंदी वाली सेटिंग को उपयोगकर्ता को दिखाने के लिए,
आपको ACTION_GET_RESTRICTION_ENTRIES
इंटेंट पाने वाला BroadcastReceiver
बनाकर, अपने ऐप्लिकेशन पर लागू होने वाली पाबंदियों के बारे में बताना होगा. सिस्टम, क्वेरी करने के लिए इस इंटेंट को शुरू करता है
उपलब्ध पाबंदियों के लिए सभी ऐप्लिकेशन उपलब्ध कराता है. इसके बाद, यह यूज़र इंटरफ़ेस (यूआई) बनाता है, ताकि प्राथमिक उपयोगकर्ता को ये काम करने की अनुमति मिल सके
पाबंदी वाली हर प्रोफ़ाइल के लिए पाबंदियां मैनेज की जा सकती हैं.
onReceive()
तरीके में
BroadcastReceiver
के लिए, आपको अपने ऐप्लिकेशन पर की गई हर पाबंदी के लिए एक RestrictionEntry
बनाना होगा. हर RestrictionEntry
एक पाबंदी वाले टाइटल, ब्यौरे, और इनमें से किसी एक के बारे में बताता है
ये डेटा टाइप:
- पाबंदी के लिए
TYPE_BOOLEAN
सही या गलत. - ऐसी पाबंदी के लिए
TYPE_CHOICE
जिसमें एकाधिक विकल्प जो पारस्परिक रूप से विशिष्ट हैं (रेडियो बटन विकल्प). - इस पाबंदी के लिए
TYPE_MULTI_SELECT
में ऐसे कई विकल्प हैं जो म्यूचुअली एक्सक्लूसिव (चेकबॉक्स विकल्प) नहीं हैं.
इसके बाद, सभी RestrictionEntry
ऑब्जेक्ट को एक ArrayList
में रखा जाता है और उसे ब्रॉडकास्ट रिसीवर के नतीजे में,
EXTRA_RESTRICTIONS_LIST
अतिरिक्त.
सिस्टम, सेटिंग ऐप्लिकेशन में आपके ऐप्लिकेशन की पाबंदियों के लिए यूज़र इंटरफ़ेस (यूआई) बनाता है और हर एक को सेव करता है
हर RestrictionEntry
के लिए, आपकी दी गई यूनीक कुंजी के साथ पाबंदी
ऑब्जेक्ट है. जब उपयोगकर्ता आपका ऐप्लिकेशन खोलता है, तो आप
getApplicationRestrictions()
पर कॉल किया जा रहा है.
यह हर पाबंदी के लिए, की-वैल्यू पेयर वाला Bundle
दिखाता है
आपने RestrictionEntry
ऑब्जेक्ट की मदद से तय किया है.
अगर आप ऐसे और खास प्रतिबंध देना चाहते हैं जिन्हें बूलियन तरीके से हैंडल नहीं किया जा सकता, तो
और कई विकल्प वाले मान का इस्तेमाल किया है, तो एक ऐसी गतिविधि बनाई जा सकती है जिसमें उपयोगकर्ता यह तय कर सके कि
साथ ही, उपयोगकर्ताओं को पाबंदी सेटिंग में जाकर यह गतिविधि देखने की अनुमति दें. अपने
ब्रॉडकास्ट रिसीवर, EXTRA_RESTRICTIONS_INTENT
अतिरिक्त को शामिल करें
Bundle
नतीजे में. इस अतिरिक्त सुविधा में Intent
की जानकारी होनी चाहिए
यह दिखाता है कि Activity
क्लास लॉन्च करनी है (इसका इस्तेमाल करें
इंटेंट के साथ EXTRA_RESTRICTIONS_INTENT
पास करने के लिए putParcelable()
तरीका).
जब प्राइमरी उपयोगकर्ता अपनी पसंद के मुताबिक पाबंदियां सेट करने के लिए आपकी गतिविधि डालेगा, तो आपका
गतिविधि को फिर
EXTRA_RESTRICTIONS_LIST
या EXTRA_RESTRICTIONS_BUNDLE
कुंजी, जो इस बात पर निर्भर करता है कि
RestrictionEntry
ऑब्जेक्ट या की-वैल्यू पेयर, क्रम से हैं.
पाबंदी वाली प्रोफ़ाइल में खातों की सुविधा देना
प्रतिबंधित प्रोफ़ाइल के लिए, प्राथमिक उपयोगकर्ता के तौर पर जोड़े गए सभी खाते उपलब्ध होते हैं, लेकिन
AccountManager
एपीआई से खातों को डिफ़ॉल्ट रूप से ऐक्सेस नहीं किया जा सकता.
पाबंदी वाले दायरे में रहते हुए, AccountManager
का इस्तेमाल करके किसी खाते को जोड़ने की कोशिश करने पर
प्रोफ़ाइल बनाते हैं, तो आपको गड़बड़ी का नतीजा मिलेगा. इन पाबंदियों की वजह से, आपके पास ये हैं
तीन विकल्प:
पाबंदी वाली प्रोफ़ाइल से किसी खाते का ऐक्सेस पाने के लिए, आपको <application> टैग में android:restrictedAccountType
एट्रिब्यूट जोड़ना होगा:
<application ... android:restrictedAccountType="com.example.account.type" >
चेतावनी: इस एट्रिब्यूट को चालू करने पर आपको ऐप्लिकेशन को, पाबंदी वाली प्रोफ़ाइलों से मुख्य उपयोगकर्ता के खातों को ऐक्सेस करने की अनुमति देनी होगी. इसलिए, आपको इसकी अनुमति देनी चाहिए सिर्फ़ तब, जब आपके ऐप्लिकेशन पर दिखने वाली जानकारी से व्यक्तिगत पहचान ज़ाहिर न हो संवेदनशील मानी जाने वाली जानकारी (पीआईआई). सिस्टम की सेटिंग, मुख्य तौर पर आपका ऐप्लिकेशन उनके खातों को प्रतिबंधित प्रोफ़ाइल की अनुमति देता हो, इसलिए यह उपयोगकर्ता को साफ़ तौर पर बताया जाना चाहिए आपके ऐप्लिकेशन के काम करने के लिए खाते का ऐक्सेस ज़रूरी है. अगर हो सके, तो आपको यह तय करने वाले कि मुख्य उपयोगकर्ता को खाते का कितना ऐक्सेस देना है, इसके लिए उपयोगकर्ताओं को ज़रूरत के हिसाब से पाबंदी कंट्रोल उपलब्ध कराना आपके ऐप्लिकेशन में इसकी अनुमति है.
अगर आपको खातों का इस्तेमाल करना है, लेकिन असल में उन्हें अपने ऐप्लिकेशन के मुख्य
की सुविधा है, तो आप खाते की उपलब्धता देख सकते हैं और सुविधाएं उपलब्ध न होने पर उन्हें बंद कर सकते हैं.
पहले आपको यह देखना चाहिए कि कोई मौजूदा खाता मौजूद है या नहीं. अगर ऐसा नहीं है, तो यह क्वेरी करें कि
getUserRestrictions()
पर कॉल करके नया खाता बनाया जा सकता है और नतीजे में DISALLOW_MODIFY_ACCOUNTS
की अतिरिक्त जांच की जा सकती है. अगर यह true
है,
तो आपको अपने ऐप्लिकेशन की उस सुविधा को बंद कर देना चाहिए जिसके लिए खातों को ऐक्सेस करने की ज़रूरत है.
उदाहरण के लिए:
Kotlin
val um = context.getSystemService(Context.USER_SERVICE) as UserManager val restrictions: Bundle = um.userRestrictions if (restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false)) { // cannot add accounts, disable some functionality }
Java
UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); Bundle restrictions = um.getUserRestrictions(); if (restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false)) { // cannot add accounts, disable some functionality }
ध्यान दें: इस स्थिति में, आपको एलान नहीं करना चाहिए मेनिफ़ेस्ट फ़ाइल में कोई नया एट्रिब्यूट जोड़ें.
इसके बजाय, अगर पाबंदी वाली प्रोफ़ाइलों के लिए आपका ऐप्लिकेशन उपलब्ध नहीं है, तो
आपका ऐप्लिकेशन, खाते में मौजूद संवेदनशील निजी जानकारी (न कि प्रतिबंधित प्रोफ़ाइल) पर निर्भर करता है
वर्तमान में नए खाते नहीं जोड़े जा सकते), जोड़ें
<application> टैग के लिए android:requiredAccountType
एट्रिब्यूट:
<application ... android:requiredAccountType="com.example.account.type" >
उदाहरण के लिए, Gmail ऐप्लिकेशन इस एट्रिब्यूट का इस्तेमाल, प्रतिबंधित प्रोफ़ाइलों, क्योंकि स्वामी का निजी ईमेल प्रतिबंधित प्रोफ़ाइल के लिए उपलब्ध नहीं होना चाहिए.
वायरलेस और कनेक्टिविटी
ब्लूटूथ कम ऊर्जा (स्मार्ट रेडी)
Android अब android.bluetooth
में नए एपीआई के साथ, ब्लूटूथ स्मार्ट (LE) के साथ काम करता है.
नए एपीआई की मदद से, ऐसे Android ऐप्लिकेशन बनाए जा सकते हैं जो ब्लूटूथ स्मार्ट के साथ कम्यूनिकेट करते हैं
सहायक डिवाइस, जैसे कि धड़कन की दर मापने वाले मॉनिटर और पेडोमीटर.
क्योंकि Bluetooth LE एक हार्डवेयर सुविधा है, जो
Android पर चलने वाले डिवाइस, तो आपको अपनी मेनिफ़ेस्ट फ़ाइल में <uses-feature>
का एलान करना होगा
"android.hardware.bluetooth_le"
के लिए एलिमेंट:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
अगर आप Android के क्लासिक ब्लूटूथ एपीआई के बारे में पहले से जानते हैं, तो ध्यान दें कि
ब्लूटूथ LE API में कुछ अंतर हैं. सबसे अहम बात यह है कि अब एक BluetoothManager
क्लास मौजूद है जिसका इस्तेमाल आपको कुछ हाई लेवल की कार्रवाइयों के लिए करना चाहिए
जैसे, BluetoothAdapter
हासिल करना,
और किसी डिवाइस की स्थिति की जाँच की जा रही है. उदाहरण के लिए, यहां बताया गया है कि अब आपको
BluetoothAdapter
:
Kotlin
val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager bluetoothAdapter = bluetoothManager.adapter
Java
final BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); bluetoothAdapter = bluetoothManager.getAdapter();
ब्लूटूथ LE वाले सहायक डिवाइस (जैसे, कीबोर्ड, माउस, मॉनिटर, वेबकैम वगैरह) का पता लगाने के लिए, BluetoothAdapter
पर startLeScan()
को कॉल करें. इसके बाद, इसे लागू करें
BluetoothAdapter.LeScanCallback
के इंटरफ़ेस में से एक है. जब ब्लूटूथ
अडैप्टर, ब्लूटूथ LE वाले सहायक डिवाइस का पता लगाता है. ऐसा करने पर, आपके BluetoothAdapter.LeScanCallback
को लागू करने के लिए
onLeScan()
तरीका. यह
तरीका आपको BluetoothDevice
ऑब्जेक्ट देता है, जो
डिवाइस की पहचान की गई, उस डिवाइस की आरएसएसआई वैल्यू, और एक बाइट अरे जिसमें डिवाइस
विज्ञापन रिकॉर्ड.
अगर आपको सिर्फ़ खास तरह के सहायक डिवाइसों (जैसे, कीबोर्ड, माउस, मॉनिटर, वेबकैम वगैरह) के लिए स्कैन करना है, तो startLeScan()
को कॉल करके UUID
ऑब्जेक्ट का कलेक्शन शामिल किया जा सकता है. इससे पता चलता है कि आपका ऐप्लिकेशन किन GATT सेवाओं के साथ काम करता है.
ध्यान दें: सिर्फ़ ब्लूटूथ LE डिवाइसों के लिए स्कैन किया जा सकता है या पुराने API का उपयोग करके क्लासिक ब्लूटूथ डिवाइस के लिए स्कैन करें. एलई और क्लासिक, दोनों भाषाओं के लिए स्कैन नहीं किया जा सकता एक ही बार में ब्लूटूथ डिवाइस.
इसके बाद, किसी Bluetooth LE वाले सहायक डिवाइस से कनेक्ट करने के लिए, connectGatt()
पर कॉल करें
BluetoothDevice
ऑब्जेक्ट के ज़रिए, इसे लागू करने के लिए पास किया गया
BluetoothGattCallback
. BluetoothGattCallback
को लागू करने पर, आपको कनेक्टिविटी से जुड़े कॉलबैक मिलते हैं
स्थिति डिवाइस और अन्य इवेंट के साथ दिखाई देती है. यह onConnectionStateChange()
के दौरान है
कॉलबैक जा सकता है, जो डिवाइस के साथ कम्यूनिकेशन करना शुरू कर सकता है. ऐसा तब किया जा सकता है, जब तरीके STATE_CONNECTED
को नई स्थिति के तौर पर पास कर दे.
किसी डिवाइस पर ब्लूटूथ की सुविधाएं ऐक्सेस करने के लिए, यह ज़रूरी है कि आपका ऐप्लिकेशन, ब्लूटूथ के लिए उपयोगकर्ता की अनुमतियां. ज़्यादा जानकारी के लिए, ब्लूटूथ कम ऊर्जा देने वाली एपीआई गाइड देखें.
सिर्फ़ वाई-फ़ाई स्कैन करने वाला मोड
उपयोगकर्ता की जगह की जानकारी का पता लगाने के लिए, Android यह पता लगाने के लिए वाई-फ़ाई का इस्तेमाल कर सकता है आस-पास के ऐक्सेस पॉइंट स्कैन करके जगह की जानकारी. हालांकि, उपयोगकर्ता अक्सर वाई-फ़ाई बंद रखते हैं बैटरी बचाएं, जिससे जगह की जानकारी का डेटा कम सटीक होता है. Android में अब केवल-स्कैन मोड जो स्थान का पता लगाने के लिए डिवाइस के वाई-फ़ाई को ऐक्सेस पॉइंट स्कैन करने देता है इन्हें ऐक्सेस पॉइंट से कनेक्ट नहीं किया जाता है. इसलिए, बैटरी खर्च बहुत कम हो जाता है.
अगर आप उपयोगकर्ता की जगह की जानकारी पाना चाहते हैं, लेकिन फ़िलहाल वाई-फ़ाई बंद है, तो
उपयोगकर्ता को ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE
कार्रवाई के साथ startActivity()
को कॉल करके सिर्फ़ वाई-फ़ाई स्कैन करने वाला मोड चालू करने की अनुमति देनी है.
वाई-फ़ाई कॉन्फ़िगरेशन
नए WifiEnterpriseConfig
एपीआई, एंटरप्राइज़-आधारित सेवाओं को ये काम करने की अनुमति देते हैं
मैनेज किए जा रहे डिवाइसों के लिए, वाई-फ़ाई को अपने-आप कॉन्फ़िगर होने की सुविधा देता है.
इनकमिंग कॉल के लिए पहले से तैयार जवाब
Android 4.0 के बाद से, "क्विक रिस्पॉन्स" नाम की सुविधा इससे उपयोगकर्ता,
कॉल रिसीव करने या डिवाइस को अनलॉक किए बिना, तुरंत मैसेज वाली कॉल आती हैं.
अब तक, इन फटाफट मैसेज को हमेशा डिफ़ॉल्ट मैसेजिंग ऐप्लिकेशन मैनेज करता था. अब कोई भी ऐप्लिकेशन
Service
बनाकर, यह एलान कर सकता है कि वह इन मैसेज को मैनेज कर सकता है
ACTION_RESPOND_VIA_MESSAGE
के लिए इंटेंट फ़िल्टर का इस्तेमाल करें.
जब उपयोगकर्ता पहले से तैयार जवाब के साथ किसी इनकमिंग कॉल का जवाब देता है, तो फ़ोन ऐप्लिकेशन
यूआरआई के साथ ACTION_RESPOND_VIA_MESSAGE
इंटेंट
मैसेज पाने वाले (कॉलर) और EXTRA_TEXT
की अन्य जानकारी के बारे में
जिस मैसेज को उपयोगकर्ता भेजना चाहता है. जब आपकी सेवा को यह मकसद मिलता है, तो उसे यह बताना चाहिए कि
और तुरंत अपने-आप बंद हो जाता है (आपके ऐप्लिकेशन को कोई गतिविधि नहीं दिखानी चाहिए).
यह इंटेंट पाने के लिए, आपको SEND_RESPOND_VIA_MESSAGE
की अनुमति का एलान करना होगा.
मल्टीमीडिया
MediaExtractor और MediaCodec को बेहतर बनाने की सुविधा
Android अब आपके लिए अपना डाइनैमिक अडैप्टिव लिखना आसान बनाता है
ISO/IEC 23009-1 मानक के अनुसार एचटीटीपी (DASH) प्लेयर पर स्ट्रीमिंग,
MediaCodec
और MediaExtractor
में मौजूदा एपीआई का इस्तेमाल करके. इन एपीआई में मौजूद फ़्रेमवर्क को अपडेट किया गया है, ताकि
फ़्रैगमेंट की गई MP4 फ़ाइलों को पार्स किया जा रहा है. हालांकि, एमपीडी मेटाडेटा को पार्स करने की ज़िम्मेदारी अब भी आपके ऐप्लिकेशन की है
और MediaExtractor
को अलग-अलग स्ट्रीम पास करना हो.
अगर आपको एन्क्रिप्ट (सुरक्षित) किए गए कॉन्टेंट के साथ DASH का इस्तेमाल करना है, तो ध्यान दें कि getSampleCryptoInfo()
तरीका, एन्क्रिप्ट (सुरक्षित) किए गए हर मीडिया के स्ट्रक्चर की जानकारी देने वाला MediaCodec.CryptoInfo
मेटाडेटा दिखाता है
सैंपल. साथ ही, getPsshInfo()
तरीका इसमें जोड़ा गया है
MediaExtractor
ताकि आप अपने DASH मीडिया के लिए PSSH मेटाडेटा को ऐक्सेस कर सकें.
यह तरीका UUID
ऑब्जेक्ट को बाइट में मैप करता है, जिसमें
UUID
क्रिप्टो स्कीम के बारे में बताता है और बाइट डेटा के हिसाब से हैं
उस स्कीम को आज़माएं.
मीडिया डीआरएम
नई MediaDrm
क्लास, डिजिटल अधिकारों के लिए मॉड्यूलर समाधान उपलब्ध कराती है
मीडिया प्लेबैक से DRM समस्याओं को अलग करके अपने मीडिया कॉन्टेंट के साथ मैनेजमेंट (डीआरएम) कर सकते हैं. इसके लिए
उदाहरण के लिए, इस एपीआई की मदद से, Widevine से एन्क्रिप्ट (सुरक्षित) किए गए कॉन्टेंट को बिना किसी रुकावट के चलाया जा सकता है
ताकि वे Widevine मीडिया फ़ॉर्मैट का इस्तेमाल कर सकें. यह DRM समाधान, DASH सामान्य एन्क्रिप्शन की सुविधा भी देता है, ताकि आप
अपने कॉन्टेंट के साथ कई तरह की डीआरएम स्कीम का इस्तेमाल कर सकते हैं.
ओपेक कुंजी अनुरोध वाले मैसेज और प्रोसेस को पाने के लिए, MediaDrm
का इस्तेमाल किया जा सकता है
लाइसेंस पाने और प्रावधान करने के लिए, सर्वर से मिलने वाले मुख्य-रिस्पॉन्स मैसेज. आपका ऐप्लिकेशन
सर्वर के साथ नेटवर्क कम्यूनिकेशन को मैनेज करने की ज़िम्मेदारी होगी; MediaDrm
क्लास सिर्फ़ मैसेज जनरेट और प्रोसेस करने की सुविधा देती है.
MediaDrm
एपीआई को,
MediaCodec
एपीआई जिन्हें Android 4.1 (एपीआई लेवल 16) में पेश किया गया था,
इसमें आपके कॉन्टेंट को कोड में बदलने और डिकोड करने के लिए, MediaCodec
, एन्क्रिप्ट (सुरक्षित) किए गए कॉन्टेंट को मैनेज करने के लिए MediaCrypto
, और MediaExtractor
शामिल हैं
करने के लिए डिज़ाइन किया गया है.
पहले आपको MediaExtractor
बनाना होगा और
MediaCodec
ऑब्जेक्ट. इसके बाद, डीआरएम स्कीम की पहचान करने वाली सुविधा को ऐक्सेस किया जा सकता है
UUID
, आम तौर पर कॉन्टेंट के मेटाडेटा से लिया जाता है और इसका इस्तेमाल एक
अपने कंस्ट्रक्टर के साथ MediaDrm
ऑब्जेक्ट का इंस्टेंस.
किसी प्लैटफ़ॉर्म से वीडियो को कोड में बदलने का तरीका
Android 4.1 (एपीआई लेवल 16) ने MediaCodec
क्लास को कम लेवल के लिए जोड़ा
मीडिया कॉन्टेंट को कोड में बदलने और डिकोड करने की सुविधा. वीडियो को एन्कोड करते समय, Android 4.1 के लिए यह ज़रूरी है कि आप उपलब्ध कराएं
ByteBuffer
कलेक्शन वाले मीडिया को अपलोड करता है, लेकिन Android 4.3 अब आपको एन्कोडर में इनपुट के तौर पर Surface
का इस्तेमाल करने की अनुमति देता है. उदाहरण के लिए, यह आपको इनपुट को एन्कोड करने की
या OpenGL ES से जनरेट किए गए फ़्रेम का इस्तेमाल करके.
अपने एन्कोडर में इनपुट के तौर पर Surface
का इस्तेमाल करने के लिए, पहले MediaCodec
को configure()
पर कॉल करें.
इसके बाद, createInputSurface()
पर कॉल करके Surface
पाएं. इस पर आपका मीडिया स्ट्रीम किया जा सकता है.
उदाहरण के लिए, OpenGL की विंडो के तौर पर दिए गए Surface
का इस्तेमाल किया जा सकता है
संदर्भ के बारे में जानने के लिए उसे eglCreateWindowSurface()
को पास करें. इसके बाद, सरफ़ेस को रेंडर करते समय, फ़्रेम को MediaCodec
को पास करने के लिए, eglSwapBuffers()
को कॉल करें.
कोड में बदलने के लिए, MediaCodec
पर start()
को कॉल करें. काम पूरा हो जाने पर, signalEndOfInputStream()
पर कॉल करें
एन्कोडिंग को खत्म करने के लिए, और इस पर release()
को कॉल करें:
Surface
.
मीडिया मल्टीप्लेक्सिंग
नई MediaMuxer
क्लास की मदद से, एक ऑडियो स्ट्रीम के बीच मल्टीप्लेक्सिंग की जा सकती है
और एक वीडियो स्ट्रीम. ये एपीआई, MediaExtractor
के जैसा काम करते हैं
क्लास को Android 4.2 में डी-मल्टीप्लेक्सिंग (डीमक्सिंग) मीडिया के लिए जोड़ा गया.
MediaMuxer.OutputFormat
में, इस्तेमाल किए जा सकने वाले आउटपुट फ़ॉर्मैट के बारे में बताया गया है. इस समय,
फ़िलहाल, सिर्फ़ MP4 फ़ॉर्मैट काम करता है और MediaMuxer
एक बार में सिर्फ़ एक ऑडियो स्ट्रीम और/या एक वीडियो स्ट्रीम.
MediaMuxer
को ज़्यादातर MediaCodec
के साथ काम करने के लिए डिज़ाइन किया गया है
ताकि आप MediaCodec
के ज़रिए वीडियो प्रोसेस कर सकें. इसके बाद,
को MediaMuxer
तक MP4 फ़ाइल में ट्रांसफ़र करता है. बेहतर परफ़ॉर्म करने के लिए, MediaExtractor
के साथ MediaMuxer
का भी इस्तेमाल किया जा सकता है
इसके लिए, उसे कोड में बदलने या डिकोड करने की ज़रूरत नहीं होती.
RemoteControlClient के लिए प्लेबैक प्रोग्रेस और स्क्रबिंग
Android 4.0 (एपीआई लेवल 14) में, RemoteControlClient
को
रिमोट कंट्रोल क्लाइंट से मीडिया प्लेबैक कंट्रोल चालू करने की अनुमति दें. उदाहरण के लिए,
लॉक स्क्रीन. Android 4.3 अब ऐसे नियंत्रकों के लिए प्लेबैक प्रदर्शित करने की क्षमता प्रदान करता है
प्लेबैक को स्क्रब करने के लिए स्थिति और नियंत्रण. अगर आपने
मीडिया ऐप्लिकेशन, जो RemoteControlClient
एपीआई के साथ काम करता है. इसके बाद, आप वीडियो चलाने की अनुमति दे सकते हैं
स्क्रबिंग करते हुए दो नए इंटरफ़ेस लागू किए गए.
सबसे पहले, आपको FLAG_KEY_MEDIA_POSITION_UPDATE
फ़्लैग को चालू करना होगा. इसके लिए, इसे
setTransportControlsFlags()
.
इसके बाद, इन दो नए इंटरफ़ेस को लागू करें:
RemoteControlClient.OnGetPlaybackPositionListener
- इसमें कॉलबैक
onGetPlaybackPosition()
शामिल है, जो मौजूदा स्थिति का अनुरोध करता है आपके मीडिया का है. RemoteControlClient.OnPlaybackPositionUpdateListener
- इसमें कॉलबैक
onPlaybackPositionUpdate()
शामिल है, जो यह आपके ऐप्लिकेशन को आपके मीडिया के लिए एक नया टाइम कोड बताता है. ऐसा तब होता है, जब उपयोगकर्ता रिमोट कंट्रोल यूज़र इंटरफ़ेस (यूआई).प्लेबैक को नई जगह पर अपडेट करने के बाद,
setPlaybackState()
पर कॉल करके बताएं कि वीडियो चलाने की नई स्थिति, पोज़िशन, और स्पीड.
इन इंटरफ़ेस के साथ, आप setOnGetPlaybackPositionListener()
को कॉल करके और इन्हें अपने RemoteControlClient
के लिए सेट कर सकते हैं
setPlaybackPositionUpdateListener()
.
ग्राफ़िक्स
OpenGL ES 3.0 के साथ काम करने की सुविधा
Android 4.3 में OpenGL ES 3.0 के लिए Java इंटरफ़ेस और नेटिव सपोर्ट की सुविधा मिलती है. मुख्य नई सुविधा OpenGL ES 3.0 में दिए गए विकल्पों में ये शामिल हैं:
- बेहतर विज़ुअल इफ़ेक्ट इस्तेमाल करने की सुविधा
- स्टैंडर्ड सुविधा के तौर पर, अच्छी क्वालिटी वाले ETC2/EAC टेक्सचर कंप्रेस करने की सुविधा
- पूर्णांक और 32-बिट फ़्लोटिंग पॉइंट सपोर्ट के साथ, GLSL ES शेडिंग लैंग्वेज का नया वर्शन
- बेहतर टेक्स्चर रेंडरिंग
- टेक्सचर साइज़ और रेंडर-बफ़र फ़ॉर्मैट के लिए, बड़े पैमाने पर स्टैंडर्ड तय करना
Android पर OpenGL ES 3.0 के लिए Java इंटरफ़ेस, GLES30
के साथ दिया गया है.
OpenGL ES 3.0 का इस्तेमाल करते समय, पक्का करें कि आप अपनी मेनिफ़ेस्ट फ़ाइल में इसके बारे में,
<uses-feature>
टैग और android:glEsVersion
एट्रिब्यूट की वैल्यू सबमिट करें. उदाहरण के लिए:
<manifest> <uses-feature android:glEsVersion="0x00030000" /> ... </manifest>
साथ ही, setEGLContextClientVersion()
को कॉल करके OpenGL ES संदर्भ बताना न भूलें,
3
को वर्शन के रूप में पास कर रही हूँ.
OpenGL ES का इस्तेमाल करने के बारे में ज़्यादा जानकारी के साथ-साथ यह देखने के लिए कि डिवाइस पर काम करता है या नहीं रनटाइम के समय OpenGL ES वर्शन के लिए, OpenGL ES API गाइड देखें.
ड्रॉएबल के लिए Mipmapping
अपने बिट मैप या ड्रॉ करने लायक सोर्स के तौर पर मिपमैप का इस्तेमाल करके, और अलग-अलग तरह की इमेज स्केल होनी चाहिए. ये खास तौर पर तब काम आ सकती हैं, जब आपको अपने एनीमेशन के दौरान स्केल की जाने वाली इमेज.
Android 4.2 (एपीआई लेवल 17) ने Bitmap
में, मिपमैप के साथ काम करने की सुविधा जोड़ी है
क्लास—Android आपके Bitmap
में मिप इमेज को स्वैप कर देता है जब आप
ने एक मिपमैप स्रोत दिया और setHasMipMap()
को सक्षम किया है. Android 4.3 में, अब BitmapDrawable
ऑब्जेक्ट के लिए भी मिपमैप चालू किया जा सकता है. ऐसा करने के लिए, आपको मीलमैप ऐसेट उपलब्ध करानी होगी और
किसी बिटमैप संसाधन फ़ाइल में या hasMipMap()
को कॉल करके android:mipMap
एट्रिब्यूट सेट करने के लिए.
यूज़र इंटरफ़ेस
ओवरले देखें
नई ViewOverlay
क्लास, सबसे ऊपर एक पारदर्शी लेयर देती है
View
, जिसमें विज़ुअल कॉन्टेंट जोड़ा जा सकता है.
सकता है. आप getOverlay()
पर कॉल करके, किसी भी View
के लिए ViewOverlay
पा सकते हैं. ओवरले
हमेशा इसके होस्ट व्यू (जिस व्यू से इसे बनाया गया था) के समान आकार और स्थिति होती है,
इससे होस्ट व्यू के सामने कॉन्टेंट जोड़ा जा सकता है, लेकिन उसे बढ़ाया नहीं जा सकता
की सीमाएँ शामिल हैं.
ViewOverlay
का इस्तेमाल करना, खास तौर पर तब काम आता है, जब आपको
ऐनिमेशन, जैसे कि किसी व्यू को कंटेनर के बाहर स्लाइड करना या आइटम को स्क्रीन पर इधर-उधर ले जाना
वह भी व्यू हैरारकी पर असर डाले बिना. हालांकि, ओवरले का इस्तेमाल किया जा सकने वाला हिस्सा
उसके होस्ट व्यू के समान क्षेत्र तक प्रतिबंधित है, अगर आप बाहर जाते हुए किसी व्यू को ऐनिमेट करना चाहते हैं
लेआउट में इसकी स्थिति है, तो आपको ऐसे पैरंट व्यू से ओवरले का इस्तेमाल करना होगा जिसमें
लेआउट बाउंड है.
जब Button
जैसे विजेट व्यू के लिए ओवरले बनाया जाता है, तो
कॉल करके ओवरले में Drawable
ऑब्जेक्ट जोड़ सकता है
add(Drawable)
. अगर RelativeLayout
जैसे किसी लेआउट व्यू के लिए getOverlay()
को कॉल किया जाता है,
वापस किया गया ऑब्जेक्ट ViewGroupOverlay
है. कॉन्टेंट बनाने
ViewGroupOverlay
क्लास एक सब-क्लास है
कुल ViewOverlay
का इस्तेमाल करें, जो आपको View
जोड़ने की भी अनुमति देता है
add(View)
पर कॉल करके ऑब्जेक्ट देखें.
ध्यान दें: ओवरले में जोड़े जाने वाले ड्रॉएबल और व्यू वे सिर्फ़ विज़ुअल होते हैं. उन्हें फ़ोकस या इनपुट इवेंट नहीं मिल सकते.
उदाहरण के लिए, नीचे दिया गया कोड, व्यू को सही जगह पर रखकर दाईं ओर स्लाइड किए गए व्यू को ऐनिमेट करता है और फिर उस व्यू पर अनुवाद ऐनिमेशन परफ़ॉर्म करेंगे:
Kotlin
val view: View? = findViewById(R.id.view_to_remove) val container: ViewGroup? = view?.parent as ViewGroup container?.apply { overlay.add(view) ObjectAnimator.ofFloat(view, "translationX", right.toFloat()) .start() }
Java
View view = findViewById(R.id.view_to_remove); ViewGroup container = (ViewGroup) view.getParent(); container.getOverlay().add(view); ObjectAnimator anim = ObjectAnimator.ofFloat(view, "translationX", container.getRight()); anim.start();
ऑप्टिकल बाउंड लेआउट
उन व्यू के लिए जिनमें नौ-पैच बैकग्राउंड इमेज होती हैं, अब आप तय कर सकते हैं कि उन्हें साथ ही, "ऑप्टिकल" के आधार पर आस-पास के बैकग्राउंड इमेज की सीमाएं "क्लिप" के बजाय की सीमा से बाहर है.
उदाहरण के लिए, पहली और दूसरी इमेज एक जैसे लेआउट दिखाती हैं. हालांकि, पहली इमेज का वर्शन यह है क्लिप की सीमाओं (डिफ़ॉल्ट व्यवहार) का इस्तेमाल करके, दूसरी इमेज में ऑप्टिकल बाउंड का इस्तेमाल किया गया है. क्योंकि बटन और फ़ोटो फ़्रेम के लिए इस्तेमाल की गई नाइन-पैच इमेज में किनारों के आस-पास पैडिंग (जगह) है. वे क्लिप बाउंड का इस्तेमाल करते समय एक-दूसरे से या टेक्स्ट से अलाइन नहीं दिखते.
ध्यान दें: पहली और दूसरी इमेज के स्क्रीनशॉट में "दिखाएं लेआउट बाउंड" डेवलपर सेटिंग चालू की गई. हर व्यू के लिए, लाल रंग की लाइनें ऑप्टिकल बाउंड, नीली लाइनें क्लिप की बाउंड को दिखाती हैं, और गुलाबी रंग का मतलब है कि मार्जिन.
व्यू को उनकी ऑप्टिकल बाउंड के हिसाब से अलाइन करने के लिए, किसी एक पैरंट लेआउट में android:layoutMode
एट्रिब्यूट को "opticalBounds"
पर सेट करें. उदाहरण के लिए:
<LinearLayout android:layoutMode="opticalBounds" ... >
यह काम करे, इसके लिए आपके व्यू के बैकग्राउंड पर लागू की गई नौ-पैच वाली इमेज में, नाइन-पैच फ़ाइल के नीचे और दाईं ओर की लाल रेखाओं का उपयोग करके ऑप्टिकल बाउंड (जैसे कि तीसरी इमेज में दिखाया गया है). लाल रेखाएं उस क्षेत्र को इंगित करती हैं जिसे घटाना चाहिए क्लिप बाउंड है, जिससे चित्र की ऑप्टिकल सीमाएं छोड़ दी गई हैं.
जब अपने लेआउट में ViewGroup
के लिए ऑप्टिकल बाउंड्री चालू की जाती है, तो सभी
डिसेंडेंट व्यू, ऑप्टिकल बाउंड लेआउट मोड को इनहेरिट करते हैं, जब तक कि आप इसे 'इसके हिसाब से ग्रुप बनाएं' ग्रुप के लिए नहीं बदलते
android:layoutMode
को "clipBounds"
पर सेट कर रही हूँ. सभी लेआउट एलिमेंट
उनके बच्चे के विचारों की ऑप्टिकल सीमाओं के आधार पर, खुद के बाउंड
व्यू की संख्या बढ़ा सकते हैं. हालांकि, लेआउट एलिमेंट (ViewGroup
की सब-क्लास)
वर्तमान में उनकी अपनी पृष्ठभूमि पर लागू किए गए नौ-पैच छवियों के लिए ऑप्टिकल बाउंड का समर्थन नहीं करता.
अगर View
, ViewGroup
या उसकी किसी सब-क्लास को सब-क्लास करके कस्टम व्यू बनाया जाता है, तो आपका व्यू इन ऑप्टिकल बाउंड व्यवहार को इनहेरिट करेगा.
ध्यान दें: Holo थीम के साथ काम करने वाले सभी विजेट अपडेट कर दिए गए हैं
ऑप्टिकल बाउंड के साथ, Button
, Spinner
,
EditText
, और अन्य. तो आप इस मूल्य को सेट करके तुरंत लाभ उठा सकते हैं
अगर आपका ऐप्लिकेशन Holo थीम लागू करता है, तो "opticalBounds"
के लिए android:layoutMode
एट्रिब्यूट
(Theme.Holo
, Theme.Holo.Light
वगैरह).
ड्रॉ 9-पैच टूल का इस्तेमाल करके अपनी नौ-पैच इमेज के लिए ऑप्टिकल बाउंड्री तय करने के लिए, 'कंट्रोल' को दबाकर रखें जब क्लिक करके बॉर्डर पिक्सल पर क्लिक करें.
रेक्टैंगल वैल्यू के लिए ऐनिमेशन
अब RectEvaluator
की मदद से, Rect
की दो वैल्यू को ऐनिमेट किया जा सकता है. यह नई क्लास TypeEvaluator
का एक इंप्लीमेंटेशन है, जिसे आप ValueAnimator.setEvaluator()
को पास कर सकते हैं.
विंडो अटैच और फ़ोकस लिसनर
पहले, अगर आपको यह सुनना था कि आपका व्यू कब विंडो से जुड़ा या अलग हुआ था या
जब इसका फ़ोकस बदल गया, तो आपको View
क्लास को बदलकर,
onAttachedToWindow()
और onDetachedFromWindow()
या onWindowFocusChanged()
को लागू करें.
इवेंट को अटैच और अलग करने के लिए, अब ViewTreeObserver.OnWindowAttachListener
को लागू किया जा सकता है. साथ ही, इसे व्यू पर सेट करने के लिए,
addOnWindowAttachListener()
.
फ़ोकस इवेंट पाने के लिए, ViewTreeObserver.OnWindowFocusChangeListener
को लागू किया जा सकता है. साथ ही, इसे व्यू पर सेट किया जा सकता है
addOnWindowFocusChangeListener()
.
टीवी ओवरस्कैन समर्थन
अब आपके पास ओवरस्कैन की सुविधा चालू करके, यह पक्का करने का विकल्प है कि आपका ऐप्लिकेशन हर टेलीविज़न की पूरी स्क्रीन पर दिखे
आपके ऐप्लिकेशन के लेआउट के लिए. ओवरस्कैन मोड, FLAG_LAYOUT_IN_OVERSCAN
फ़्लैग की मदद से तय किया जाता है. इसे प्लैटफ़ॉर्म थीम की मदद से चालू किया जा सकता है, जैसे कि
Theme_DeviceDefault_NoActionBar_Overscan
या इसे चालू करके
पसंद के मुताबिक थीम में windowOverscan
शैली.
स्क्रीन ओरिएंटेशन
<activity>
टैग की screenOrientation
एट्रिब्यूट के लिए अतिरिक्त वैल्यू इस्तेमाल की जा सकती हैं, ताकि उपयोगकर्ता की अपने-आप दिशा बदलने (ऑटो-रोटेट) की सेटिंग के हिसाब से यह तय किया जा सके:
"userLandscape"
"sensorLandscape"
की तरह काम करता है. हालांकि, अगर उपयोगकर्ता अपने-आप दिशा बदलना (ऑटो-रोटेट) की सुविधा बंद करता है, तो तो यह सामान्य लैंडस्केप ओरिएंटेशन में लॉक हो जाता है और फ़्लिप नहीं होगा."userPortrait"
"sensorPortrait"
की तरह काम करता है. हालांकि, अगर उपयोगकर्ता अपने-आप दिशा बदलने की सुविधा को बंद करता है, तो यह सामान्य पोर्ट्रेट ओरिएंटेशन में लॉक हो जाता है और फ़्लिप नहीं होगा."fullUser"
- यह
"fullSensor"
की तरह काम करता है और इसे छोड़कर सभी चार दिशाओं में घुमाने की अनुमति देता है अगर उपयोगकर्ता, स्क्रीन के अपने-आप दिशा बदलने (ऑटो-रोटेट) की सुविधा को बंद करता है, तो यह उपयोगकर्ता के पसंदीदा ओरिएंटेशन में लॉक हो जाता है.
इसके अलावा, अब ऐप्लिकेशन का ओरिएंटेशन लॉक करने के लिए, "locked"
का एलान भी किया जा सकता है
स्क्रीन का मौजूदा ओरिएंटेशन.
रोटेशन ऐनिमेशन
इसमें नया rotationAnimation
फ़ील्ड:
WindowManager
से आपको तीन ऐनिमेशन में से किसी एक को चुनने की सुविधा मिलती है
जब सिस्टम स्क्रीन ओरिएंटेशन स्विच करता है, तो का उपयोग करना चाहते हैं. ये तीन ऐनिमेशन हैं:
ध्यान दें: ये ऐनिमेशन सिर्फ़ तब उपलब्ध होते हैं, जब आपने अपनी गतिविधि को "फ़ुलस्क्रीन" का इस्तेमाल करने के लिए सेट किया हो मोड चालू करें, जिसे Theme.Holo.NoActionBar.Fullscreen
जैसी थीम की मदद से चालू किया जा सकता है.
उदाहरण के लिए, यहां बताया गया है कि "क्रॉसफ़ेड" को कैसे चालू किया जा सकता है ऐनिमेशन:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val params: WindowManager.LayoutParams = window.attributes params.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE window.attributes = params ... }
Java
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WindowManager.LayoutParams params = getWindow().getAttributes(); params.rotationAnimation = WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE; getWindow().setAttributes(params); ... }
उपयोगकर्ता का इनपुट
नए तरह के सेंसर
नए TYPE_GAME_ROTATION_VECTOR
सेंसर की मदद से, चुंबकीय रुकावट की चिंता किए बिना, डिवाइस के रोटेशन का पता लगाया जा सकता है. TYPE_ROTATION_VECTOR
सेंसर के उलट, TYPE_GAME_ROTATION_VECTOR
चुंबकीय उत्तर पर आधारित नहीं है.
नए TYPE_GYROSCOPE_UNCALIBRATED
और TYPE_MAGNETIC_FIELD_UNCALIBRATED
सेंसर, बिना प्रोसेस हुए सेंसर डेटा देते हैं
पक्षपात का अनुमान लगाने पर ध्यान दे सकता है. इसका मतलब है कि मौजूदा TYPE_GYROSCOPE
और TYPE_MAGNETIC_FIELD
सेंसर, ऐसा सेंसर डेटा देते हैं जो जाइरो-ड्रिफ़्ट और हार्ड आयरन के अनुमानित बायस को ध्यान में रखता है
दूसरे डिवाइसों पर भी दिखता है. वहीं दूसरी ओर, नया "बिना कैलिब्रेट किया" का के कई वर्शन हैं, तो
सेंसर डेटा का इस्तेमाल कर सकता है. साथ ही, अनुमानित बायस वैल्यू को अलग से दिखा सकता है. ये सेंसर आपको
इसकी मदद से, सेंसर डेटा के लिए अनुमानित फ़र्क़ को बढ़ाकर, सेंसर डेटा के लिए अपना कस्टम कैलिब्रेशन किया जाता है
बाहरी डेटा शामिल है.
सूचना को सुनने की सुविधा
Android 4.3 में एक नई सेवा श्रेणी, NotificationListenerService
जोड़ी गई है, जो आपके ऐप्लिकेशन को सिस्टम की ओर से पोस्ट की जाने वाली नई सूचनाओं के बारे में जानकारी पाने देती है.
अगर आपका ऐप्लिकेशन फ़िलहाल सिस्टम की सूचनाओं को ऐक्सेस करने के लिए, सुलभता सेवा के एपीआई का इस्तेमाल करता है, तो आपको इसके बजाय इन एपीआई का इस्तेमाल करने के लिए अपने ऐप्लिकेशन को अपडेट करना चाहिए.
संपर्क सूची
"संपर्क किए जा सकने वाले लोगों" के लिए क्वेरी
नई संपर्क कंपनी क्वेरी, Contactables.CONTENT_URI
, एक Cursor
पाने का कारगर तरीका देती है, जिसमें बताई गई क्वेरी से मेल खाने वाले सभी संपर्कों के सभी ईमेल पते और फ़ोन नंबर शामिल हों.
संपर्कों की सूची के लिए क्वेरी
Contacts में नए एपीआई जोड़े गए हैं. इनकी मदद से, संपर्क डेटा में हुए हाल ही के बदलावों के बारे में बेहतर तरीके से क्वेरी की जा सकती है. इससे पहले, संपर्कों के डेटा में कोई बदलाव होने पर, आपके ऐप्लिकेशन को इसकी सूचना दी जा सकती थी. हालांकि, आपको यह पता नहीं चल पाता था कि क्या बदलाव हुआ है. ऐसे में, आपको सभी संपर्कों को वापस पाने के बाद, फिर से बदलाव का पता लगाना होगा.
डालने और अपडेट करने में हुए बदलावों को ट्रैक करने के लिए, अब चुने गए संपर्कों के साथ CONTACT_LAST_UPDATED_TIMESTAMP
पैरामीटर शामिल किया जा सकता है. इससे, सिर्फ़ उन संपर्कों से क्वेरी की जा सकती है जिनमें पिछली बार क्वेरी करने के बाद से बदलाव हुए हैं.
यह ट्रैक करने के लिए कि कौनसे संपर्क मिटाए गए हैं, नई टेबल ContactsContract.DeletedContacts
में उन संपर्कों का लॉग मौजूद होता है जिन्हें मिटा दिया गया है. हालांकि, मिटाए गए हर संपर्क को टेबल में सीमित समय के लिए रखा जाता है. CONTACT_LAST_UPDATED_TIMESTAMP
की तरह ही, नए चुनने के पैरामीटर, CONTACT_DELETED_TIMESTAMP
का इस्तेमाल करके यह देखा जा सकता है कि सेवा देने वाली कंपनी से पिछली बार क्वेरी करने के बाद से, कौनसे संपर्क मिटाए गए हैं. टेबल में कॉन्सटैंट DAYS_KEPT_MILLISECONDS
भी होता है. इसमें उन दिनों की संख्या (मिलीसेकंड में) होती है जिन्हें लॉग रखा जाएगा.
इसके अलावा, संपर्क सेवा देने वाली कंपनी अब उपयोगकर्ता के CONTACTS_DATABASE_CREATED
कार्रवाई को ब्रॉडकास्ट करती है
सिस्टम सेटिंग मेन्यू में जाकर संपर्कों के स्टोरेज को खाली करता है, ताकि
संपर्क सूची का डेटाबेस. इसका मकसद, ऐप्लिकेशन को यह बताना है कि वे आपकी संपर्क सूची में मौजूद सभी लोगों से सीधे तौर पर संपर्क नहीं कर पाएंगे
सेव की गई जानकारी को सेव कर सकता है और उसे नई क्वेरी के साथ फिर से लोड कर सकता है.
संपर्कों में हुए बदलावों की जांच करने के लिए इन एपीआई का इस्तेमाल करने वाले सैंपल कोड के लिए, ApiDemos पर जाएं सैंपल, एसडीके सैंपल डाउनलोड में उपलब्ध है.
स्थानीय भाषा के अनुसार
दो-तरफ़ा टेक्स्ट के लिए बेहतर सहायता
Android के पिछले वर्शन, दाएं-से-बाएं (आरटीएल) भाषाओं और लेआउट का समर्थन करते हैं,
लेकिन कभी-कभी वे मिले-जुले निर्देश वाले टेक्स्ट को ठीक से हैंडल नहीं कर पाते. इस तरह, Android 4.3 में BidiFormatter
API (एपीआई) जुड़ जाता है, जो आपको ठीक से टेक्स्ट को अलग-अलग दिशा में फ़ॉर्मैट करने में मदद करते हैं
कॉन्टेंट को मिटाने के लिए कहें.
उदाहरण के लिए, जब आपको किसी स्ट्रिंग वैरिएबल वाला वाक्य बनाना हो, जैसे कि "क्या आपका मतलब यह था
15 Bay Street, Laurel, CA?” आम तौर पर स्थानीय भाषा में स्ट्रिंग रिसोर्स और वैरिएबल पास करते हैं
String.format()
:
Kotlin
val suggestion = String.format(resources.getString(R.string.did_you_mean), address)
Java
Resources res = getResources(); String suggestion = String.format(res.getString(R.string.did_you_mean), address);
हालांकि, अगर स्थान-भाषा हिब्रू है, तो फ़ॉर्मैट की गई स्ट्रिंग इस तरह आती है:
ההאה הכונת ל 15 Bay Street, Laurel, CA?
यह ग़लत है, क्योंकि "15" "बे स्ट्रीट" के बाईं ओर होना चाहिए. इसे बदलने के लिए, BidiFormatter
और इसके unicodeWrap()
तरीके का इस्तेमाल करें. उदाहरण के लिए, ऊपर दिया गया कोड बन जाता है:
Kotlin
val bidiFormatter = BidiFormatter.getInstance() val suggestion = String.format( resources.getString(R.string.did_you_mean), bidiFormatter.unicodeWrap(address) )
Java
Resources res = getResources(); BidiFormatter bidiFormatter = BidiFormatter.getInstance(); String suggestion = String.format(res.getString(R.string.did_you_mean), bidiFormatter.unicodeWrap(address));
डिफ़ॉल्ट रूप से, unicodeWrap()
निर्देशात्मकता का पहला अनुमान लगाने पर, जो चीज़ों को गलत बना सकता है.
टेक्स्ट दिशा के लिए सिग्नल, पूरे कॉन्टेंट के लिए सही दिशा नहीं दिखाता.
अगर ज़रूरी हो, तो TextDirectionHeuristics
के TextDirectionHeuristic
कॉन्सटेंट में से किसी एक को पास करके, अलग अनुमान तय किया जा सकता है
unicodeWrap()
के लिए.
ध्यान दें: ये नए एपीआई पिछले वर्शन के लिए भी उपलब्ध हैं
Android की सहायता टीम
लाइब्रेरी, जिसमें BidiFormatter
क्लास और उससे जुड़े एपीआई हैं.
सुलभता सेवाएं
मुख्य इवेंट मैनेज करना
AccessibilityService
को अब इसके लिए कॉलबैक मिल सकता है
onKeyEvent()
कॉलबैक तरीके से किए जाने वाले मुख्य इनपुट इवेंट. इससे आपकी सुलभता सेवा को
कुंजी पर आधारित इनपुट डिवाइस, जैसे कि कीबोर्ड का इस्तेमाल करें. साथ ही, उन इवेंट को खास कार्रवाइयों में बदल दें
पहले ऐसा हो सकता था कि सिर्फ़ टच इनपुट या डिवाइस के डी-पैड का इस्तेमाल करके ऐसा किया जा सके.
टेक्स्ट चुनें और कॉपी करें/चिपकाएं
AccessibilityNodeInfo
अब ऐसे एपीआई उपलब्ध कराता है जो
चुनने, काटने, कॉपी करने, और चिपकाने के लिए AccessibilityService
टेक्स्ट को नोड में डालें.
काटे जाने या कॉपी करने के लिए चुने गए टेक्स्ट को तय करने के लिए, आपकी सुलभता सेवा
कार्रवाई, ACTION_SET_SELECTION
, पास हो रहा है
इसके साथ, ACTION_ARGUMENT_SELECTION_START_INT
और ACTION_ARGUMENT_SELECTION_END_INT
को चुनने की प्रोसेस शुरू और खत्म होगी.
इसके अलावा, आप मौजूदा टेक्स्ट का इस्तेमाल करके कर्सर की जगह में बदलाव करके टेक्स्ट चुन सकते हैं
ऐक्शन, ACTION_NEXT_AT_MOVEMENT_GRANULARITY
(यह फ़ंक्शन पहले सिर्फ़ कर्सर की जगह बदलने के लिए इस्तेमाल किया गया था) और ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
आर्ग्युमेंट जोड़ना होगा.
इसके बाद, ACTION_CUT
की मदद से, टेक्स्ट को कट या कॉपी किया जा सकता है,
ACTION_COPY
, फिर बाद में इससे चिपकाएं
ACTION_PASTE
.
ध्यान दें: ये नए एपीआई पिछले वर्शन के लिए भी उपलब्ध हैं
Android की सहायता टीम
AccessibilityNodeInfoCompat
के साथ लाइब्रेरी
क्लास.
सुलभता सुविधाओं के बारे में बताना
Android 4.3 से शुरू करते हुए, किसी सुलभता सेवा को सुलभता सुविधाओं के बारे में बताना होगा
कुछ सुलभता सुविधाओं का इस्तेमाल करने के लिए मेटाडेटा फ़ाइल में जोड़ दिया जाता है. अगर सुविधा उपलब्ध नहीं है
अनुरोध किया गया है, तो सुविधा नो-ऑप होगी. घोषणा करने के लिए कि
है, तो आपको उन एक्सएमएल एट्रिब्यूट का इस्तेमाल करना होगा जो अलग-अलग
"क्षमता" AccessibilityServiceInfo
में कॉन्सटेंट
क्लास.
उदाहरण के लिए, अगर कोई सेवा, flagRequestFilterKeyEvents
की सुविधा के लिए अनुरोध नहीं करती है,
तो उसे मुख्य इवेंट नहीं मिलेंगे.
जांच और डीबग करना
अपने-आप यूज़र इंटरफ़ेस (यूआई) टेस्टिंग
नई UiAutomation
क्लास में ऐसे एपीआई मिलते हैं जिनकी मदद से, किसी उपयोगकर्ता खाते को सिम्युलेट किया जा सकता है
टेस्ट ऑटोमेशन के लिए कार्रवाइयां. प्लैटफ़ॉर्म के AccessibilityService
एपीआई का इस्तेमाल करके, UiAutomation
एपीआई की मदद से, स्क्रीन पर मौजूद कॉन्टेंट की जांच की जा सकती है. साथ ही, आर्बिट्रेरी कीबोर्ड और टच इवेंट को इंजेक्ट किया जा सकता है.
UiAutomation
का इंस्टेंस पाने के लिए, Instrumentation.getUiAutomation()
को कॉल करें. ऑर्डर में शामिल है
यह काम करे, इसके लिए आपको instrument
कमांड के साथ -w
विकल्प देना होगा
जब आपका InstrumentationTestCase
adb shell
से चल रहा हो.
UiAutomation
इंस्टेंस की मदद से, जांच करने के लिए आर्बिट्रेरी इवेंट एक्ज़ीक्यूट किए जा सकते हैं
executeAndWaitForEvent()
पर कॉल करके, अपने ऐप्लिकेशन को परफ़ॉर्म करने के लिए Runnable
पास करें. इसके बाद, टाइम आउट लागू हो जाएगा
कार्रवाई की अवधि और UiAutomation.AccessibilityEventFilter
इंटरफ़ेस को लागू करने की अवधि. UiAutomation.AccessibilityEventFilter
लागू करने के दौरान ही आपको कॉल आएगा
जिसकी मदद से, आपके पसंदीदा इवेंट को फ़िल्टर किया जा सकता है और सफलता का पता लगाया जा सकता है या
दिए गए टेस्ट केस में गड़बड़ी.
टेस्ट के दौरान सभी इवेंट की निगरानी करने के लिए, UiAutomation.OnAccessibilityEventListener
को लागू करें और उसे setOnAccessibilityEventListener()
को पास करें.
इसके बाद, आपके लिसनर इंटरफ़ेस पर onAccessibilityEvent()
पर कॉल आएगा
हर बार कोई इवेंट होने पर, एक AccessibilityEvent
ऑब्जेक्ट मिलता है
जो इवेंट के बारे में बताती है.
UiAutomation
एपीआई से कई तरह की अन्य कार्रवाइयां की जाती हैं
बहुत कम लेवल पर, uiautomator जैसे यूज़र इंटरफ़ेस (यूआई) टेस्ट टूल के डेवलपमेंट को बढ़ावा देता है. उदाहरण के लिए,
UiAutomation
ये काम भी कर सकता है:
- इंजेक्ट इनपुट इवेंट
- स्क्रीन का ओरिएंटेशन बदलें
- स्क्रीनशॉट ले सकते हैं
यूज़र इंटरफ़ेस (यूआई) की जांच करने वाले टूल के लिए, UiAutomation
एपीआई काम करता है
सीमा पार कर लें, जो Instrumentation
में मौजूद शर्तों से अलग है.
ऐप्लिकेशन के लिए सिस्ट्रेस इवेंट
Android 4.3 में, Trace
क्लास को दो स्टैटिक तरीकों से जोड़ा जाता है,
beginSection()
और endSection()
इसकी मदद से, कोड के ब्लॉक तय किए जा सकते हैं, ताकि उन्हें सिस्ट्रेस रिपोर्ट में शामिल किया जा सके. कॉन्टेंट बनाने की अनुमति देने के लिए
सेक्शन, जिन्हें ट्रेस किया जा सकता है, और सिस्ट्रेस लॉग से आपको ज़्यादा जानकारी मिलती है.
यह पता लगाने के लिए किया जा सकता है कि आपके ऐप्लिकेशन में कहां-कहां ट्रैफ़िक धीमा है.
Systrace टूल का इस्तेमाल करने के बारे में जानकारी पाने के लिए, Systrace की मदद से डिसप्ले और परफ़ॉर्मेंस का विश्लेषण करना लेख पढ़ें.
सुरक्षा
ऐप्लिकेशन-निजी कुंजियों के लिए Android कुंजी स्टोर
Android, अब KeyStore
में कस्टम Java सिक्योरिटी प्रोवाइडर उपलब्ध कराता है
की सुविधा देती है. इसे Android की स्टोर कहते हैं. इसकी मदद से आप ऐसी निजी कुंजियों को जनरेट और सेव कर सकते हैं
इसे सिर्फ़ आपके ऐप्लिकेशन पर देखा और इस्तेमाल किया जा सकता है. Android Key Store को लोड करने के लिए,
KeyStore.getInstance()
के लिए "AndroidKeyStore"
.
Android की स्टोर में अपने ऐप्लिकेशन के निजी क्रेडेंशियल को मैनेज करने के लिए, इसकी मदद से एक नई कुंजी जनरेट करें
KeyPairGenerator
में KeyPairGeneratorSpec
की सदस्यता लें. पहला
getInstance()
पर कॉल करके KeyPairGenerator
का इंस्टेंस पाएं. फिर कॉल करें
initialize()
, इसे
KeyPairGeneratorSpec
, इनका इस्तेमाल किया जा सकता है
KeyPairGeneratorSpec.Builder
.
आखिर में, generateKeyPair()
पर कॉल करके अपना KeyPair
पाएं.
हार्डवेयर क्रेडेंशियल स्टोरेज
Android, अब आपके KeyChain
के लिए हार्डवेयर-बैक्ड स्टोरेज की सुविधा भी देता है
क्रेडेंशियल, जो एक्सट्रैक्ट करने के लिए कुंजियों को उपलब्ध न होने से ज़्यादा सुरक्षा देते हैं. इसका मतलब है कि एक बार
कुंजियां, हार्डवेयर-बैक्ड की स्टोर (सिक्योर एलिमेंट, टीपीएम या TrustZone) में होती हैं. इनका इस्तेमाल इन कामों के लिए किया जा सकता है
क्रिप्टोग्राफ़िक ऑपरेशन के बावजूद, निजी पासकोड के कॉन्टेंट को एक्सपोर्ट नहीं किया जा सकता. यहां तक कि OS कर्नेल भी
इस मुख्य सामग्री को ऐक्सेस नहीं कर सकता. हालांकि, Android पर चलने वाले सभी डिवाइस, स्टोरेज का इस्तेमाल नहीं करते
हार्डवेयर है, तो रनटाइम के दौरान यह देखा जा सकता है कि हार्डवेयर-बैक्ड स्टोरेज उपलब्ध है या नहीं
KeyChain.IsBoundKeyAlgorithm()
.
मेनिफ़ेस्ट फ़ाइल
एलान करने लायक ज़रूरी सुविधाएं
<uses-feature>
में अब ये वैल्यू इस्तेमाल की जा सकती हैं
ताकि आप यह पक्का कर सकें कि आपका ऐप्लिकेशन सिर्फ़ उन डिवाइस पर इंस्टॉल किया गया है जिनमें ये सुविधाएं उपलब्ध हैं
आपके ऐप्लिकेशन की ज़रूरतें पूरी होती हैं.
FEATURE_APP_WIDGETS
- एलान करता है कि आपका ऐप्लिकेशन एक ऐप्लिकेशन विजेट देता है और उसे सिर्फ़ उन डिवाइस पर इंस्टॉल किया जाना चाहिए
होम स्क्रीन या ऐसी ही जगह की जानकारी शामिल करें जहां उपयोगकर्ता ऐप्लिकेशन विजेट एम्बेड कर सकें.
उदाहरण:
<uses-feature android:name="android.software.app_widgets" android:required="true" />
FEATURE_HOME_SCREEN
- यह बताता है कि आपका ऐप्लिकेशन, होम स्क्रीन की जगह इस्तेमाल करता है और इसे सिर्फ़ इस डिवाइस पर इंस्टॉल किया जाना चाहिए
ऐसे डिवाइस जिनमें तीसरे पक्ष के होम स्क्रीन ऐप्लिकेशन काम करते हैं.
उदाहरण:
<uses-feature android:name="android.software.home_screen" android:required="true" />
FEATURE_INPUT_METHODS
- एलान करता है कि आपका ऐप्लिकेशन पसंद के मुताबिक इनपुट का तरीका (
InputMethodService
के साथ बनाया गया कीबोर्ड) देता है और उसे सिर्फ़ उन डिवाइस पर इंस्टॉल किया जाना चाहिए का इस्तेमाल तीसरे पक्ष के इनपुट के तरीकों के लिए किया जा सकता है. उदाहरण:<uses-feature android:name="android.software.input_methods" android:required="true" />
FEATURE_BLUETOOTH_LE
- एलान करता है कि आपका ऐप्लिकेशन Bluetooth Low Energy API का इस्तेमाल करता है और उसे सिर्फ़ डिवाइसों पर इंस्टॉल किया जाना चाहिए
जो ब्लूटूथ निम्न ऊर्जा के माध्यम से अन्य डिवाइस के साथ संचार करने में सक्षम हैं.
उदाहरण:
<uses-feature android:name="android.software.bluetooth_le" android:required="true" />
उपयोगकर्ता की अनुमतियां
<uses-permission>
में अब ये वैल्यू इस्तेमाल की जा सकती हैं
करने के लिए
कुछ एपीआई ऐक्सेस करने के लिए आपके ऐप्लिकेशन को ज़रूरी अनुमतियां चाहिए.
BIND_NOTIFICATION_LISTENER_SERVICE
- नए
NotificationListenerService
API का इस्तेमाल करने के लिए ज़रूरी है. SEND_RESPOND_VIA_MESSAGE
ACTION_RESPOND_VIA_MESSAGE
पाने के लिए ज़रूरी है इंटेंट.
Android 4.3 में सभी API बदलावों के विस्तृत दृश्य के लिए, एपीआई में अंतर की रिपोर्ट.