Android 4.3 API

एपीआई लेवल: 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" ... >
    

    तीसरी इमेज. 9 पैच के साथ होलो बटन का ज़ूम किया गया व्यू ऑप्टिकल बाउंड.

    यह काम करे, इसके लिए आपके व्यू के बैकग्राउंड पर लागू की गई नौ-पैच वाली इमेज में, नाइन-पैच फ़ाइल के नीचे और दाईं ओर की लाल रेखाओं का उपयोग करके ऑप्टिकल बाउंड (जैसे कि तीसरी इमेज में दिखाया गया है). लाल रेखाएं उस क्षेत्र को इंगित करती हैं जिसे घटाना चाहिए क्लिप बाउंड है, जिससे चित्र की ऑप्टिकल सीमाएं छोड़ दी गई हैं.

    जब अपने लेआउट में 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 बदलावों के विस्तृत दृश्य के लिए, एपीआई में अंतर की रिपोर्ट.