اندروید ۱۱ ویژگیها و APIهای جدید و فوقالعادهای را برای توسعهدهندگان معرفی میکند. بخشهای زیر به شما کمک میکنند تا در مورد ویژگیهای برنامههای خود اطلاعات کسب کنید و با APIهای مرتبط شروع به کار کنید.
برای مشاهده لیست کاملی از APIهای جدید، اصلاحشده و حذفشده، گزارش تفاوت API را مطالعه کنید. برای جزئیات بیشتر در مورد APIهای جدید، به مرجع API اندروید مراجعه کنید - APIهای جدید برای مشاهدهپذیری برجسته شدهاند. همچنین، برای کسب اطلاعات در مورد حوزههایی که تغییرات پلتفرم ممکن است بر برنامههای شما تأثیر بگذارد، حتماً تغییرات رفتاری اندروید ۱۱ را برای برنامههایی که اندروید R را هدف قرار میدهند و برای همه برنامهها ، و همچنین تغییرات حریم خصوصی ، بررسی کنید.
تجربههای جدید
کنترلهای دستگاه
اندروید ۱۱ شامل یک API جدید ControlsProviderService است که میتوانید از آن برای نمایش کنترلها برای دستگاههای خارجی متصل استفاده کنید. این کنترلها در منوی پاور اندروید، در قسمت Device controls ظاهر میشوند. برای اطلاعات بیشتر، به Control external devices مراجعه کنید.
کنترلهای رسانهای
اندروید ۱۱ نحوه نمایش کنترلهای رسانه را بهروزرسانی میکند. کنترلهای رسانه در نزدیکی تنظیمات سریع ظاهر میشوند. جلسات از چندین برنامه در یک چرخ فلک قابل کشیدن مرتب میشوند که شامل پخشهای محلی در تلفن، پخشهای از راه دور، مانند مواردی که در دستگاههای خارجی یا جلسات پخش شناسایی شدهاند، و جلسات قبلی و قابل از سرگیری به ترتیب آخرین پخش آنها میشود.
کاربران میتوانند جلسات قبلی را از طریق چرخ فلک و بدون نیاز به اجرای برنامه، مجدداً راهاندازی کنند. وقتی پخش شروع میشود، کاربر به روش معمول با کنترلهای رسانه تعامل میکند.
برای اطلاعات بیشتر، به کنترلهای رسانهای مراجعه کنید.
صفحه نمایش ها
پشتیبانی بهتر از نمایشگرهای آبشاری
اندروید ۱۱ چندین API برای پشتیبانی از نمایشگرهای آبشاری ، نمایشگرهایی که در لبه دستگاه قرار میگیرند، ارائه میدهد. این نمایشگرها به عنوان نوعی از نمایشگرها با بریدگیهای نمایشگر در نظر گرفته میشوند. متدهای موجود DisplayCutout .getSafeInset…() اکنون مقدار safe inset را برمیگردانند تا از نواحی آبشاری و همچنین بریدگیها جلوگیری شود. برای رندر کردن محتوای برنامه خود در ناحیه آبشاری، موارد زیر را انجام دهید:
برای دریافت ابعاد دقیق عنصر آبشاری، تابع
DisplayCutout.getWaterfallInsets()را فراخوانی کنید.ویژگی طرحبندی پنجره
layoutInDisplayCutoutModeرویLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYSتنظیم کنید تا پنجره بتواند در تمام لبههای صفحه نمایش، در نواحی برش و آبشاری امتداد یابد. باید مطمئن شوید که هیچ محتوای ضروری در نواحی برش یا آبشاری وجود ندارد.
حسگر زاویه لولا و تاشوها
اندروید ۱۱ با ارائه یک حسگر جدید با نام TYPE_HINGE_ANGLE و یک SensorEvent جدید که میتواند زاویه لولا را رصد کند و اندازهگیری بر حسب درجه بین دو قسمت جداییناپذیر دستگاه را ارائه دهد، به برنامههایی که روی دستگاههایی با پیکربندی صفحه نمایش مبتنی بر لولا اجرا میشوند، این امکان را میدهد که زاویه لولا را تعیین کنند. شما میتوانید از این اندازهگیریهای خام برای انجام انیمیشنهای جزئی هنگام دستکاری دستگاه توسط کاربر استفاده کنید.
به تاشوها مراجعه کنید.
مکالمات
بهبود مکالمه
اندروید ۱۱ پیشرفتهای زیادی در نحوهی مدیریت مکالمات ایجاد کرده است. مکالمات، ارتباطات دوطرفه و بلادرنگ بین دو یا چند نفر هستند. به این مکالمات اهمیت ویژهای داده شده است و کاربران چندین گزینهی جدید برای نحوهی تعامل با آنها دارند.
برای اطلاعات بیشتر در مورد مکالمات و نحوه پشتیبانی برنامه شما از آنها، به بخش افراد و مکالمات مراجعه کنید.
حبابهای چت
حبابها (Bubbles) اکنون برای کمک به نمایش مکالمات در سراسر سیستم، در دسترس توسعهدهندگان قرار گرفتهاند. حبابها یک ویژگی آزمایشی در اندروید ۱۰ بودند که از طریق گزینه توسعهدهندگان فعال میشدند؛ در اندروید ۱۱، دیگر نیازی به این کار نیست.
اگر برنامهای اندروید ۱۱ (سطح API 30) یا بالاتر را هدف قرار دهد، اعلانهای آن به صورت حباب نمایش داده نمیشوند، مگر اینکه الزامات مکالمه جدید را برآورده کنند. به طور خاص، اعلان باید با یک میانبر مرتبط باشد.
قبل از اندروید ۱۱، اگر میخواستید یک اعلان به صورت حبابی نمایش داده شود، باید صریحاً مشخص میکردید که اعلان طوری تنظیم شده است که همیشه در حالت رابط کاربری سند اجرا شود. از اندروید ۱۱ به بعد، دیگر نیازی به انجام صریح این تنظیم نیست؛ اگر اعلان به صورت حبابی نمایش داده شود، پلتفرم به طور خودکار اعلان را طوری تنظیم میکند که همیشه در حالت رابط کاربری سند اجرا شود.
تعدادی بهبود در عملکرد حبابها وجود دارد و کاربران انعطافپذیری بیشتری در فعال و غیرفعال کردن حبابها از هر برنامه دارند. برای توسعهدهندگانی که پشتیبانی آزمایشی را پیادهسازی کردهاند، چند تغییر در APIهای اندروید ۱۱ وجود دارد:
- سازندهی
BubbleMetadata.Builder()بدون پارامتر منسوخ شده است. در عوض، از یکی از دو سازندهی جدیدBubbleMetadata.Builder(PendingIntent, Icon)یاBubbleMetadata.Builder(String)استفاده کنید. - با فراخوانی
BubbleMetadata.Builder(String)از یک شناسه میانبرBubbleMetadataایجاد کنید. رشته ارسالی باید با شناسه میانبر ارائه شده بهNotification.Builderمطابقت داشته باشد. - با استفاده از
Icon.createWithContentUri()یا با استفاده از متد جدیدcreateWithAdaptiveBitmapContentUri()آیکونهای حبابی ایجاد کنید.
شاخصهای بصری 5G
برای اطلاعات بیشتر در مورد نمایش نشانگرهای 5G در دستگاههای کاربران، به بخش «به کاربران خود بگویید چه زمانی به 5G متصل هستند» مراجعه کنید.
حریم خصوصی
اندروید ۱۱ تغییرات و محدودیتهای زیادی را برای افزایش حریم خصوصی کاربران معرفی میکند. برای کسب اطلاعات بیشتر، به صفحه حریم خصوصی مراجعه کنید.
امنیت
بهروزرسانیهای احراز هویت بیومتریک
برای کمک به شما در کنترل سطح امنیت دادههای برنامهتان، اندروید ۱۱ پیشرفتهای متعددی در احراز هویت بیومتریک ارائه میدهد. این تغییرات همچنین در کتابخانه بیومتریک Jetpack نیز ظاهر میشوند.
انواع احراز هویت
اندروید ۱۱ رابط کاربری BiometricManager.Authenticators را معرفی میکند که میتوانید از آن برای اعلام انواع احراز هویتی که برنامه شما پشتیبانی میکند، استفاده کنید.
مشخص کنید از کدام نوع احراز هویت استفاده شده است
پس از تأیید اعتبار کاربر، میتوانید با فراخوانی تابع getAuthenticationType() بررسی کنید که آیا کاربر با استفاده از اعتبارنامه دستگاه یا اعتبارنامه بیومتریک تأیید اعتبار شده است.
پشتیبانی بیشتر از کلیدهای احراز هویت به ازای هر بار استفاده
اندروید ۱۱ پشتیبانی بیشتری از احراز هویت با استفاده از کلیدهای auth-per-use ارائه میدهد.
متدهای منسوخ شده
اندروید ۱۱ متدهای زیر را منسوخ میکند:
- متد
setDeviceCredentialAllowed(). - متد
setUserAuthenticationValidityDurationSeconds(). - نسخه سربارگذاریشدهی
canAuthenticate()که هیچ آرگومانی دریافت نمیکند.
اشتراکگذاری امن مجموعه دادههای بزرگ
در برخی موقعیتها، مانند مواردی که شامل یادگیری ماشین یا پخش رسانه میشوند، برنامه شما ممکن است بخواهد از همان مجموعه داده بزرگی که برنامه دیگری استفاده میکند، استفاده کند. در نسخههای قبلی اندروید، برنامه شما و برنامه دیگر هر کدام نیاز به دانلود یک نسخه جداگانه از همان مجموعه داده داشتند.
برای کمک به کاهش افزونگی دادهها، چه در شبکه و چه روی دیسک، اندروید ۱۱ به این مجموعه دادههای بزرگ اجازه میدهد تا با استفاده از حبابهای داده مشترک ، در دستگاه ذخیره شوند. برای کسب اطلاعات بیشتر در مورد اشتراکگذاری مجموعه دادهها، به راهنمای جامع اشتراکگذاری مجموعه دادههای بزرگ مراجعه کنید.
رمزگذاری مبتنی بر فایل را پس از راهاندازی مجدد OTA بدون نیاز به اطلاعات کاربری انجام دهید
پس از اینکه دستگاه بهروزرسانی OTA را تکمیل و مجدداً راهاندازی کرد، کلیدهای رمزگذاریشدهی اعتبارنامه (CE) که در حافظهی محافظتشده با اعتبارنامه قرار دارند، بلافاصله برای عملیات رمزگذاری مبتنی بر فایل (FBE) در دسترس قرار میگیرند. این بدان معناست که پس از بهروزرسانی OTA، برنامهی شما میتواند عملیاتی را که به کلیدهای CE نیاز دارند، قبل از اینکه کاربر پین، الگو یا رمز عبور خود را وارد کند، از سر بگیرد.
عملکرد و کیفیت
اشکالزدایی بیسیم
اندروید ۱۱ از طریق Android Debug Bridge (adb) از استقرار و اشکالزدایی برنامه شما به صورت بیسیم از ایستگاه کاری شما پشتیبانی میکند. به عنوان مثال، میتوانید برنامه اشکالزدایی شده خود را بدون اتصال فیزیکی دستگاه خود از طریق USB و مواجهه با مشکلات رایج اتصال USB، مانند نصب درایور، روی چندین دستگاه از راه دور مستقر کنید. برای اطلاعات بیشتر، به بخش «اجرای برنامهها روی یک دستگاه سختافزاری» مراجعه کنید.
نصب APK افزایشی ADB
نصب فایلهای APK حجیم (بیش از ۲ گیگابایت) روی یک دستگاه میتواند زمان زیادی طول بکشد، حتی اگر فقط یک تغییر کوچک در یک برنامه ایجاد شود. نصب تدریجی APK توسط ADB (پل اشکالزدایی اندروید) با نصب مقدار کافی از APK برای راهاندازی برنامه و در عین حال پخش دادههای باقیمانده در پسزمینه، این فرآیند را تسریع میکند. adb install در صورت پشتیبانی دستگاه از این ویژگی و نصب آخرین ابزارهای پلتفرم SDK ، به طور خودکار از آن استفاده خواهد کرد. در صورت عدم پشتیبانی، روش نصب پیشفرض به صورت بیصدا استفاده میشود.
برای استفاده از این ویژگی از دستور adb زیر استفاده کنید. اگر دستگاه از نصب تدریجی پشتیبانی نکند، دستور اجرا نمیشود و توضیحی طولانی چاپ میکند.
adb install --incremental
قبل از اجرای نصب افزایشی ADB APK، باید APK خود را امضا کنید و یک فایل APK Signature Scheme نسخه ۴ ایجاد کنید. برای اینکه این ویژگی کار کند، فایل امضای نسخه ۴ باید در کنار APK قرار گیرد.
تشخیص خطا با استفاده از تخصیصدهنده حافظه بومی
GWP-ASan یک ویژگی تخصیصدهنده حافظه بومی است که به یافتن اشکالات use-after-free و heap-buffer-overflow کمک میکند. میتوانید این ویژگی را به صورت سراسری یا برای زیرفرآیندهای خاصی از برنامه خود فعال کنید. برای کسب اطلاعات بیشتر، به راهنمای GWP-Asan مراجعه کنید.
API شبکههای عصبی ۱.۳
اندروید ۱۱ رابط برنامهنویسی کاربردی شبکههای عصبی (NNAPI) را گسترش داده و بهبود میبخشد.
عملیات جدید
NNAPI 1.3 یک نوع عملوند جدید، TENSOR_QUANT8_ASYMM_SIGNED ، را برای پشتیبانی از طرح کوانتیزاسیون جدید TensorFlow Lite معرفی میکند.
علاوه بر این، NNAPI 1.3 عملیات جدید زیر را معرفی میکند:
-
QUANTIZED_LSTM -
IF -
WHILE -
ELU -
HARD_SWISH -
FILL -
RANK
کنترلهای جدید یادگیری ماشین
NNAPI 1.3 کنترلهای جدیدی را برای کمک به اجرای روان یادگیری ماشینی معرفی میکند:
رابط برنامهنویسی کاربردی QoS: رابط برنامهنویسی کاربردی جدید کیفیت خدمات شامل پشتیبانی از اولویتبندی و مهلتهای زمانی وظایف در NNAPI با عملکردهای جدید زیر است:
ورودی/خروجی دامنه حافظه: NNAPI 1.3 شامل پشتیبانی از دامنههای حافظه به عنوان ورودی و خروجی برای اجرا است. این امر کپیهای غیرضروری از دادههای مشابه را در بین اجزای مختلف سیستم حذف میکند و عملکرد زمان اجرای شبکههای عصبی اندروید را بهبود میبخشد. این ویژگی مجموعهای از APIهای جدید NDK را برای استفاده با اشیاء
ANeuralNetworksMemoryDescوANeuralNetworkMemoryاضافه میکند، از جمله توابع زیر:-
ANeuralNetworksMemoryDesc_create() -
ANeuralNetworksMemoryDesc_free() -
ANeuralNetworksMemoryDesc_addInputRole() -
ANeuralNetworksMemoryDesc_addOutputRole() -
ANeuralNetworksMemoryDesc_setDimensions() -
ANeuralNetworksMemoryDesc_finish() -
ANeuralNetworksMemory_createFromDesc() -
ANeuralNetworksMemory_copy()
برای کسب اطلاعات بیشتر، به نمونه دامنه حافظه شبکه عصبی مراجعه کنید.
-
پشتیبانی از API وابستگی و حصار همگامسازی: NNAPI 1.3 شامل پشتیبانی از محاسبات ناهمزمان با وابستگیها است که امکان کاهش سربار هنگام فراخوانی مدلهای زنجیرهای کوچک را فراهم میکند. این ویژگی توابع جدید زیر را اضافه میکند:
جریان کنترل: NNAPI 1.3 شامل پشتیبانی از جریان کنترل عمومی با عملیات گراف جدید
ANEURALNETWORKS_IFوANEURALNETWORKS_WHILEاست که مدلهای دیگر را به عنوان آرگومان با استفاده از نوع عملوند جدیدANEURALNETWORKS_MODELمیپذیرند. علاوه بر این، این ویژگی توابع جدید زیر را اضافه میکند:
API حرارتی NDK
وقتی دستگاهها خیلی گرم میشوند، ممکن است CPU و/یا GPU را تحت فشار قرار دهند و این میتواند برنامهها را به روشهای غیرمنتظرهای تحت تأثیر قرار دهد. برنامهها یا بازیهایی که شامل گرافیک پیچیده، محاسبات سنگین یا فعالیت شبکهای مداوم هستند، بیشتر احتمال دارد با مشکل مواجه شوند.
از API حرارتی NDK در اندروید ۱۱ برای نظارت بر تغییرات دمای دستگاه استفاده کنید و سپس اقداماتی را برای حفظ مصرف برق کمتر و دمای خنکتر دستگاه انجام دهید. این API مشابه API حرارتی جاوا است؛ میتوانید از آن برای دریافت اعلانها برای هرگونه تغییر وضعیت حرارتی یا نظرسنجی مستقیم از وضعیت فعلی استفاده کنید.
متن و ورودی
بهبود انتقالهای IME
اندروید ۱۱ رابطهای برنامهنویسی کاربردی (API) جدیدی را برای بهبود انتقالها در ویرایشگرهای روش ورودی (IMEها)، مانند صفحهکلیدهای روی صفحه، معرفی میکند. این رابطهای برنامهنویسی کاربردی، تنظیم محتوای برنامه شما را در هماهنگی با ظاهر و ناپدید شدن IME و سایر عناصر مانند نوارهای وضعیت و ناوبری، آسانتر میکنند.
برای نمایش یک IME در حالی که هر EditText فوکوس دارد، متد view.getInsetsController(). show(Type.ime()) را فراخوانی کنید. (میتوانید این متد را روی هر view در سلسله مراتب مشابه EditText فوکوس شده فراخوانی کنید، لازم نیست آن را به طور خاص روی EditText فراخوانی کنید.) برای پنهان کردن IME، متد view.getInsetsController(). hide(Type.ime()) را فراخوانی کنید. میتوانید با فراخوانی view.getRootWindowInsets(). isVisible(Type.ime()) بررسی کنید که آیا یک IME در حال حاضر قابل مشاهده است یا خیر.
برای همگامسازی نماهای برنامه خود با ظاهر و ناپدید شدن IME، با ارائه WindowInsetsAnimation.Callback به View.setWindowInsetsAnimationCallback() ، یک شنونده (listener) روی یک نما تنظیم کنید. (میتوانید این شنونده را روی هر نمایی تنظیم کنید، لازم نیست حتماً 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() {} });
بهروزرسانی کتابخانههای بخش مراقبتهای ویژه
اندروید ۱۱ بسته android.icu را بهروزرسانی کرده تا از نسخه ۶۶ کتابخانه ICU استفاده کند، در مقایسه با نسخه ۶۳ در اندروید ۱۰. نسخه جدید کتابخانه شامل دادههای محلی CLDR بهروزرسانیشده و تعدادی بهبود در پشتیبانی بینالمللیسازی در اندروید است.
از جمله تغییرات قابل توجه در نسخههای جدید کتابخانه میتوان به موارد زیر اشاره کرد:
- بسیاری از APIهای قالببندی اکنون از نوع شیء بازگشتی جدیدی پشتیبانی میکنند که
FormattedValueبسط میدهد. - API
LocaleMatcherبا یک کلاس سازنده، پشتیبانی از نوعjava.util.Localeو یک کلاس نتیجه که شامل دادههای اضافی در مورد یک تطابق است، بهبود یافته است. - اکنون از یونیکد ۱۳ پشتیبانی میشود.
رسانه
تخصیص بافرهای MediaCodec
اندروید ۱۱ شامل یک رابط برنامهنویسی کاربردی جدید MediaCodec است که به برنامهها کنترل بیشتری در تخصیص بافرهای ورودی و خروجی میدهد. این به برنامه شما اجازه میدهد تا حافظه را به طور کارآمدتری مدیریت کند.
کلاسهای جدید:
روشهای جدید:
-
MediaCodec.getQueueRequest() -
MediaCodec.getOutputFrame() -
MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
علاوه بر این، رفتار دو متد در MediaCodec.Callback() تغییر کرده است:
-
onInputBufferAvailable() - اگر برنامهها طوری پیکربندی شده باشند که از API مدل بلوکی استفاده کنند، به جای فراخوانی
MediaCodec.getInputBuffer()وMediaCodec.queueInputBuffer()با اندیس، بایدMediaCodec.getQueueRequestبا اندیس استفاده کنند و یک LinearBlock/HardwareBuffer را به اسلات متصل کنند. -
onOutputBufferAvailable() - به جای فراخوانی
MediaCodec.getOutputBuffer()به همراه اندیس، برنامهها میتوانند ازMediaCodec.getOutputFrame()به همراه اندیس استفاده کنند تا شیءOutputFrameرا به همراه اطلاعات بیشتر و بافرهای LinearBlock/HardwareBuffer دریافت کنند.
رمزگشایی با تأخیر کم در MediaCodec
اندروید ۱۱، MediaCodec برای پشتیبانی از رمزگشایی با تأخیر کم برای بازیها و سایر برنامههای بلادرنگ بهبود بخشیده است. میتوانید با ارسال FEATURE_LowLatency به MediaCodecInfo.CodecCapabilities.isFeatureSupported() بررسی کنید که آیا یک کدک از رمزگشایی با تأخیر کم پشتیبانی میکند یا خیر.
برای روشن یا خاموش کردن رمزگشایی با تأخیر کم، یکی از موارد زیر را انجام دهید:
- با استفاده از
MediaCodec.configure()مقدار کلید جدیدKEY_LOW_LATENCYرا روی ۰ یا ۱ تنظیم کنید. - با استفاده از
MediaCodec.setParameters()مقدار پارامتر جدیدPARAMETER_KEY_LOW_LATENCYروی ۰ یا ۱ تنظیم کنید.
تابع جدید AAudio به نام AAudioStream_release()
تابع AAudioStream_close() یک جریان صوتی را همزمان آزاد و بسته میکند. این میتواند خطرناک باشد. اگر فرآیند دیگری پس از بسته شدن جریان صوتی سعی در دسترسی به آن داشته باشد، فرآیند از کار میافتد.
تابع جدید AAudioStream_release() استریم را آزاد میکند اما آن را نمیبندد. این کار منابع آن را آزاد کرده و استریم را در وضعیت شناختهشدهای رها میکند. این شیء تا زمانی که AAudioStream_close() را فراخوانی کنید، باقی میماند.
رابط برنامهنویسی کاربردی مدیاپارسر
MediaParser یک API سطح پایین جدید برای استخراج رسانه است. این API از MediaExtractor انعطافپذیرتر است و کنترل بیشتری بر عملکرد استخراج رسانه ارائه میدهد.
ضبط صدا از دستگاه USB
وقتی یک برنامه بدون مجوز RECORD_AUDIO از UsbManager برای درخواست دسترسی مستقیم به یک دستگاه صوتی USB با قابلیت ضبط صدا (مانند هدست USB) استفاده میکند، یک پیام هشدار جدید ظاهر میشود و از کاربر میخواهد که مجوز استفاده از دستگاه را تأیید کند. سیستم هرگونه گزینه «همیشه استفاده شود» را نادیده میگیرد، بنابراین کاربر باید هر بار که برنامهای درخواست دسترسی میکند، هشدار را تأیید کرده و مجوز را اعطا کند.
برای جلوگیری از این رفتار، برنامه شما باید مجوز RECORD_AUDIO را درخواست کند.
دسترسی همزمان به میکروفون
اندروید ۱۱ متدهای جدیدی را به APIهای AudioRecord ، MediaRecorder و AAudioStream اضافه میکند. این متدها قابلیت ضبط همزمان را صرف نظر از مورد استفاده انتخاب شده فعال و غیرفعال میکنند. به بخش اشتراکگذاری ورودی صدا مراجعه کنید.
سوئیچر خروجی
اندروید ۱۱ رفتار جدیدی را برای برنامههایی که از APIهای cast و mediarouter استفاده میکنند، پیادهسازی میکند.
علاوه بر دسترسی به گزینههای پخش از داخل یک برنامه، گزینههای تغییر نیز در پخشکننده رسانه سیستم ظاهر میشوند. این امر به کاربر کمک میکند تا هنگام جابجایی بین دستگاهها، با تغییر زمینههای مشاهده و گوش دادن، مانند تماشای ویدیو در آشپزخانه در مقابل تلفن، یا گوش دادن به صدا در خانه یا ماشین، سفری روان داشته باشد. به تغییردهنده خروجی مراجعه کنید.
اتصال
پیشرفتهای Wi-Fi Passpoint
برای اطلاعات بیشتر در مورد قابلیتهای Passpoint که در اندروید ۱۱ اضافه شده است، به Passpoint مراجعه کنید.
رابط برنامهنویسی کاربردی پیشنهاد وایفای گسترش یافته است
اندروید ۱۱ رابط برنامهنویسی کاربردی (API) پیشنهاد وایفای (Wi-Fi Suggestion) را گسترش میدهد تا قابلیتهای مدیریت شبکه برنامه شما، از جمله موارد زیر را افزایش دهد:
- برنامههای مدیریت اتصال میتوانند با اجازه دادن به درخواستهای قطع اتصال، شبکههای خود را مدیریت کنند.
- شبکههای Passpoint در API پیشنهاد ادغام شدهاند و میتوانند به کاربر پیشنهاد شوند.
- APIهای تحلیلی شما را قادر میسازند تا اطلاعاتی در مورد کیفیت شبکههای خود دریافت کنید.
بهروزرسانیهای سرویس غربالگری تماس
از اندروید ۱۱ به بعد، یک سرویس غربالگری تماس (CallScreeningService) میتواند اطلاعاتی در مورد وضعیت تأیید STIR/SHAKEN (verstat) برای تماسهای ورودی درخواست کند. این اطلاعات به عنوان بخشی از جزئیات تماس برای تماسهای ورودی ارائه میشود.
اگر یک CallScreeningService مجوز READ_CONTACTS را داشته باشد، هنگامی که تماسهای ورودی از یا تماسهای خروجی به شمارهای در مخاطبین کاربر وجود دارد، برنامه مطلع میشود.
برای اطلاعات بیشتر، به جلوگیری از جعل شناسه تماسگیرنده مراجعه کنید.
بهروزرسانیهای API موبایل را باز کنید
برای اطلاعات بیشتر در مورد پشتیبانی OMAPI در اندروید ۱۱ و بالاتر، به پشتیبانی از Open Mobile API reader مراجعه کنید.
VPN های کارآمد
برنامههایی که API سطح ۳۰ و بالاتر را هدف قرار میدهند یا روی دستگاههایی که با API سطح ۲۹ و بالاتر راهاندازی شدهاند اجرا میشوند، میتوانند IKEv2/IPsec را روی VPNها، چه برای VPNهای پیکربندیشده توسط کاربر و چه برای VPNهای مبتنی بر برنامه، اعمال کنند.
VPN ها به صورت بومی در سیستم عامل اجرا می شوند و کد مورد نیاز برای ایجاد اتصالات IKEv2/IPsec VPN را در یک برنامه ساده می کنند.
کنترل دسترسی شبکه به ازای هر فرآیند
برای اطلاعات بیشتر در مورد فعال کردن دسترسی به شبکه بر اساس هر فرآیند، به مدیریت استفاده از شبکه مراجعه کنید.
اجازه دهید چندین پیکربندی Passpoint نصب شده با FQDN یکسان داشته باشیم
از اندروید ۱۱ به بعد، میتوانید از PasspointConfiguration.getUniqueId() برای دریافت یک شناسه منحصر به فرد برای شیء PasspointConfiguration استفاده کنید، که به کاربران برنامه شما امکان میدهد چندین پروفایل را با نام دامنه کاملاً واجد شرایط (FQDN) یکسان نصب کنند.
این قابلیت زمانی مفید است که یک اپراتور بیش از یک ترکیب از کد کشور موبایل (MCC) و کد شبکه موبایل (MNC) را در شبکه خود مستقر کند، اما فقط یک FQDN واحد داشته باشد. در اندروید ۱۱ و بالاتر، میتوان بیش از یک پروفایل با FQDN یکسان نصب کرد که با شبکه ارائه دهنده اصلی مطابقت داشته باشد، زمانی که کاربر سیمکارتی با MCC یا MNC نصب میکند.
پشتیبانی از آنتن GNSS
اندروید ۱۱ کلاس GnssAntennaInfo را معرفی میکند که به برنامه شما این امکان را میدهد تا از موقعیتیابی با دقت سانتیمتری که سیستم ماهوارهای ناوبری جهانی (GNSS) ارائه میدهد، بیشتر استفاده کند.
برای کسب اطلاعات بیشتر در مورد کالیبراسیون آنتن، به راهنمای مربوطه مراجعه کنید.
گرافیک
رمزگشای تصویر NDK
رابط برنامهنویسی کاربردی NDK ImageDecoder یک رابط برنامهنویسی کاربردی (API) استاندارد برای برنامههای اندروید C/C++ فراهم میکند تا تصاویر را مستقیماً رمزگشایی کنند. توسعهدهندگان برنامه دیگر نیازی به استفاده از APIهای چارچوب (از طریق JNI) یا بستهبندی کتابخانههای رمزگشایی تصویر شخص ثالث ندارند. برای اطلاعات بیشتر، به راهنمای توسعهدهنده Image decoder مراجعه کنید.
رابط برنامهنویسی نرخ فریم
اندروید ۱۱ یک API ارائه میدهد که به برنامهها امکان میدهد نرخ فریم مورد نظر خود را به سیستم اطلاع دهند تا لرزش در دستگاههایی که از چندین نرخ تازهسازی پشتیبانی میکنند، کاهش یابد. برای اطلاعات بیشتر در مورد نحوه استفاده از این API، به راهنمای نرخ فریم مراجعه کنید.
درخواست و بررسی پشتیبانی از تأخیر کم
برخی نمایشگرها میتوانند پردازش گرافیکی را انجام دهند، مانند برخی نمایشگرهای خارجی و تلویزیونها. این پردازش گرافیکی، گرافیک را بهبود میبخشد اما میتواند تأخیر را افزایش دهد. نمایشگرهای جدیدتر که از 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>
تصاویر و دوربین
بیصدا کردن صداها و لرزشهای اعلانها در حین ضبط فعال
از اندروید ۱۱ به بعد، هنگام استفاده فعال از دوربین، برنامه شما میتواند با استفاده از setCameraAudioRestriction() فقط لرزشها، صداها و لرزشها را بیصدا کند یا هیچکدام را قطع کند.
پشتیبانی گسترده از دوربین در شبیهساز اندروید
برای اطلاعات بیشتر در مورد پشتیبانی گستردهتر از دوربینها در شبیهساز که از اندروید ۱۱ شروع میشود، به پشتیبانی از دوربین مراجعه کنید.
پشتیبانی از استفاده همزمان بیش از یک دوربین
اندروید ۱۱ رابطهای برنامهنویسی کاربردی (API) را برای پشتیبانی از پرسوجو جهت استفاده همزمان از بیش از یک دوربین، شامل دوربین جلو و عقب، اضافه میکند.
برای بررسی پشتیبانی دستگاهی که برنامه شما روی آن اجرا میشود، از روشهای زیر استفاده کنید:
-
getConcurrentCameraIds()Setاز ترکیبات شناسههای دوربین را برمیگرداند که میتوانند همزمان با ترکیبات تضمینشدهی جریان، در صورت پیکربندی توسط همان فرآیند برنامه، جریان داشته باشند. -
isConcurrentSessionConfigurationSupported()بررسی میکند که آیا دستگاههای دوربین میتوانند به طور همزمان از پیکربندیهای جلسه مربوطه پشتیبانی کنند یا خیر.
پشتیبانی بهتر از تصاویر HEIF با فریمهای چندگانه
از اندروید ۱۱ به بعد، اگر تابع ImageDecoder.decodeDrawable() را فراخوانی کنید و یک تصویر HEIF حاوی دنباله ای از فریم ها (مانند یک انیمیشن یا یک عکس پشت سر هم) را به آن ارسال کنید، این متد یک AnimatedImageDrawable حاوی کل دنباله تصویر را برمیگرداند. در نسخههای قبلی اندروید، این متد یک BitmapDrawable فقط از یک فریم واحد را برمیگرداند.
اگر گرافیک HEIF شامل چندین فریم باشد که به ترتیب نیستند، میتوانید با فراخوانی MediaMetadataRetriever.getImageAtIndex() یک فریم واحد را بازیابی کنید.
دسترسیپذیری
بهروزرسانیها برای توسعهدهندگان خدمات دسترسیپذیری
اگر یک سرویس دسترسی سفارشی ایجاد کنید، میتوانید از ویژگیهای زیر در اندروید ۱۱ استفاده کنید:
- توضیح کاربرپسند یک سرویس دسترسیپذیری اکنون علاوه بر متن ساده، امکان استفاده از HTML و تصاویر را نیز فراهم میکند. این انعطافپذیری، توضیح به کاربران نهایی در مورد عملکرد سرویس شما و نحوه کمک به آنها را آسانتر میکند.
- برای کار با توصیفی از وضعیت یک عنصر رابط کاربری که از نظر معنایی معنادارتر از
contentDescriptionباشد، متدgetStateDescription()را فراخوانی کنید. - برای درخواست اینکه رویدادهای لمسی، کاوشگر لمسی سیستم را نادیده بگیرند، تابع
setTouchExplorationPassthroughRegion()را فراخوانی کنید. به طور مشابه، برای درخواست اینکه حرکات، آشکارساز حرکت سیستم را نادیده بگیرند، تابعsetGestureDetectionPassthroughRegion()فراخوانی کنید. - شما میتوانید درخواست اقدامات IME مانند «enter» و «next» و همچنین اسکرینشات از پنجرههایی که پرچم
FLAG_SECUREرا فعال نمیکنند، بدهید.
ویژگیهای اضافی
دلایل خروج از فرآیند برنامه
اندروید ۱۱ متد ActivityManager.getHistoricalProcessExitReasons() را معرفی میکند که دلایل هرگونه خاتمه اخیر فرآیند را گزارش میدهد. برنامهها میتوانند از این متد برای جمعآوری اطلاعات تشخیصی خرابی، مانند اینکه آیا خاتمه فرآیند به دلیل ANRها، مشکلات حافظه یا دلایل دیگر است، استفاده کنند. علاوه بر این، میتوانید از متد جدید setProcessStateSummary() برای ذخیره اطلاعات وضعیت سفارشی برای تجزیه و تحلیلهای بعدی استفاده کنید.
متد getHistoricalProcessExitReasons() نمونههایی از کلاس ApplicationExitInfo را برمیگرداند که شامل اطلاعات مربوط به مرگ یک فرآیند برنامه است. با فراخوانی getReason() روی یک نمونه از این کلاس، میتوانید تعیین کنید که چرا فرآیند برنامه شما از بین رفته است. به عنوان مثال، مقدار بازگشتی REASON_CRASH نشان میدهد که یک استثنای مدیریت نشده در برنامه شما رخ داده است. اگر برنامه شما نیاز به اطمینان از منحصر به فرد بودن رویدادهای خروج دارد، میتواند یک شناسه مخصوص برنامه، مانند یک مقدار هش بر اساس مهر زمانی از متد getTimestamp() را حفظ کند.
منابع اضافی
برای اطلاعات بیشتر، مقاله مربوط به ابزارهای جدید اندروید ۱۱ برای خصوصیتر و پایدارتر کردن برنامهها را در Medium بخوانید.
لودرهای منابع
اندروید ۱۱ یک API جدید معرفی میکند که به برنامهها اجازه میدهد تا به صورت پویا نحوه جستجو و بارگذاری منابع را گسترش دهند. کلاسهای API جدید ResourcesLoader و ResourcesProvider در درجه اول مسئول ارائه قابلیتهای جدید هستند. آنها در کنار هم، امکان تأمین منابع و داراییهای اضافی یا تغییر مقادیر منابع و داراییهای موجود را فراهم میکنند.
اشیاء ResourcesLoader کانتینرهایی هستند که اشیاء ResourcesProvider را به نمونه Resources یک برنامه ارائه میدهند. در عوض، اشیاء ResourcesProvider روشهایی را برای بارگذاری دادههای منبع از APKها و جداول منبع ارائه میدهند.
یکی از کاربردهای اصلی این API، بارگذاری سفارشی داراییها است. میتوانید از loadFromDirectory() برای ایجاد یک ResourcesProvider استفاده کنید که مسیر حل منابع و داراییهای مبتنی بر فایل را تغییر میدهد و باعث میشود که به جای جستجوی APK برنامه، یک دایرکتوری خاص را جستجو کند. میتوانید از طریق خانواده متدهای open() از کلاس API AssetManager ، درست مانند داراییهای موجود در APK، به این داراییها دسترسی پیدا کنید.
طرح امضای APK نسخه ۴
اندروید ۱۱ پشتیبانی از طرح امضای APK نسخه ۴ را اضافه میکند. این طرح نوع جدیدی از امضا را در یک فایل جداگانه ( apk-name .apk.idsig ) تولید میکند، اما در غیر این صورت مشابه نسخههای ۲ و ۳ است. هیچ تغییری در APK ایجاد نمیشود. این طرح از نصب تدریجی APK توسط ADB پشتیبانی میکند که نصب APK را سرعت میبخشد.
فیلترهای پویای هدف
برای دریافت intentها، یک برنامه باید در زمان کامپایل با تعریف یک فیلتر intent در مانیفست برنامه، نوع دادههایی را که قادر به دریافت آنهاست، اعلام کند. در اندروید ۱۰ و پایینتر، برنامهها هیچ راهی برای تغییر فیلترهای intent خود در زمان اجرا ندارند. این یک مشکل برای برنامههای مجازیسازی (مانند ماشینهای مجازی و دسکتاپهای از راه دور) است زیرا آنها هیچ راهی برای دانستن دقیق نرمافزاری که کاربر درون آنها نصب خواهد کرد، ندارند.
اندروید ۱۱ گروههای MIME را معرفی میکند، یک عنصر جدید در مانیفست که به یک برنامه اجازه میدهد مجموعهای پویا از انواع MIME را در یک فیلتر intent اعلام کند و آن را در زمان اجرا به صورت برنامهنویسی تغییر دهد. برای استفاده از یک گروه 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 استاتیک که به صراحت در مانیفست اعلام شده است، عمل میکند.
پیشرفتهای تکمیل خودکار
اندروید ۱۱ بهبودهایی را برای سرویسهای تکمیل خودکار ارائه میدهد.
شناسههای راهنما در AssistStructure.ViewNode
اغلب برای سرویسهای تکمیل خودکار مفید است که بر اساس ویژگیهای یک نما، یک هش امضا برای آن محاسبه کنند. راهنمای نما (view hint) یک ویژگی بسیار خوب برای گنجاندن در هنگام محاسبه هش امضا است، اما رشته راهنما ممکن است با تغییر زبان گوشی تغییر کند. برای حل این مشکل، اندروید ۱۱ AssistStructure.ViewNode با یک متد جدید getHintIdEntry() گسترش میدهد که شناسه منبع را برای متن راهنمای نما برمیگرداند. این متد یک مقدار مستقل از زبان ارائه میدهد که میتوانید از آن برای محاسبه هشهای امضا استفاده کنید.
مجموعه دادهها رویدادهای نشان داده شده
برای کمک به سرویسهای تکمیل خودکار در بهبود پیشنهاداتشان، اندروید ۱۱ روشی را برای شناسایی مواردی که یک سرویس تکمیل خودکار مجموعه دادهها را ارائه میدهد اما کاربر هیچ یک از آنها را انتخاب نمیکند، ارائه میدهد. در اندروید ۱۱، FillEventHistory نوع رویداد جدید TYPE_DATASETS_SHOWN را گزارش میدهد. FillEventHistory هر زمان که سرویس تکمیل خودکار یک یا چند مجموعه داده را به کاربر ارائه میدهد، رویدادی از این نوع را ثبت میکند. سرویسهای تکمیل خودکار میتوانند از این رویدادها همراه با رویداد TYPE_DATASET_SELECTED موجود استفاده کنند تا مشخص کنند که آیا کاربر هیچ یک از گزینههای تکمیل خودکار ارائه شده را انتخاب کرده است یا خیر.
ادغام IME
کیبوردها و سایر IMEها اکنون میتوانند پیشنهادهای تکمیل خودکار را به صورت درونخطی، در یک نوار پیشنهاد یا رابط مشابه، به جای یک منوی کشویی نمایش دهند. برای محافظت از اطلاعات حساس مانند رمزهای عبور و شماره کارتهای اعتباری، پیشنهادها برای کاربر نمایش داده میشوند اما تا زمانی که کاربر یکی را انتخاب نکند، برای IME شناخته شده نیستند. برای کسب اطلاعات در مورد چگونگی پشتیبانی IMEها و مدیران رمز عبور از این ویژگی، به ادغام تکمیل خودکار با کیبوردها مراجعه کنید.
اشتراکگذاری دادهها با سرویس ضبط محتوا
از اندروید ۱۱ به بعد، برنامه شما میتواند دادهها را با سرویس ضبط محتوای دستگاه به اشتراک بگذارد. این قابلیت، ارائه اطلاعات درونزمینهای، مانند نمایش نام آهنگی که در حال حاضر در محیط کاربر پخش میشود را برای دستگاه آسانتر میکند.
برای اینکه دادههای برنامهتان در دسترس سرویس ضبط محتوا قرار گیرد، متد shareData() را روی نمونهای از ContentCaptureManager فراخوانی کنید. اگر سیستم درخواست اشتراکگذاری دادهها را بپذیرد، برنامه شما یک توصیفگر فایل فقط نوشتنی برای اشتراکگذاری با سرویس ضبط محتوا دریافت میکند.