Android 11 ویژگیهای جدید و میاناهای برنامهسازی کاربردی فوقالعادهای برای توسعهدهندگان معرفی میکند. بخشهای زیر به شما کمک میکند با ویژگیهای برنامههایتان آشنا شوید و با میاناهای برنامهسازی کاربردی مربوطه شروع کنید.
برای مشاهده فهرست دقیق میاناهای برنامهسازی کاربردی جدید، اصلاحشده، و حذفشده، گزارش تفاوت میانای برنامهسازی کاربردی را بخوانید. برای جزئیات درباره میاناهای برنامهسازی کاربردی جدید، به مرجع میانای برنامهسازی کاربردی Android مراجعه کنید — میاناهای برنامهسازی کاربردی جدید برای نمایان بودن برجسته شدهاند. همچنین، برای آشنایی با بخشهایی که تغییرات پلاتفرم ممکن است برنامههایتان را تحت تأثیر قرار دهد، حتماً تغییرات رفتاری Android 11 را برای برنامههایی که Android R را هدف قرار میدهند و برای همه برنامهها، و همچنین تغییرات حریم خصوصی بررسی کنید.
تجربههای جدید
کنترلهای دستگاه
Android 11 شامل میانای برنامهسازی کاربردی ControlsProviderService جدیدی است که
میتوانید از آن برای نمایش کنترلهای دستگاههای خارجی متصلشده استفاده کنید. این کنترلها
در بخش کنترلهای دستگاه در منوی روشن/خاموش Android نشان داده میشود. برای اطلاعات بیشتر،
کنترل دستگاههای خارجی را ببینید.
کنترلهای رسانه
Android 11 نحوه نمایش کنترلهای رسانه را بهروز میکند. کنترلهای رسانه نزدیک تنظیمات فوری نشان داده میشود. جلسههای چند برنامه در گردونهای با قابلیت تند کشیدن مرتب شدهاند که شامل جاریسازیهایی است که بهصورت محلی در تلفن پخش میشوند، جاریسازیهای ازراهدور، مانند جاریسازیهایی که در دستگاههای خارجی یا جلسههای ارسال محتوا شناسایی شدهاند، و جلسههای قبلی و قابلازسرگیری بهترتیبی که آخرینبار پخش شدهاند.
کاربران میتوانند جلسههای قبلی را از گردونه بازراهاندازی کنند بدون اینکه لازم باشد برنامه را راهاندازی کنند. وقتی بازپخش شروع میشود، کاربر به روش معمول با کنترلهای رسانه تعامل برقرار میکند.
برای اطلاعات بیشتر، کنترلهای رسانه را ببینید.
صفحهنمایشها
پشتیبانی بهتر از نمایشگرهای آبشاری
Android 11 چندین میانای برنامهسازی کاربردی برای پشتیبانی از نمایشگرهای آبشاری ارائه میدهد،
نمایشگرهایی که
لبه دستگاه را میپوشانند. این نمایشگرها بهعنوان نوعی از
نمایشگرهای دارای برش نمایشگر درنظر گرفته میشوند. روشهای موجود
DisplayCutout.getSafeInset…()
اکنون حاشیه امن را برای اجتناب از نواحی آبشاری و همچنین بریدگیها برمیگردانند.
برای ارائه محتوای برنامهتان در ناحیه آبشاری، کارهای زیر را انجام دهید:
با
DisplayCutout.getWaterfallInsets()تماس بگیرید تا ابعاد دقیق آبشار را دریافت کنید.ویژگی چیدمان پنجره
layoutInDisplayCutoutModeرا رویLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYSتنظیم کنید تا پنجره بتواند در نواحی برش و آبشاری در همه لبههای صفحهنمایش گسترش یابد. باید مطمئن شوید که هیچ محتوای ضروریای در نواحی برشخوردگی یا آبشاری قرار ندارد.
حسگر زاویه لولا و دستگاههای تاشو
Android 11 این امکان را برای برنامههایی که در دستگاههای دارای پیکربندی صفحهنمایش لولایی اجرا میشوند فراهم میکند تا با ارائه حسگر جدیدی با TYPE_HINGE_ANGLE و SensorEvent جدیدی که میتواند زاویه لولا را پایش کند و اندازهگیری را برحسب درجه بین دو بخش جداییناپذیر دستگاه ارائه دهد، زاویه لولا را تعیین کنند. میتوانید از این اندازهگیریهای خام برای اجرای پویانماییهای دانهای
هنگام دستکاری دستگاه توسط کاربر استفاده کنید.
دستگاههای تاشو را ببینید.
مکالمهها
بهبود مکالمه
Android 11 بهبودهای متعددی در نحوه مدیریت مکالمهها ایجاد میکند. مکالمهها ارتباطات همزمان و دوطرفه بین دو یا چند نفر هستند. این مکالمهها بهطور ویژه برجسته میشوند و کاربران گزینههای جدیدی برای نحوه تعامل با آنها دارند.
برای کسب اطلاعات بیشتر درباره مکالمهها و نحوه پشتیبانی برنامهتان از آنها، به افراد و مکالمهها مراجعه کنید.
حبابکهای گپ
حبابکها اکنون برای توسعهدهندگان دردسترس است تا به نمایش مکالمهها در سراسر سیستم کمک کند. «حبابها» ویژگی آزمایشیای در Android 10 بود که ازطریق گزینه توسعهدهنده فعال میشد؛ در Android 11، این کار دیگر لازم نیست.
اگر برنامهای Android نسخه ۱۱ (سطح میانای برنامهسازی کاربردی ۳۰) یا بالاتر را هدف قرار دهد، اعلانهای آن بهصورت حباب نمایش داده نمیشود، مگراینکه الزامات مکالمه جدید را برآورده کند. بهطور خاص، اعلان باید با میانبر مرتبط باشد.
پیشاز Android 11، اگر میخواستید اعلانی بهصورت حبابک نمایش داده شود، باید بهطور صریح مشخص میکردید که اعلان طوری تنظیم شده است که همیشه در حالت رابط کاربری سند راهاندازی شود. از Android نسخه ۱۱ به بعد، دیگر لازم نیست این تنظیم را بهطور صریح انجام دهید؛ اگر اعلان بهصورت حباب باشد، پلتفرم بهطور خودکار اعلان را طوری تنظیم میکند که همیشه در حالت میانای کاربر سند راهاندازی شود.
بهبودهای متعددی در عملکرد حبابها ایجاد شده است و کاربران انعطافپذیری بیشتری در فعال و غیرفعال کردن حبابها از هر برنامه دارند. برای توسعهدهندگانی که پشتیبانی آزمایشی را پیادهسازی کردهاند، چند تغییر در میاناهای برنامهسازی کاربردی در Android 11 وجود دارد:
- سازنده
BubbleMetadata.Builder()بدون پارامتر منسوخ شده است. درعوض، از یکی از دو سازنده جدیدBubbleMetadata.Builder(PendingIntent, Icon)یاBubbleMetadata.Builder(String)استفاده کنید. BubbleMetadataرا از شناسه میانبر با فراخوانیBubbleMetadata.Builder(String)ایجاد کنید. رشته ارسالشده باید با شناسه میانبر ارائهشده بهNotification.Builderمطابقت داشته باشد.- نمادهای حبابک را با
Icon.createWithContentUri()یا با روش جدیدcreateWithAdaptiveBitmapContentUri()ایجاد کنید.
نشانگرهای دیداری 5G
برای اطلاعات بیشتر درباره نمایش نشانگرهای 5G در دستگاههای کاربران، به اطلاعرسانی به کاربران هنگام استفاده از 5G مراجعه کنید.
حریم خصوصی
Android 11 تغییرات و محدودیتهای زیادی را برای بهبود حریم خصوصی کاربر معرفی میکند. برای کسب اطلاعات بیشتر، به صفحه حریم خصوصی مراجعه کنید.
امنیت
بهروزرسانیهای اصالتسنجی زیستسنجشی
برای کمک به شما در کنترل سطح امنیت دادههای برنامهتان، Android 11 چندین بهبود در اصالتسنجی زیستسنجشی ارائه میدهد. این تغییرات در کتابخانه Jetpack Biometric نیز ظاهر میشود.
انواع اصالتسنجی
Android 11 میانای
BiometricManager.Authenticators
را معرفی میکند که میتوانید از آن برای اعلام انواع اصالتسنجیای که برنامهتان پشتیبانی میکند استفاده کنید.
مشخص کردن اینکه از کدام نوع اصالتسنجی استفاده شده است
پساز اصالتسنجی کاربر، میتوانید با فراخوانی
getAuthenticationType() بررسی کنید که آیا کاربر بااستفاده از
اعتبارنامه دستگاه یا اعتبارنامه زیستسنجشی اصالتسنجی شده است یا نه.
پشتیبانی تکمیلی برای کلیدهای «احراز هویت برای هر استفاده»
Android 11 پشتیبانی بیشتری برای اصالتسنجی بااستفاده از کلیدهای اصالتسنجی برای هر استفاده ارائه میدهد.
روشهای منسوخشده
Android 11 روشهای زیر را منسوخ میکند:
- روش
setDeviceCredentialAllowed(). - روش
setUserAuthenticationValidityDurationSeconds(). - نسخه سربارگذاریشده
canAuthenticate()که هیچ متغیر مستقلی ندارد.
همرسانی امن مجموعه دادههای بزرگ
در برخی شرایط، مانند شرایطی که شامل یادگیری ماشین یا بازپخش رسانه است، ممکن است برنامه شما بخواهد از همان مجموعه داده بزرگ برنامه دیگری استفاده کند. در نسخههای قبلی Android، برنامه شما و برنامه دیگر هرکدام باید نسخه جداگانهای از همان مجموعه داده را بارگیری میکردند.
برای کمک به کاهش افزونگی دادهها، هم در شبکه و هم در دیسک، Android 11 اجازه میدهد این مجموعه دادههای بزرگ بااستفاده از حبابهای داده همرسانیشده در دستگاه ذخیره شوند. برای کسب اطلاعات بیشتر درباره همرسانی مجموعهدادهها، راهنمای جامع همرسانی مجموعهدادههای بزرگ را ببینید.
انجام رمزگذاری فایلمبنا پساز بازراهاندازی OTA بدون اطلاعات کاربری
پساز اینکه دستگاه بهروزرسانی OTA را تکمیل و بازراهاندازی کرد، کلیدهای «رمزگذاریشده با اطلاعات کاربری» (CE) که در فضای ذخیرهسازی محافظتشده با اطلاعات کاربری قرار دارند، بلافاصله برای عملیات رمزگذاری مبتنی بر فایل (FBE) دردسترس قرار میگیرند. این یعنی پساز بهروزرسانی OTA، برنامهتان میتواند عملیاتی را که به کلیدهای CE نیاز دارد قبلاز اینکه کاربر پین، الگو، یا گذرواژه خود را وارد کند ازسر بگیرد.
عملکرد و کیفیت
اشکالزدایی بیسیم
Android 11 از استقرار و اشکالزدایی بیسیم برنامهتان از ایستگاه کاری شما ازطریق «پل اشکالزدایی Android» (adb) پشتیبانی میکند. برای مثال، میتوانید برنامه قابلاشکالزداییتان را بدون اتصال فیزیکی دستگاهتان ازطریق USB و مواجهه با مشکلات رایج اتصال USB، مانند نصب درایور، در چندین دستگاه از راه دور مستقر کنید. برای اطلاعات بیشتر، به اجرای برنامهها در دستگاه سختافزاری مراجعه کنید.
نصب APK افزایشی ADB
نصب فایلهای APK بزرگ (بیشاز ۲ گیگابایت) در دستگاه میتواند زمان زیادی طول بکشد، حتی اگر فقط تغییر کوچکی در برنامه ایجاد شده باشد. نصب افزایشی فایل APK با ADB (پل اشکالزدایی Android) این فرایند را با نصب کردن بخش کافی از فایل APK برای راهاندازی برنامه و همزمان جاریسازی دادههای باقیمانده در پسزمینه تسریع میکند. اگر دستگاه از این ویژگی پشتیبانی کند و جدیدترین نسخه ابزارهای پلاتفرم کیت توسعه نرمافزار را نصب کرده باشید، adb install بهطور خودکار از این ویژگی استفاده خواهد کرد. اگر پشتیبانی نشود، روش نصب پیشفرض بدون اطلاع کاربر استفاده میشود.
برای استفاده از این ویژگی، از فرمان adb زیر استفاده کنید. اگر دستگاه از نصب افزایشی پشتیبانی نکند، فرمان ناموفق میشود و توضیح پرجزئیاتی چاپ میکند.
adb install --incremental
قبلاز اجرای نصب افزایشی APK با ADB، باید APK خود را امضا کنید و یک فایل طرح امضای APK نسخه ۴ ایجاد کنید. برای اینکه این ویژگی کار کند، فایل امضای v4 باید در کنار APK قرار داده شود.
تشخیص خطا بااستفاده از تخصیصدهنده حافظه محلی
GWP-ASan ویژگی تخصیصدهنده حافظه محلی است که به پیدا کردن اشکالات use-after-free و heap-buffer-overflow کمک میکند. میتوانید این ویژگی را بهطور سراسری یا برای زیرفرایندهای خاصی از برنامهتان فعال کنید. برای کسب اطلاعات بیشتر، به راهنمای GWP-Asan مراجعه کنید.
Neural Networks API 1.3
Android 11 Neural Networks API (NNAPI) را گسترش میدهد و بهبود میبخشد.
عملیات جدید
NNAPI 1.3 نوع عملوند جدیدی بهنام TENSOR_QUANT8_ASYMM_SIGNED را برای پشتیبانی از طرح کوانتیزاسیون جدید TensorFlow Lite معرفی میکند.
علاوهبراین، NNAPI 1.3 عملیاتهای جدید زیر را معرفی میکند:
QUANTIZED_LSTMIFWHILEELUHARD_SWISHFILLRANK
کنترلهای جدید یادگیری ماشین
NNAPI 1.3 کنترلهای جدیدی را برای کمک به اجرای روان یادگیری ماشین معرفی میکند:
میانای برنامهسازی کاربردی QoS: میانای برنامهسازی کاربردی «کیفیت سرویس» جدید شامل پشتیبانی از اولویتبندی و مهلت تکلیف در NNAPI با عملکردهای جدید زیر است:
ورودی/خروجی دامنه حافظه: NNAPI 1.3 از دامنههای حافظه بهعنوان ورودی و خروجی برای اجرا پشتیبانی میکند. این کار نسخههای غیرضروری از دادههای یکسان را در میان اجزای مختلف سیستم حذف میکند و عملکرد زمان اجرای شبکههای عصبی Android را بهبود میبخشد. این ویژگی مجموعهای از میاناهای برنامهسازی کاربردی NDK جدید را برای استفاده با
ANeuralNetworksMemoryDescوANeuralNetworkMemoryاشیاء، ازجمله عملکردهای زیر، اضافه میکند:ANeuralNetworksMemoryDesc_create()ANeuralNetworksMemoryDesc_free()ANeuralNetworksMemoryDesc_addInputRole()ANeuralNetworksMemoryDesc_addOutputRole()ANeuralNetworksMemoryDesc_setDimensions()ANeuralNetworksMemoryDesc_finish()ANeuralNetworksMemory_createFromDesc()ANeuralNetworksMemory_copy()
برای کسب اطلاعات بیشتر، نمونه دامنه حافظه شبکه عصبی را ببینید.
پشتیبانی از Dependency API و حصار همگامسازی: NNAPI 1.3 شامل پشتیبانی از محاسبه ناهمگام با وابستگیها است که باعث کاهش قابلتوجه سربار هنگام فراخوانی مدلهای زنجیرهای کوچک میشود. این ویژگی عملکردهای جدید زیر را اضافه میکند:
جریان کنترل: NNAPI 1.3 شامل پشتیبانی از جریان کنترل عمومی با عملیات نمودار جدید
ANEURALNETWORKS_IFوANEURALNETWORKS_WHILEاست که مدلهای دیگر را بهعنوان آرگومان بااستفاده از نوع عملوند جدیدANEURALNETWORKS_MODELمیپذیرد. علاوهبراین، این ویژگی عملکردهای جدید زیر را اضافه میکند:
NDK Thermal API
وقتی دستگاهها بیشازحد گرم میشوند، ممکن است CPU و/یا GPU را محدود کنند و این میتواند به روشهای غیرمنتظرهای بر برنامهها تأثیر بگذارد. برنامهها یا بازیهایی که گرافیک پیچیده، محاسبات سنگین، یا فعالیت شبکه پایدار دارند، بیشتر احتمال دارد با مشکل مواجه شوند.
از NDK Thermal API در Android 11 برای نظارت بر تغییرات دمای دستگاه استفاده کنید، و سپس برای حفظ مصرف کمتر برق و دمای خنکتر دستگاه اقدام کنید. این میانای برنامهسازی کاربردی مشابه Java Thermal API است؛ میتوانید از آن برای دریافت اعلانهای مربوط به هرگونه تغییر وضعیت حرارتی یا نظرسنجی مستقیم از وضعیت فعلی استفاده کنید.
نوشتار و ورودی
بهبود انتقالهای IME
Android 11 میاناهای برنامهسازی کاربردی جدیدی را برای بهبود انتقالها برای ویرایشگرهای روش ورودی (IME)، مانند صفحهکلیدهای مجازی، معرفی میکند. این میاناهای برنامهسازی کاربردی تنظیم محتوای برنامه را در هماهنگی با ظاهر شدن و ناپدید شدن IME و با عناصر دیگر مانند نوارهای وضعیت و پیمایش آسانتر میکنند.
برای نمایش IME وقتی هر EditText در کانون توجه است،
view.getInsetsController().show(Type.ime()) را فراخوانی کنید.
(میتوانید این روش را در هر نمایی در
همان سلسلهمراتب EditText متمرکزشده فراخوانی کنید، لازم نیست
آن را بهطور خاص در EditText فراخوانی کنید.) برای پنهان کردن IME،
view.getInsetsController().hide(Type.ime()) را فراخوانی کنید.
با فراخوانی view.getRootWindowInsets().isVisible(Type.ime()) میتوانید بررسی کنید که آیا IME درحالحاضر نمایان است یا نه.
برای همگامسازی نماهای برنامهتان با ظاهر شدن و ناپدید شدن IME، با ارائه
WindowInsetsAnimation.Callback
به View.setWindowInsetsAnimationCallback()، شنوندهای را در نما تنظیم کنید.
(میتوانید این شنونده را روی هر نمایی تنظیم کنید، لازم نیست EditText باشد.)
IME متد
onPrepare()
شنونده شما را فراخوانی میکند، سپس
onStart()
را در شروع انتقال فراخوانی میکند. سپس
onProgress()
را در هر پیشرفت در گذار فراخوانی میکند. وقتی انتقال بهپایان رسید، IME
onEnd() را فراخوانی میکند.
در هر نقطهای از انتقال، میتوانید با فراخوانی WindowInsetsAnimation.getFraction() متوجه شوید که انتقال چقدر پیشرفت داشته است.
برای مشاهده نمونهای از نحوه استفاده از این APIها، نمونه کد جدید WindowInsetsAnimation را ببینید.
درحال کنترل پویانمایی IME
همچنین میتوانید پویانمایی IME یا پویانمایی نوار سیستم دیگری مانند نوار پیمایش را کنترل کنید. برای انجام این کار، ابتدا
setOnApplyWindowInsetsListener()
را فراخوانی کنید تا شنونده جدیدی برای تغییرات درج پنجره تنظیم شود:
کاتلین
rootView.setOnApplyWindowInsetsListener { rootView, windowInsets -> val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime()) rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom) // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. WindowInsets.CONSUMED }
جاوا
mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime()); mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom); // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. return WindowInsets.CONSUMED; } });
برای جابهجا کردن IME یا نوار سیستم دیگر، روش
controlWindowInsetsAnimation()
کنترلکننده را فراخوانی کنید:
کاتلین
view.windowInsetsController.controlWindowInsetsAnimation( Type.ime(), 1000, LinearInterpolator(), cancellationSignal, object : WindowInsetsAnimationControlListener() { fun onReady(controller: WindowInsetsAnimationController, types: Int) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */) } } );
جاوا
mRoot.getWindowInsetsController().controlWindowInsetsAnimation( Type.ime(), 1000, new LinearInterpolator(), cancellationSignal, new WindowInsetsAnimationControlListener() { @Override public void onReady( @NonNull WindowInsetsAnimationController controller, int types ) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */); } @Override public void onCancelled() {} });
بهروزرسانی کتابخانههای ICU
Android 11 بسته android.icu را بهروز میکند تا از نسخه ۶۶
کتابخانه ICU استفاده کند، درحالیکه در Android 10 از نسخه
۶۳ استفاده میشد. نسخه جدید کتابخانه شامل دادههای محلی CLDR بهروزشده
و تعدادی بهبود در پشتیبانی از بینالمللیسازی در Android است.
تغییرات قابلتوجه در نسخههای جدید کتابخانه شامل موارد زیر است:
- بسیاری از میاناهای برنامهسازی کاربردی قالببندی اکنون از نوع شیء برگشتی جدیدی پشتیبانی میکنند که
FormattedValueرا گسترش میدهد. LocaleMatcherAPI با کلاس سازنده، پشتیبانی از نوعjava.util.Locale، و کلاس نتیجه با دادههای اضافی درباره مطابقت بهبود یافته است.- اکنون از Unicode 13 پشتیبانی میشود.
رسانه
درحال اختصاص دادن میانگیرهای MediaCodec
Android 11 شامل میاناهای برنامهسازی کاربردی MediaCodec جدیدی است که
به برنامهها کنترل بیشتری هنگام اختصاص دادن میانگیرهای ورودی و خروجی میدهد. این کار به برنامهتان اجازه میدهد حافظه را بهطور کارآمدتری مدیریت کند.
کلاسهای جدید:
روشهای جدید:
MediaCodec.getQueueRequest()MediaCodec.getOutputFrame()MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
علاوهبراین، رفتار دو روش در MediaCodec.Callback() تغییر کرده است:
onInputBufferAvailable()- بهجای فراخوانی
MediaCodec.getInputBuffer()وMediaCodec.queueInputBuffer()با نمایه، اگر برای استفاده از Block Model API پیکربندی شده باشد، برنامهها باید ازMediaCodec.getQueueRequestبا نمایه استفاده کنند و LinearBlock/HardwareBuffer را به جایگاه پیوست کنند. onOutputBufferAvailable()- بهجای فراخوانی
MediaCodec.getOutputBuffer()با نمایه، برنامهها میتوانند ازMediaCodec.getOutputFrame()با نمایه برای دریافت شیءOutputFrameبا اطلاعات بیشتر و میانگیرهای LinearBlock/HardwareBuffer استفاده کنند.
رمزگشایی با تأخیر کم در MediaCodec
Android 11
MediaCodec
را بهبود میبخشد تا از رمزگشایی با تأخیر کم برای بازیها و دیگر برنامههای همزمان پشتیبانی کند. میتوانید
با ارسال
FEATURE_LowLatency
به
MediaCodecInfo.CodecCapabilities.isFeatureSupported()
بررسی کنید که آیا کدک از رمزگشایی با تأخیر کم پشتیبانی میکند یا نه.
برای روشن یا خاموش کردن رمزگشایی با تأخیر کم، یکی از کارهای زیر را انجام دهید:
- کلید جدید
KEY_LOW_LATENCYرا بااستفاده ازMediaCodec.configure()روی ۰ یا ۱ تنظیم کنید. - کلید پارامتر جدید
PARAMETER_KEY_LOW_LATENCYرا بااستفاده ازMediaCodec.setParameters()روی ۰ یا ۱ تنظیم کنید.
تابع AAudio جدید AAudioStream_release()
تابع
AAudioStream_close()
جاریسازی صوتی را همزمان منتشر و بسته میکند. این کار میتواند خطرناک باشد. اگر
فرایند دیگری پساز بسته شدن جریان سعی کند به آن دسترسی پیدا کند، فرایند
ازکار خواهد افتاد.
تابع جدید
AAudioStream_release()
جاریسازی را آزاد میکند اما آن را نمیبندد. این کار منابع آن را آزاد میکند و
جاریسازی را در وضعیت شناختهشدهای قرار میدهد. شیء تا زمانی که
AAudioStream_close() را فراخوانی کنید باقی میماند.
MediaParser API
MediaParser یک میانای برنامهسازی کاربردی سطح پایین جدید برای استخراج رسانه است. این API انعطافپذیرتر از MediaExtractor است و کنترل بیشتری بر عملکرد استخراج رسانه ارائه میدهد.
ضبط صدا از دستگاه USB
وقتی برنامهای بدون اجازه RECORD_AUDIO از UsbManager برای درخواست دسترسی مستقیم به دستگاه صوتی USB با قابلیت ضبط صدا (مانند هدست USB) استفاده میکند، پیام هشدار جدیدی ظاهر میشود که از کاربر میخواهد اجازه استفاده از دستگاه را تأیید کند. سیستم هرگونه گزینه «همیشه استفاده شود» را نادیده میگیرد، بنابراین کاربر باید هشدار را تأیید کند و هربار که برنامهای درخواست دسترسی میکند، اجازه را اعطا کند.
برای جلوگیری از این رفتار، برنامهتان باید اجازه RECORD_AUDIO را درخواست کند.
دسترسی همزمان به میکروفون
Android 11 روشهای جدیدی به میاناهای برنامهسازی کاربردی AudioRecord، MediaRecorder، و
AAudioStream اضافه میکند. این روشها قابلیت ضبط همزمان را بدون توجه به مورد استفاده انتخابشده فعال و غیرفعال میکنند. همرسانی ورودی صوتی را ببینید.
تعویضکننده خروجی
Android 11 رفتار جدیدی را برای برنامههایی که از میاناهای برنامهسازی کاربردی cast و mediarouter استفاده میکنند پیادهسازی میکند.
علاوهبر دسترسی به گزینههای پخش محتوا از داخل برنامه، گزینههای تعویض نیز در پخشکننده رسانه سیستم ظاهر میشوند. این کار به کاربر کمک میکند تا هنگام جابهجایی بین دستگاهها، تجربه یکپارچهای داشته باشد، زیرا با تغییر دستگاه، زمینه تماشا و گوش دادن او نیز تغییر میکند، مثلاً تماشای ویدیو در آشپزخانه درمقایسه با تلفن، یا گوش دادن به صدا در خانه یا خودرو. تعویضکننده خروجی را ببینید.
اتصالپذیری
بهبودهای Wi-Fi Passpoint
برای کسب اطلاعات درباره قابلیتهای Passpoint اضافهشده در Android 11، به Passpoint مراجعه کنید.
Wi-Fi Suggestion API ازهم باز شده است
Android 11 Wi-Fi Suggestion API را گسترش میدهد تا قابلیتهای مدیریت شبکه برنامهتان را افزایش دهد، ازجمله:
- برنامههای مدیریت اتصال میتوانند با مجاز کردن درخواستهای قطع اتصال، شبکههای خودشان را مدیریت کنند.
- شبکههای Passpoint در Suggestion API ادغام شدهاند و میتوانند به کاربر پیشنهاد شوند.
- میاناهای برنامهسازی کاربردی Analytics به شما امکان میدهند اطلاعاتی درباره کیفیت شبکههایتان دریافت کنید.
بهروزرسانیهای CallScreeningService
از Android 11، CallScreeningService میتواند اطلاعات مربوط به وضعیت درستیسنجی STIR/SHAKEN (verstat) را برای تماسهای ورودی درخواست کند. این اطلاعات بهعنوان بخشی از جزئیات تماس برای تماسهای ورودی ارائه میشود.
اگر CallScreeningService دارای اجازه
READ_CONTACTS
باشد، وقتی تماس ورودی از شمارهای در مخاطبین کاربر یا تماس خروجی به شمارهای در مخاطبین کاربر وجود داشته باشد، به برنامه اطلاع داده میشود.
برای اطلاعات بیشتر، جلوگیری از جعل شناسه تماسگیرنده را ببینید.
بهروزرسانیهای Open Mobile API
برای کسب اطلاعات درباره پشتیبانی از OMAPI در Android 11 و بالاتر، به پشتیبانی از خواننده Open Mobile API مراجعه کنید.
VPNهای کارآمد
برنامههایی که سطح میانای برنامهسازی کاربردی ۳۰ و بالاتر را هدف قرار میدهند یا در دستگاههایی اجرا میشوند که با سطح میانای برنامهسازی کاربردی ۲۹ و بالاتر راهاندازی شدهاند میتوانند IKEv2/IPsec را برای VPNهای پیکربندیشده توسط کاربر و VPNهای مبتنی بر برنامه در VPNها اعمال کنند.
ویپیانها بهصورت بومی در سیستمعامل اجرا میشوند و کد موردنیاز برای برقراری اتصالهای IKEv2/IPsec VPN را در برنامه ساده میکنند.
کنترل دسترسی به شبکه برای هر فرایند
برای اطلاعات درباره فعال کردن دسترسی به شبکه براساس هر فرایند، به مدیریت استفاده از شبکه مراجعه کنید.
اجازه دادن به چندین پیکربندی Passpoint نصبشده با FQDN یکسان
از Android 11، میتوانید از
PasspointConfiguration.getUniqueId()
برای دریافت شناسه یکتا برای شیء PasspointConfiguration استفاده کنید، که به
کاربران برنامهتان امکان میدهد چندین نمایه با نام دامنه کاملاً واجدشرایط (FQDN)
یکسان نصب کنند.
این عملکرد زمانی مفید است که شرکت مخابراتی بیشاز یک ترکیب از «کد کشور تلفن همراه» (MCC) و «کد شبکه تلفن همراه» (MNC) را در شبکه خود مستقر میکند، اما فقط یک FQDN دارد. در Android نسخه ۱۱ و بالاتر، امکان نصب بیشاز یک نمایه با FQDN یکسان وجود دارد که وقتی کاربر سیمکارتی با MCC یا MNC نصب میکند، با شبکه بهعنوان ارائهدهنده Home مطابقت خواهد داشت.
پشتیبانی آنتن GNSS
Android 11 کلاس
GnssAntennaInfo را معرفی میکند که
امکان استفاده بیشتر برنامهتان از موقعیتیابی با دقت سانتیمتر را که
«سامانه ماهوارهای ناوبری جهانی» (GNSS) میتواند ارائه دهد فراهم میکند.
در راهنمای اطلاعات واسنجی آنتن بیشتر بدانید.
گرافیک
رمزگشای تصویر NDK
NDK ImageDecoder API یک API استاندارد برای برنامههای Android C/C++ ارائه میدهد تا تصاویر را مستقیماً رمزگشایی کنند. توسعهدهندگان برنامه دیگر نیازی به استفاده از میاناهای برنامهسازی کاربردی چارچوب (ازطریق JNI) یا بستهبندی کتابخانههای رمزگشایی تصویر شخص ثالث ندارند. برای اطلاعات بیشتر،
راهنمای توسعهدهنده رمزگشای تصویر را ببینید.
Frame rate API
Android 11 میانای برنامهسازی کاربردیای ارائه میدهد که به برنامهها امکان میدهد نرخ فریم موردنظرشان را به سیستم اطلاع دهند تا لرزش در دستگاههایی که از چند نرخ بازآوری پشتیبانی میکنند کاهش یابد. برای کسب اطلاعات درباره نحوه استفاده از این میانای برنامهسازی کاربردی، به راهنمای نرخ فریم مراجعه کنید.
درخواست و بررسی پشتیبانی از تأخیر کم
برخیاز نمایشگرها میتوانند پسپردازش گرافیکی انجام دهند، مثل بعضیاز نمایشگرهای خارجی و تلویزیونها. این پسپردازش گرافیک را بهبود میبخشد اما میتواند تأخیر را افزایش دهد. نمایشگرهای جدیدتر که از HDMI 2.1 پشتیبانی میکنند، دارای حالت تأخیر کم خودکار (ALLM، که بهعنوان حالت بازی نیز شناخته میشود) هستند که با خاموش کردن این پسپردازش، تأخیر را به حداقل میرساند. برای جزئیات بیشتر درباره ALLM، به مشخصات HDMI 2.1 مراجعه کنید.
پنجره میتواند درخواست کند که از حالت تأخیر کم خودکار استفاده شود (درصورت دردسترس بودن). ALLM بهویژه برای برنامههایی مانند بازیها و کنفرانسهای ویدیویی مفید است، جایی که تأخیر کم مهمتر از داشتن بهترین گرافیک ممکن است.
برای روشن یا خاموش کردن پردازش حداقلی پساز تولید،
Window.setPreferMinimalPostProcessing()
را فراخوانی کنید یا ویژگی
preferMinimalPostProcessing
پنجره را روی true تنظیم کنید. همه نمایشگرها از حداقل پسپردازش پشتیبانی نمیکنند؛ برای اینکه بدانید نمایشگر خاصی از آن پشتیبانی میکند یا نه، روش جدید
Display.isMinimalPostProcessingSupported() را فراخوانی کنید.
تزریق لایه اشکالزدایی گرافیک با عملکرد بالا
اکنون برنامهها میتوانند لایههای گرافیکی خارجی (GLES، Vulkan) را در کد برنامه بومی بار کنند تا همان عملکرد برنامه قابلاشکالزدایی را ارائه دهند، اما بدون اینکه سربار عملکردی ایجاد شود. این ویژگی بهویژه هنگام نمایهسازی برنامه با ابزارهایی مانند GAPID مهم است. برای نمایه کردن برنامهتان، بهجای اشکالزدایی کردن برنامه، عنصر فراداده زیر را در فایل مانیفست برنامهتان اضافه کنید:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
تصاویر و دوربین
بیصدا کردن صداها و لرزشهای اعلان درحین ضبط فعال
از Android 11، هنگام استفاده فعال از دوربین، برنامه شما میتواند فقط لرزشها، هم صداها و هم لرزشها، یا هیچکدام را بااستفاده از setCameraAudioRestriction() بیصدا کند.
پشتیبانی گسترده از دوربین در شبیهساز Android
برای کسب اطلاعات درباره پشتیبانی گسترده از دوربینها در شبیهساز که از Android 11 شروع میشود، پشتیبانی از دوربین را ببینید.
پشتیبانی از استفاده همزمان از بیشاز یک دوربین
Android 11 میاناهای برنامهسازی کاربردی را برای پشتیبانی از پُرسمان برای استفاده از بیشاز یک دوربین بهطور همزمان، ازجمله دوربین جلو و دوربین پشت، اضافه میکند.
برای بررسی پشتیبانی در دستگاهی که برنامهتان در آن اجرا میشود، از روشهای زیر استفاده کنید:
getConcurrentCameraIds()Setترکیبی از شناسههای دوربین را برمیگرداند که میتوانند بهطور همزمان با ترکیبهای جاریسازی تضمینشده هنگام پیکربندی توسط همان فرایند برنامه جاریسازی کنند.isConcurrentSessionConfigurationSupported()پرسوجو میکند که آیا دستگاههای دوربین میتوانند بهطور همزمان از پیکربندیهای جلسه مربوطه پشتیبانی کنند یا نه.
پشتیبانی بهتر از تصاویر HEIF با چند قاب
از Android 11، اگر ImageDecoder.decodeDrawable() را فراخوانی کنید و تصویر HEIF حاوی توالی فریمها (مانند پویانمایی یا عکس پیدرپی) را ارسال کنید، این روش AnimatedImageDrawable حاوی کل توالی تصویر را برمیگرداند. در نسخههای قبلی Android، این روش BitmapDrawable را فقط برای یک فریم برمیگرداند.
اگر گرافیک HEIF حاوی چندین فریم باشد که بهصورت متوالی نیستند، میتوانید با فراخوانی MediaMetadataRetriever.getImageAtIndex() یک فریم تکی را بازیابی کنید.
دسترسپذیری
بهروزرسانیهای مربوط به توسعهدهندگان سرویس دسترسپذیری
اگر سرویس دسترسپذیری سفارشی ایجاد کنید، میتوانید از ویژگیهای زیر در Android 11 استفاده کنید:
- توضیح سَمت کاربر برای سرویس دسترسپذیری اکنون علاوهبر نوشتار ساده، HTML و تصویر را نیز مجاز میکند. این انعطافپذیری توضیح دادن اینکه سرویس شما چه کاری انجام میدهد و چگونه میتواند به کاربران نهایی کمک کند را آسانتر میکند.
- برای کار با شرحی از وضعیت عنصر میانای کاربر که ازنظر معنایی بامعنیتر از
contentDescriptionباشد، روشgetStateDescription()را فراخوانی کنید. - برای درخواست اینکه رویدادهای لمسی کاوشگر لمسی سیستم را دور بزنند،
setTouchExplorationPassthroughRegion()را فراخوانی کنید. بهطور مشابه، برای درخواست اینکه اشارهها از آشکارساز اشاره سیستم عبور کنند،setGestureDetectionPassthroughRegion()را فراخوانی کنید. - میتوانید کنشهای IME، مثل «ورود» و «بعدی»، و همچنین نماگرفتهای پنجرههایی را که پرچم
FLAG_SECUREرا فعال نمیکنند درخواست کنید.
ویژگیهای اضافی
دلایل خروج از فرایند برنامه
Android 11 روش
ActivityManager.getHistoricalProcessExitReasons()
را معرفی میکند که دلایل هرگونه توقف فرایند اخیر را گزارش میکند. برنامهها میتوانند از این روش برای جمعآوری اطلاعات عیبیابی خرابی استفاده کنند، مثلاً اینکه آیا توقف فرایند بهدلیل ANR، مشکلات حافظه، یا دلایل دیگر است.
علاوهبراین، میتوانید از روش جدید
setProcessStateSummary()
برای ذخیره اطلاعات وضعیت سفارشی برای تجزیهوتحلیل بعدی استفاده کنید.
روش getHistoricalProcessExitReasons() نمونههایی از کلاس
ApplicationExitInfo
را برمیگرداند که حاوی اطلاعات مربوط به توقف فرایند برنامه است. با فراخوانی
getReason() در نمونهای از این کلاس، میتوانید تعیین کنید چرا فرایند برنامهتان
متوقف شده است. برای مثال، مقدار برگشتی REASON_CRASH نشان میدهد که
یک استثنای مدیریتنشده در برنامه شما رخ داده است. اگر برنامه شما نیاز به اطمینان از
منحصربهفرد بودن رویدادهای خروج دارد، میتواند یک شناسه خاص برنامه را حفظ کند، مانند
یک مقدار درهمسازی براساس مُهر زمان از
getTimestamp()
روش.
منابع بیشتر
برای اطلاعات بیشتر، مقاله مربوط به ابزارهای جدید Android 11 برای خصوصیتر و پایدارتر کردن برنامهها را در Medium بخوانید.
بارکنندههای منبع
Android 11 میانای برنامهسازی کاربردی جدیدی را معرفی میکند که به برنامهها اجازه میدهد
نحوه جستجو و بار کردن منابع را بهطور پویا گسترش دهند. کلاسهای جدید میانای برنامهسازی کاربردی
ResourcesLoader
و
ResourcesProvider
عمدتاً مسئول ارائه عملکرد جدید هستند. این دو باهم
امکان ارائه منابع و داراییهای اضافی یا اصلاح
مقادیر منابع و داراییهای موجود را فراهم میکنند.
اشیاء ResourcesLoader محفظههایی هستند که اشیاء ResourcesProvider را برای نمونه Resources برنامه فراهم میکنند. بهنوبه خود، اشیاء ResourcesProvider روشهایی برای بار کردن دادههای منبع از APK و جدولهای منبع ارائه میدهند.
یکی از موارد استفاده اصلی این API، بار کردن دارایی سفارشی است. میتوانید از
loadFromDirectory()
برای ایجاد ResourcesProvider استفاده کنید که وضوح منابع و داراییهای مبتنی بر فایل را تغییر مسیر میدهد و باعث میشود بهجای APK برنامه، در فهرست راهنمای خاصی جستجو کند. میتوانید ازطریق خانواده روشهای open() از کلاس میانای برنامهسازی کاربردی
AssetManager
به این داراییها دسترسی داشته باشید، درست مانند داراییهای بستهبندیشده در APK.
طرح امضای APK نسخه ۴
Android 11 پشتیبانی از طرح امضای APK نسخه ۴ را اضافه میکند. این طرح
نوع جدیدی از امضا را در فایل جداگانهای (apk-name.apk.idsig) تولید میکند اما
درغیراینصورت مشابه نسخه ۲ و ۳ است. هیچ تغییری در APK ایجاد نمیشود. این طرح از
نصب APK افزایشی ADB پشتیبانی میکند که نصب APK را سرعت میبخشد.
فیلترهای قصد پویا
برای دریافت قصدها، برنامه باید در زمان ترجمه با تعریف کردن فیلتر قصد در مانیفست برنامه، مشخص کند که چه نوع دادههایی را میتواند دریافت کند. در Android 10 و نسخههای پایینتر، برنامهها هیچ راهی برای تغییر فیلترهای قصد خود در زمان اجرا ندارند. این موضوع برای برنامههای مجازیسازی (مانند ماشینهای مجازی و میزکارهای راه دور) مشکلساز است، زیرا این برنامهها نمیتوانند دقیقاً بدانند که کاربر چه نرمافزاری را در آنها نصب خواهد کرد.
Android 11 گروههای MIME را معرفی میکند، عنصر مانیفست جدیدی که به برنامه امکان میدهد
مجموعه پویایی از انواع MIME را در فیلتر هدف اعلام کند و آن را
بهصورت برنامهنویسیشده در زمان اجرا اصلاح کند. برای استفاده از گروه MIME، عنصر دادهای را با مشخصه جدید android:mimeGroup در مانیفست برنامهتان اضافه کنید:
<intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeGroup="myMimeGroup"/> </intent-filter>
مقدار مشخصه android:mimeGroup یک شناسه رشتهای دلخواه است که
گروه MIME را در زمان اجرا شناسایی میکند. میتوانید با ارسال شناسه گروه MIME به روشهای جدید زیر در کلاس
PackageManager API،
به محتوای آن دسترسی پیدا کنید و آن را بهروز کنید:
وقتی نوع MIME را بهصورت برنامهنویسیشده به گروه MIME اضافه میکنید، عملکرد آن دقیقاً مشابه نوع MIME ثابتی است که بهطور صریح در مانیفست اعلام شده است.
بهبودهای تکمیل خودکار
Android 11 بهبودهایی را برای سرویسهای تکمیل خودکار معرفی میکند.
شناسههای اشاره در AssistStructure.ViewNode
اغلب برای سرویسهای تکمیل خودکار مفید است که درهمسازی امضا را برای یک نما
براساس ویژگیهای آن نما محاسبه کنند. نکته نمای ویژگی بسیار خوبی برای گنجاندن هنگام محاسبه درهمسازی امضا است، اما رشته نکته ممکن است با زبان تلفن تغییر کند. برای حل این مشکل، Android 11
AssistStructure.ViewNode
را با روش جدید
getHintIdEntry()
گسترش میدهد که شناسه منبع را برای متن راهنمای نما برمیگرداند. این روش مقداری مستقل از زبان ارائه میدهد که میتوانید از آن برای محاسبه درهمسازیهای امضا استفاده کنید.
رویدادهای نمایش مجموعه دادهها
برای کمک به سرویسهای تکمیل خودکار در بهبود پیشنهادهایشان، Android 11 روشی
برای شناسایی مواردی ارائه میدهد که سرویس تکمیل خودکار مجموعهدادههایی را ارائه کرده است اما کاربر
هیچکدام را انتخاب نکرده است. در Android 11،
FillEventHistory
نوع رویداد جدید
TYPE_DATASETS_SHOWN
را گزارش میکند. FillEventHistory هرگاه سرویس تکمیل خودکار یک یا چند مجموعه داده را به کاربر ارائه دهد، رویدادی از این نوع را ثبت میکند. سرویسهای تکمیل خودکار میتوانند از این رویدادها در کنار رویداد موجود
TYPE_DATASET_SELECTED
استفاده کنند تا تعیین کنند آیا کاربر هیچکدام از گزینههای تکمیل خودکار ارائهشده را انتخاب کرده است یا نه.
یکپارچهسازی IME
صفحهکلیدها و سایر IMEها اکنون میتوانند پیشنهادهای تکمیل خودکار را بهجای منوِ کرکرهای، بهصورت درونخطی در نوار پیشنهاد یا میانای مشابهی نمایش دهند. برای محافظت از اطلاعات حساس مانند گذرواژهها و شمارههای کارت اعتباری، پیشنهادها به کاربر نمایش داده میشوند اما تا زمانی که کاربر یکی را انتخاب نکند، برای IME شناخته نمیشوند. برای کسب اطلاعات درباره نحوه پشتیبانی IME و مدیران گذرواژه از این ویژگی، ادغام تکمیل خودکار با صفحهکلید را ببینید.
همرسانی داده با سرویس ضبط محتوا
از Android 11، برنامهتان میتواند دادهها را با سرویس ضبط محتوای دستگاه همرسانی کند. این قابلیت به دستگاه کمک میکند تا هوش درونبافتی را راحتتر ارائه دهد، مثلاً نام آهنگی را که درحالحاضر در محیط کاربر درحال پخش است نشان دهد.
برای دردسترس قرار دادن دادههای برنامهتان برای سرویس ضبط محتوا،
روش shareData() را در نمونهای از ContentCaptureManager فراخوانی کنید. اگر سیستم درخواست همرسانی داده را بپذیرد، برنامه شما توصیفگر فایل فقط-نوشتنی را برای همرسانی با سرویس ضبط محتوا دریافت میکند.