Android 3.1 APIs

سطح میانای برنامه‌سازی کاربردی: ۱۲

برای توسعه‌دهندگان، پلاتفرم Android 3.1 (HONEYCOMB_MR1) به‌عنوان مؤلفه‌ای بارگیری‌شدنی برای کیت توسعه نرم‌افزار Android دردسترس است. پلاتفرم بارگیری‌شدنی شامل کتابخانه Android و ایمیج سیستم، و همچنین مجموعه‌ای از پوسته‌های شبیه‌ساز و غیره است. پلاتفرم بارگیری‌شدنی شامل هیچ کتابخانه خارجی نیست.

برای توسعه‌دهندگان، پلاتفرم Android 3.1 به‌عنوان مؤلفه‌ای بارگیری‌شدنی برای کیت توسعه نرم‌افزار Android دردسترس است. پلاتفرم بارگیری‌شدنی شامل کتابخانه Android و ایمیج سیستم، و همچنین مجموعه‌ای از پوسته‌های شبیه‌ساز و غیره است. برای شروع توسعه یا آزمایش در Android 3.1، از «مدیر کیت توسعه نرم‌افزار Android» برای بارگیری پلاتفرم در کیت توسعه نرم‌افزارتان استفاده کنید.

نمای کلی میانای برنامه‌سازی کاربردی

بخش‌های زیر نمای کلی فنی از موارد جدید برای توسعه‌دهندگان در Android 3.1، ازجمله ویژگی‌های جدید و تغییرات در چارچوب میانای برنامه‌سازی کاربردی از نسخه قبلی، ارائه می‌دهد.

میاناهای برنامه‌سازی کاربردی USB

‫Android 3.1 میاناهای برنامه‌سازی کاربردی جدید و قدرتمندی را برای ادغام لوازم جانبی متصل با برنامه‌هایی که در پلاتفرم اجرا می‌شوند معرفی می‌کند. میاناهای برنامه‌سازی کاربردی براساس پشته و سرویس‌های USB (گذرگاه سریال عمومی) هستند که در پلاتفرم تعبیه شده‌اند، ازجمله پشتیبانی از تعاملات میزبان و دستگاه USB. بااستفاده از میاناهای برنامه‌سازی کاربردی، توسعه‌دهندگان می‌توانند برنامه‌هایی ایجاد کنند که قادر به شناسایی، برقراری ارتباط، و مدیریت انواع مختلف دستگاه‌های متصل‌شده ازطریق USB باشند.

پشته و میاناهای برنامه‌سازی کاربردی دو نوع اصلی سخت‌افزار USB را براساس اینکه دستگاه مجهز به Android به‌عنوان میزبان عمل می‌کند یا سخت‌افزار خارجی به‌عنوان میزبان عمل می‌کند، متمایز می‌کنند:

  • دستگاه USB قطعه‌ای از سخت‌افزار متصل است که برای عمل کردن به‌عنوان میزبان به دستگاه Android وابسته است. برای مثال، اکثر دستگاه‌های ورودی، موشواره‌ها، و دسته‌های بازی دستگاه‌های USB هستند، همان‌طور که بسیاری از دوربین‌ها، هاب‌ها، و غیره نیز چنین هستند.
  • لوازم جانبی USB قطعه‌ای از سخت‌افزار متصل است که کنترل‌کننده میزبان USB دارد، برق را تأمین می‌کند، و برای برقراری ارتباط با دستگاه‌های مجهز به Android ازطریق USB طراحی شده است. انواع مختلفی از لوازم جانبی می‌توانند به‌عنوان لوازم جانبی متصل شوند، از کنترل‌کننده‌های رباتیک گرفته تا تجهیزات موسیقی، دوچرخه‌های ورزشی، و غیره.

برای هر دو نوع — دستگاه‌های USB و لوازم جانبی USB — میاناهای برنامه‌سازی کاربردی USB پلاتفرم از کشف با همه‌فرستی هدف هنگام متصل شدن یا جدا شدن، و همچنین میاناهای استاندارد، نقاط پایانی، و حالت‌های انتقال (کنترل، انبوه، و وقفه) پشتیبانی می‌کنند.

میاناهای برنامه‌سازی کاربردی USB در بسته android.hardware.usb دردسترس است. کلاس مرکزی UsbManager است که روش‌های کمکی برای شناسایی و برقراری ارتباط با دستگاه‌های USB و وسایل جانبی USB ارائه می‌دهد. برنامه‌ها می‌توانند نمونه‌ای از UsbManager را دریافت کنند و سپس فهرست دستگاه‌ها یا لوازم جانبی متصل‌شده را جستجو کنند و سپس با آن‌ها ارتباط برقرار کنند یا آن‌ها را مدیریت کنند. UsbManager همچنین کنش‌های قصدی را که سیستم همه‌فرستی می‌کند اعلام می‌کند تا زمان متصل شدن یا جدا شدن دستگاه یا لوازم جانبی USB را اعلام کند.

کلاس‌های دیگر عبارت‌اند از:

  • UsbDevice، کلاسی که سخت‌افزار خارجی متصل‌شده به‌عنوان دستگاه USB را نشان می‌دهد (درحالی‌که دستگاه مجهز به Android به‌عنوان میزبان عمل می‌کند).
  • UsbAccessory، که نشان‌دهنده سخت‌افزار خارجی متصل‌شده به‌عنوان میزبان USB است (درحالی‌که دستگاه مجهز به Android به‌عنوان دستگاه USB عمل می‌کند).
  • UsbInterface و UsbEndpoint که دسترسی به میاناهای USB استاندارد و نقاط پایانی دستگاه را فراهم می‌کنند.
  • UsbDeviceConnection و UsbRequest، برای ارسال و دریافت داده‌ها و کنترل پیام‌ها به یا از دستگاه USB، به‌صورت هم‌زمان و غیرهم‌زمان.
  • ‫UsbConstants، که ثابت‌هایی را برای اعلام انواع نقطه پایانی، کلاس‌های دستگاه، و غیره ارائه می‌دهد.

توجه داشته باشید که اگرچه پشته USB در پلاتفرم تعبیه شده است، پشتیبانی واقعی از حالت‌های میزبان USB و لوازم جانبی باز در دستگاه‌های خاص توسط سازندگان آن‌ها تعیین می‌شود. به‌ویژه، حالت میزبان به سخت‌افزار کنترل‌کننده USB مناسب در دستگاه مجهز به Android متکی است.

علاوه‌براین، توسعه‌دهندگان می‌توانند درخواست فیلتر کردن در Google Play را بدهند، به‌طوری‌که برنامه‌هایشان برای کاربرانی که دستگاه‌هایشان پشتیبانی USB مناسبی ارائه نمی‌دهد، دردسترس نباشد. برای درخواست فیلتر کردن، یک یا هر دو عنصر زیر را به مانیفست برنامه اضافه کنید:

  • اگر برنامه فقط باید برای دستگاه‌هایی که از حالت میزبان USB (اتصال دستگاه‌های USB) پشتیبانی می‌کنند نمایان باشد، این عنصر را اعلام کنید:

    <uses-feature android:name="android.hardware.usb.host" android:required="true">

  • اگر برنامه فقط باید برای دستگاه‌هایی که از لوازم جانبی USB (اتصال میزبان‌های USB) پشتیبانی می‌کنند قابل‌مشاهده باشد، این عنصر را اعلام کنید:

    <uses-feature android:name="android.hardware.usb.accessory" android:required="true">

برای اطلاعات کامل درباره نحوه توسعه برنامه‌هایی که با لوازم جانبی USB تعامل دارند، لطفاً به مستندات توسعه‌دهنده مراجعه کنید.

برای مشاهده برنامه‌های نمونه‌ای که از USB host API استفاده می‌کنند، به ADB Test و Missile Launcher مراجعه کنید.

MTP/PTP API

Android 3.1 یک MTP API جدید را ارائه می‌دهد که به برنامه‌ها اجازه می‌دهد مستقیماً با دوربین‌های متصل و سایر دستگاه‌های PTP تعامل داشته باشند. میانای برنامه‌سازی کاربردی جدید باعث می‌شود برنامه به‌راحتی بتواند هنگام متصل شدن و جدا شدن دستگاه‌ها اعلان دریافت کند، فایل‌ها و فضای ذخیره‌سازی را در آن دستگاه‌ها مدیریت کند، و فایل‌ها و فراداده‌ها را به آن‌ها و از آن‌ها منتقل کند. MTP API زیرمجموعه PTP (پروتکل انتقال تصویر) از مشخصات MTP (پروتکل انتقال رسانه) را اجرا می‌کند.

میانای برنامه‌سازی کاربردی MTP در بسته android.mtp دردسترس است و این کلاس‌ها را ارائه می‌دهد:

  • ‫MtpDevice دستگاه MTP را که ازطریق گذرگاه میزبان USB متصل شده است کپسوله‌سازی می‌کند. برنامه می‌تواند شیئی از این نوع را نمونه‌سازی کند و سپس از روش‌های آن برای دریافت اطلاعات درباره دستگاه و اشیای ذخیره‌شده در آن، و همچنین باز کردن اتصال و انتقال داده‌ها استفاده کند. برخی‌از این روش‌ها عبارت‌اند از:
    • getObjectHandles() فهرستی از دسته‌های همه اشیاء موجود در دستگاه را که با قالب و والد مشخص‌شده مطابقت دارند برمی‌گرداند. برای دریافت اطلاعات درباره یک شیء، برنامه می‌تواند یک دسته را به getObjectInfo() منتقل کند.
    • importFile() به برنامه اجازه می‌دهد داده‌های شیء را در فایلی در فضای ذخیره‌سازی خارجی کپی کند. This call may block for an arbitrary amount of time depending on the size of the data and speed of the devices, so should be made from a spearate thread.
    • open() به برنامه اجازه می‌دهد دستگاه MTP/PTP متصل را باز کند.
    • getThumbnail() ریزعکس شیء را به‌صورت آرایه بایت برمی‌گرداند.
  • MtpStorageInfo اطلاعات مربوط به واحد ذخیره‌سازی در دستگاه MTP را نگه می‌دارد که با مجموعه داده StorageInfo شرح‌داده‌شده در بخش ۵.۲.۲ مشخصات MTP مطابقت دارد. روش‌های موجود در کلاس به برنامه اجازه می‌دهد رشته شرح واحد ذخیره‌سازی، فضای آزاد، حداکثر ظرفیت ذخیره‌سازی، شناسه ذخیره‌سازی، و شناسه جلد را دریافت کند.
  • MtpDeviceInfo اطلاعات مربوط به دستگاه MTP را که با مجموعه داده DeviceInfo شرح‌داده‌شده در بخش ۵.۱.۱ مشخصات MTP مطابقت دارد نگهداری می‌کند. روش‌های موجود در کلاس به برنامه‌ها اجازه می‌دهد سازنده، مدل، شماره سریال، و نسخه دستگاه را دریافت کنند.
  • MtpObjectInfo اطلاعات مربوط به شیء ذخیره‌شده در دستگاه MTP را نگه می‌دارد که با «مجموعه داده ObjectInfo» شرح‌داده‌شده در بخش ۵.۳.۱ مشخصات MTP مطابقت دارد. روش‌های موجود در کلاس به برنامه‌ها اجازه می‌دهد اندازه، قالب داده، نوع ارتباط، تاریخ ایجاد، و اطلاعات ریزعکس شیء را دریافت کنند.
  • MtpConstants ثابت‌هایی را برای اعلام کدهای قالب فایل MTP، نوع انجمن، و وضعیت محافظت ارائه می‌دهد.

پشتیبانی از دستگاه‌های ورودی جدید و رویدادهای حرکتی

‫Android 3.1 زیرسیستم ورودی را گسترش می‌دهد تا از دستگاه‌های ورودی جدید و انواع جدید رویدادهای حرکتی در همه نماها و پنجره‌ها پشتیبانی کند. توسعه‌دهندگان می‌توانند از این قابلیت‌ها برای تعامل کاربران با برنامه‌هایشان ازطریق موشواره، گوی پیمایش، دسته فرمان، دسته بازی، و دستگاه‌های دیگر، علاوه‌بر صفحه‌کلید و صفحه لمسی، استفاده کنند.

برای مدیریت ورودی موشواره، چرخ پیمایش، و گوی پیمایش، این پلاتفرم از دو کنش رویداد حرکتی جدید پشتیبانی می‌کند:

  • ‫ACTION_SCROLL، که مکان اشاره‌گر را که در آن حرکت پیمایش غیرلمسی، مانند چرخ پیمایش موشواره، انجام شده است توصیف می‌کند. در MotionEvent، مقدار محورهای AXIS_HSCROLL و AXIS_VSCROLL حرکت پیمایش نسبی را مشخص می‌کند.
  • ‫ACTION_HOVER_MOVE، موقعیت فعلی موشواره را وقتی دکمه‌ای فشار داده نشده است، و همچنین هر نقطه میانی از آخرین رویداد HOVER_MOVE را گزارش می‌کند. اعلان‌های ورود و خروج با نگه داشتن نشانگر هنوز پشتیبانی نمی‌شود.

برای پشتیبانی از دسته فرمان و دسته بازی، کلاس InputDevice شامل این منابع دستگاه ورودی جدید است:

برای توصیف رویدادهای حرکتی از این منابع جدید، و همچنین رویدادهای مربوط به موشواره‌ها و گوی‌های پیمایش، پلاتفرم اکنون کدهای محور را در MotionEvent تعریف می‌کند، مشابه نحوه تعریف کدهای کلید در KeyEvent. کدهای محور جدید برای دسته فرمان و کنترل‌کننده‌های بازی شامل AXIS_HAT_X،‏ AXIS_HAT_Y،‏ AXIS_RTRIGGER،‏ AXIS_ORIENTATION،‏ AXIS_THROTTLE، و موارد بسیار دیگری است. محورهای MotionEvent موجود با AXIS_X، AXIS_Y، AXIS_PRESSURE، AXIS_SIZE، AXIS_TOUCH_MAJOR، AXIS_TOUCH_MINOR، AXIS_TOOL_MAJOR، AXIS_TOOL_MINOR، و AXIS_ORIENTATION نشان داده می‌شوند.

علاوه‌براین، MotionEvent تعدادی کد محور عمومی را تعریف می‌کند که وقتی چارچوب نمی‌داند چگونه یک محور خاص را نگاشت کند، استفاده می‌شوند. دستگاه‌های خاص می‌توانند از کدهای محور عمومی برای ارسال داده‌های حرکتی سفارشی به برنامه‌ها استفاده کنند. برای مشاهده فهرست کامل محورها و تفسیرهای موردنظر آن‌ها، به سند کلاس MotionEvent مراجعه کنید.

این پلاتفرم رویدادهای حرکتی را به‌صورت دسته‌ای به برنامه‌ها ارائه می‌دهد، بنابراین یک رویداد واحد ممکن است شامل موقعیت فعلی و چندین حرکت تاریخی باشد. برنامه‌ها باید از getHistorySize() برای دریافت تعداد نمونه‌های سابقه استفاده کنند، سپس همه نمونه‌های سابقه را بااستفاده از getHistoricalAxisValue() بازیابی و پردازش کنند. پس‌از آن، برنامه‌ها باید نمونه فعلی را بااستفاده از getAxisValue() پردازش کنند.

برخی‌از محورها را می‌توان بااستفاده از روش‌های دستیاب ویژه بازیابی کرد. برای مثال، به‌جای فراخوانی getAxisValue()، برنامه‌ها می‌توانند getX() را فراخوانی کنند. محورهایی که دسترسی‌دهنده داخلی دارند شامل AXIS_X، AXIS_Y، AXIS_PRESSURE، AXIS_SIZE، AXIS_TOUCH_MAJOR، AXIS_TOUCH_MINOR، AXIS_TOOL_MAJOR، AXIS_TOOL_MINOR، و AXIS_ORIENTATION می‌شود.

هر دستگاه ورودی دارای یک شناسه منحصربه‌فرد اختصاص‌داده‌شده توسط سیستم است و ممکن است چندین منبع را نیز ارائه دهد. وقتی دستگاهی چندین منبع ارائه می‌دهد، بیش‌از یک منبع می‌تواند داده‌های محور را بااستفاده از همان محور ارائه دهد. برای مثال، رویداد لمسی که از منبع لمسی می‌آید از محور X برای داده‌های موقعیت صفحه‌نمایش استفاده می‌کند، درحالی‌که رویداد دسته بازی که از منبع دسته بازی می‌آید از محور X برای موقعیت دسته استفاده می‌کند. به همین دلیل، مهم است که برنامه‌ها مقادیر محور را براساس منبعی که از آن منشأ می‌گیرند تفسیر کنند. هنگام رسیدگی به رویداد حرکتی، برنامه‌ها باید از روش‌های موجود در کلاس InputDevice برای تعیین محورهای پشتیبانی‌شده توسط دستگاه یا منبع استفاده کنند. به‌طور خاص، برنامه‌ها می‌توانند از getMotionRanges() برای پرسمان کردن همه محورهای دستگاه یا همه محورهای منبع دستگاه استفاده کنند. در هر دو مورد، اطلاعات محدوده برای محورهای برگردانده‌شده در شیء InputDevice.MotionRange منبع را برای هر مقدار محور مشخص می‌کند.

درنهایت، ازآنجایی‌که رویدادهای حرکتی از دسته فرمان، دسته بازی، موشواره، و گوی پیمایش رویدادهای لمسی نیستند، پلاتفرم روش فراخوانی جدیدی برای ارسال آن‌ها به View به‌عنوان رویدادهای حرکتی «عمومی» اضافه می‌کند. به‌طور خاص، رویدادهای حرکتی غیرلمسی را ازطریق تماس با onGenericMotionEvent() به View گزارش می‌دهد، نه به onTouchEvent().

پلاتفرم رویدادهای حرکتی عمومی را به‌طور متفاوتی ارسال می‌کند، بسته به کلاس منبع رویداد. رویدادهای SOURCE_CLASS_POINTER به View زیر اشاره‌گر می‌روند، مشابه نحوه عملکرد رویدادهای لمسی. همه موارد دیگر به View که درحال‌حاضر روی آن تمرکز شده است می‌روند. برای مثال، این یعنی View باید کانونی شود تا بتواند رویدادهای دسته بازی را دریافت کند. درصورت نیاز، برنامه‌ها می‌توانند این رویدادها را در سطح «فعالیت» یا «کادر گفتگو» با پیاده‌سازی onGenericMotionEvent() در آنجا مدیریت کنند.

برای مشاهده نمونه برنامه‌ای که از رویدادهای حرکتی دسته فرمان استفاده می‌کند، GameControllerInput و GameView را ببینید.

RTP API

Android 3.1 یک API را برای پشته RTP (پروتکل انتقال هم‌زمان) داخلی خود ارائه می‌دهد که برنامه‌ها می‌توانند از آن برای مدیریت جاری‌سازی داده‌های تعاملی یا درخواستی استفاده کنند. به‌ویژه، برنامه‌هایی که VOIP، مکالمه با فشردن دکمه، کنفرانس، و جاری‌سازی صوتی ارائه می‌دهند می‌توانند از این API برای شروع جلسات و انتقال یا دریافت جاری‌سازی‌های داده ازطریق هر شبکه دردسترسی استفاده کنند.

میانای برنامه‌سازی کاربردی RTP در بسته android.net.rtp دردسترس است. کلاس‌ها شامل:

  • RtpStream، کلاس پایه جاری‌سازی‌هایی که بسته‌های شبکه را با محموله‌های رسانه‌ای ازطریق RTP ارسال و دریافت می‌کنند.
  • ‫AudioStream، زیرکلاسی از RtpStream که محموله‌های صوتی را ازطریق RTP منتقل می‌کند.
  • ‫AudioGroup، یک مرکز صوتی محلی برای مدیریت و ترکیب بلندگو، میکروفون، و AudioStream دستگاه.
  • AudioCodec، که مجموعه‌ای از کدک‌ها را که برای AudioStream تعریف می‌کنید دربرمی‌گیرد.

برای پشتیبانی از کنفرانس صوتی و کاربردهای مشابه، برنامه دو کلاس را به‌عنوان نقاط پایانی برای جاری‌سازی نمونه‌سازی می‌کند:

  • AudioStream نقطه پایانی ازراه‌دور را مشخص می‌کند و شامل نگاشت شبکه و AudioCodec پیکربندی‌شده است.
  • AudioGroup نشان‌دهنده نقطه پایانی محلی برای یک یا چند AudioStream است. AudioGroup همه AudioStreamها را ترکیب می‌کند و به‌طور اختیاری با بلندگو و میکروفون دستگاه به‌طور هم‌زمان تعامل برقرار می‌کند.

ساده‌ترین کاربرد شامل یک نقطه پایانی راه دور و یک نقطه پایانی محلی است. برای استفاده‌های پیچیده‌تر، لطفاً به محدودیت‌های شرح‌داده‌شده برای AudioGroup مراجعه کنید.

برای استفاده از RTP API، برنامه‌ها باید با اعلام <uses-permission android:name="android.permission.INTERNET"> در فایل‌های مانیفست خود، از کاربر درخواست اجازه کنند. برای به‌دست آوردن میکروفون دستگاه، اجازه <uses-permission android:name="android.permission.RECORD_AUDIO"> نیز لازم است.

ابزاره‌های برنامه با قابلیت تغییر اندازه

از Android 3.1، توسعه‌دهندگان می‌توانند ابزارک‌های صفحه اصلی خود را قابل‌تغییر اندازه کنند — به‌صورت افقی، عمودی، یا در هر دو محور. کاربران ابزاره را لمس می‌کنند و نگه می‌دارند تا دستگیره‌های تغییر اندازه آن نشان داده شود، سپس دستگیره‌های افقی و/یا عمودی را می‌کشند تا اندازه را در شبکه چیدمان تغییر دهند.

توسعه‌دهندگان می‌توانند با تعریف کردن مشخصه resizeMode در فراداده AppWidgetProviderInfo ابزاره، هر ابزاره‌ای را در «صفحه اصلی» قابل‌تغییر اندازه کنند. مقادیر برای مشخصه resizeMode شامل «افقی»، «عمودی»، و «هیچ‌کدام» است. برای اعلام ابزاره به‌عنوان قابل‌تغییر اندازه به‌صورت افقی و عمودی، مقدار «horizontal|vertical» را ارائه دهید.

مثالی در اینجا ارائه شده است:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure"
    android:resizeMode="horizontal|vertical" >
</appwidget-provider>

برای اطلاعات بیشتر درباره ابزاره‌های صفحه اصلی، به سند ابزاره‌های برنامه مراجعه کنید.

چارچوب پویانمایی

  • کلاس ViewPropertyAnimator جدید
    • کلاس جدید ViewPropertyAnimator روشی راحت برای توسعه‌دهندگان فراهم می‌کند تا ویژگی‌های انتخابی را در اشیاء View پویانمایی کنند. کلاس پویانمایی ویژگی‌ها را خودکار و بهینه‌سازی می‌کند و مدیریت چندین پویانمایی هم‌زمان را در شیء View آسان‌تر می‌کند.

      استفاده از ViewPropertyAnimator ساده است. برای پویانمایی کردن ویژگی‌های View، animate() را فراخوانی کنید تا شیء ViewPropertyAnimator برای آن View ساخته شود. از روش‌های ViewPropertyAnimator برای مشخص کردن اینکه کدام ویژگی پویانمایی شود و چگونه پویانمایی شود استفاده کنید. برای مثال، برای محو کردن View به شفاف، alpha(0); را فراخوانی کنید. شیء ViewPropertyAnimator جزئیات پیکربندی کلاس Animator زیربنایی و شروع آن را مدیریت می‌کند، سپس پویانمایی را ارائه می‌دهد.

  • رنگ پس‌زمینه پویانمایی
    • روش‌های جدید getBackgroundColor() و setBackgroundColor(int) به شما امکان می‌دهند رنگ پس‌زمینه را در پشت پویانمایی‌ها، فقط برای پویانمایی‌های پنجره، دریافت/تنظیم کنید. درحال‌حاضر پس‌زمینه باید سیاه باشد، با هر سطح آلفای دلخواه.
  • دریافت کسر پویانمایی‌شده از ViewAnimator
    • روش جدید getAnimatedFraction() به شما امکان می‌دهد کسر پویانمایی فعلی (کسر سپری‌شده/درون‌یابی‌شده استفاده‌شده در جدیدترین به‌روزرسانی فریم) را از ValueAnimator دریافت کنید.

چارچوب میانای کاربر

  • پرداز زدن اجباری لایه
    • روش جدید buildLayer() به برنامه اجازه می‌دهد ایجاد لایه «نما» را اجباری کند و «نما» فوراً در آن ارائه شود. برای مثال، یک برنامه می‌تواند از این روش برای رندر کردن یک View در لایه خود قبل‌از شروع یک پویانمایی استفاده کند. اگر «نما» پیچیده باشد، رندر کردن آن در لایه قبل‌از شروع پویانمایی از رد شدن فریم‌ها جلوگیری می‌کند.
  • فاصله دوربین
    • برنامه‌ها می‌توانند از روش جدید setCameraDistance(float) برای تنظیم فاصله از دوربین تا «نما» استفاده کنند. این کار به برنامه‌ها کنترل بهبودیافته‌ای بر تبدیل‌های سه‌بعدی «نما»، مانند چرخش‌ها، می‌دهد.
  • دریافت نمای تقویم از DatePicker
  • دریافت تماس‌های برگشتی هنگام جدا شدن نماها
  • Fragment breadcrumb listener, new onInflate() signature
  • نمایش نتیجه جستجو در برگه جدید
    • کلید داده EXTRA_NEW_SEARCH برای هدف‌های ACTION_WEB_SEARCH به شما امکان می‌دهد جستجو را در برگه مرورگر جدیدی باز کنید، نه در برگه موجود.
  • مکان‌نمای نوشتار قابل‌رسم
    • اکنون می‌توانید بااستفاده از مشخصه منبع جدید textCursorDrawable، یک drawable را برای استفاده به‌عنوان مکان‌نمای نوشتار مشخص کنید.
  • تنظیم فرزند نمایش‌داده‌شده در نماهای ازراه‌دور
  • کلیدهای عمومی برای دسته‌های بازی و دیگر دستگاه‌های ورودی
    • KeyEvent طیفی از کدهای کلید عمومی را برای تطبیق دکمه‌های دسته بازی اضافه می‌کند. این کلاس همچنین isGamepadButton(int) و چندین روش کمکی دیگر برای کار با کدهای کلید اضافه می‌کند.

گرافیک‌

  • کمک‌کننده‌ها برای مدیریت نقشه‌های بیتی
    • setHasAlpha(boolean) به برنامه اجازه می‌دهد نشان دهد که همه پیکسل‌های Bitmap مات (false) هستند یا اینکه برخی‌از پیکسل‌ها ممکن است حاوی مقادیر آلفای غیرمات (true) باشند. توجه: برای برخی پیکربندی‌ها (مثل RGB_565) این فراخوانی نادیده گرفته می‌شود، چون از مقادیر آلفا برای هر پیکسل پشتیبانی نمی‌کند. این به‌عنوان راهنمایی برای ترسیم درنظر گرفته شده است، زیرا در برخی موارد، نقش بیتی که مشخص است مات است می‌تواند سریع‌تر از نقش بیتی که ممکن است مقادیر آلفای غیرمات در هر پیکسل داشته باشد ترسیم شود.
    • ‫getByteCount() اندازه Bitmap را به بایت دریافت می‌کند.
    • getGenerationId() به برنامه اجازه می‌دهد متوجه شود که آیا Bitmap اصلاح شده است یا نه، مثلاً برای ذخیره در حافظه نهان.
    • sameAs(android.graphics.Bitmap) تعیین می‌کند که آیا Bitmap داده‌شده ازنظر ابعاد، پیکربندی، یا داده‌های پیکسل با Bitmap فعلی تفاوت دارد یا نه.
  • تنظیم کردن مکان و چرخش دوربین
    • Camera دو روش جدید rotate() و setLocation() را برای کنترل مکان دوربین، برای تبدیل‌های سه‌بعدی اضافه می‌کند.

شبکه

  • قفل Wi-Fi با عملکرد بالا
    • قفل Wi-Fi جدید با عملکرد بالا به برنامه‌ها اجازه می‌دهد اتصال‌های Wi-Fi با عملکرد بالا را حتی وقتی صفحه‌نمایش دستگاه خاموش است حفظ کنند. برنامه‌هایی که موسیقی، ویدیو، یا صدا را برای مدت طولانی جاری‌سازی می‌کنند می‌توانند قفل Wi-Fi با عملکرد بالا را دریافت کنند تا از عملکرد جاری‌سازی حتی وقتی صفحه‌نمایش خاموش است مطمئن شوند. ازآنجایی‌که این ویژگی از شارژ بیشتری استفاده می‌کند، برنامه‌ها باید Wi-Fi با عملکرد بالا را زمانی دریافت کنند که به اتصال فعال طولانی‌مدت نیاز است.

      برای ایجاد قفل با عملکرد بالا، WIFI_MODE_FULL_HIGH_PERF را به‌عنوان حالت قفل در تماس با createWifiLock() ارسال کنید.

  • آمار ترافیک بیشتر
    • اکنون برنامه‌ها می‌توانند بااستفاده از روش‌های جدید در TrafficStats به آمار مربوط به انواع بیشتری از استفاده از شبکه دسترسی داشته باشند. برنامه‌ها می‌توانند از روش‌ها برای دریافت آمار UDP، تعداد بسته‌ها، بایت‌های محموله ارسال/دریافت TCP، و بخش‌ها برای UID داده‌شده استفاده کنند.
  • نام کاربری اصالت‌سنجی SIP
    • برنامه‌ها اکنون می‌توانند نام کاربری SIP auth را برای نمایه دریافت و تنظیم کنند بااستفاده از روش‌های جدید getAuthUserName() و setAuthUserName().

Download Manager

  • مدیریت بارگیری‌های تکمیل‌شده
    • اکنون برنامه‌ها می‌توانند بارگیری‌هایی را شروع کنند که فقط پس‌از تکمیل به کاربران اطلاع می‌دهند. برای شروع این نوع بارگیری، برنامه‌ها VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION را در روش setNotificationVisibility() شیء درخواست ارسال می‌کنند.
    • روش جدیدی به‌نام addCompletedDownload() به برنامه اجازه می‌دهد فایلی را به پایگاه داده بارگیری‌ها اضافه کند تا برنامه «بارگیری‌ها» بتواند آن را مدیریت کند.
  • نمایش بارگیری‌ها براساس اندازه
    • برنامه‌ها می‌توانند برنامه «بارگیری‌ها» را در حالت مرتب‌سازی براساس اندازه با افزودن INTENT_EXTRAS_SORT_BY_SIZE اضافی جدید به هدف ACTION_VIEW_DOWNLOADS شروع کنند.

چارچوب IME

  • دریافت کلید مقدار اضافی روش ورودی
    • ‫InputMethodSubtype روش containsExtraValueKey() را اضافه می‌کند تا بررسی کند آیا رشته ExtraValue برای زیرنوع ذخیره شده است یا نه، و روش getExtraValueOf() را اضافه می‌کند تا مقدار کلید خاصی را از نقشه درهم‌سازی ExtraValue استخراج کند.

رسانه

  • قالب‌های جدید جاری‌سازی صوتی
    • چارچوب رسانه پشتیبانی داخلی را برای محتوای خام ADTS AAC، برای بهبود صدای جاری‌سازی، و همچنین پشتیبانی از صدای FLAC، برای محتوای صوتی فشرده با بالاترین کیفیت (بدون اتلاف) اضافه می‌کند. برای اطلاعات بیشتر، سند قالب‌های رسانه پشتیبانی‌شده را ببینید.

کنترل‌های راه‌اندازی در برنامه‌های متوقف‌شده

از Android 3.1 به بعد، مدیر بسته سیستم برنامه‌هایی را که در وضعیت متوقف‌شده هستند ردیابی می‌کند و ابزاری برای کنترل راه‌اندازی آن‌ها از فرایندهای پس‌زمینه و برنامه‌های دیگر ارائه می‌دهد.

توجه داشته باشید که حالت توقف برنامه با حالت توقف «فعالیت» یکسان نیست. سیستم این دو حالت توقف را به‌طور جداگانه مدیریت می‌کند.

این پلاتفرم دو پرچم قصد جدید را تعریف می‌کند که به فرستنده اجازه می‌دهد مشخص کند آیا «قصد» باید اجازه داشته باشد مؤلفه‌ها را در برنامه متوقف‌شده فعال کند یا نه.

  • FLAG_INCLUDE_STOPPED_PACKAGES — فیلترهای قصد برنامه‌های متوقف‌شده را در فهرست اهداف احتمالی برای حل‌وفصل کردن قرار دهید.
  • FLAG_EXCLUDE_STOPPED_PACKAGES — فیلترهای قصد برنامه‌های متوقف‌شده را از فهرست اهداف بالقوه مستثنی کنید.

وقتی هیچ‌کدام یا هر دو این پرچم‌ها در یک هدف تعریف شده باشند، رفتار پیش‌فرض این است که فیلترهای برنامه‌های متوقف‌شده در فهرست اهداف بالقوه گنجانده شوند.

توجه داشته باشید که سیستم FLAG_EXCLUDE_STOPPED_PACKAGES را به همه هدف‌های همه‌فرستی اضافه می‌کند. این کار برای جلوگیری از راه‌اندازی ناخواسته یا غیرضروری مؤلفه‌های برنامه‌های متوقف‌شده توسط همه‌فرستی‌های سرویس‌های پس‌زمینه انجام می‌شود. سرویس یا برنامه پس‌زمینه‌ای می‌تواند با افزودن پرچم FLAG_INCLUDE_STOPPED_PACKAGES به هدف‌های همه‌فرستی که باید اجازه فعال کردن برنامه‌های متوقف‌شده را داشته باشند، این رفتار را لغو کند.

برنامه‌ها وقتی برای اولین‌بار نصب می‌شوند اما هنوز راه‌اندازی نشده‌اند و وقتی به‌صورت دستی توسط کاربر متوقف می‌شوند (در «مدیریت برنامه‌ها») در وضعیت متوقف‌شده قرار می‌گیرند.

اعلان درباره اولین راه‌اندازی و ارتقای برنامه

این پلاتفرم اعلان بهبودیافته‌ای برای اولین راه‌اندازی برنامه و ارتقاها ازطریق دو کنش هدف جدید اضافه می‌کند:

  • ACTION_PACKAGE_FIRST_LAUNCH — به بسته نصب‌کننده برنامه ارسال می‌شود وقتی آن برنامه برای اولین‌بار راه‌اندازی می‌شود (یعنی اولین‌باری که از حالت متوقف‌شده خارج می‌شود). داده‌ها حاوی نام بسته است.
  • ‫ACTION_MY_PACKAGE_REPLACED — به برنامه اطلاع می‌دهد که به‌روز شده است و نسخه جدیدی روی نسخه موجود نصب شده است. این فقط به برنامه‌ای ارسال می‌شود که جایگزین شده است. این فایل حاوی هیچ داده اضافه‌ای نیست. برای دریافت آن، فیلتر قصدی برای این کنش اعلام کنید. می‌توانید از این هدف برای راه‌اندازی کدی استفاده کنید که به بازگرداندن برنامه‌تان به وضعیت اجرایی مناسب پس‌از ارتقا کمک می‌کند.

    این هدف مستقیماً به برنامه ارسال می‌شود، اما فقط درصورتی‌که برنامه درحالی‌که در وضعیت شروع‌شده بود (نه در وضعیت متوقف‌شده) ارتقا یافته باشد.

برنامه‌های کمکی اصلی

  • حافظه نهان LRU
    • کلاس جدید LruCache به برنامه‌هایتان امکان می‌دهد از حافظه نهان کارآمد بهره‌مند شوند. برنامه‌ها می‌توانند از این کلاس برای کاهش زمان صرف‌شده برای محاسبه یا بارگیری داده‌ها از شبکه استفاده کنند، درحالی‌که ردپای حافظه معقولی برای داده‌های ذخیره‌شده در حافظه نهان حفظ می‌شود.LruCache حافظه نهانی است که ارجاع‌های قوی به تعداد محدودی از مقادیر را نگه می‌دارد. هر بار که به مقداری دسترسی پیدا می‌شود، آن مقدار به ابتدای صف منتقل می‌شود. وقتی مقداری به حافظه نهان کامل اضافه می‌شود، مقدار انتهای آن صف حذف می‌شود و ممکن است برای جمع‌آوری زباله واجدشرایط شود.
  • توصیف‌گر فایل به‌عنوان int
    • اکنون می‌توانید عدد صحیح توصیف‌گر فایل بومی را برای ParcelFileDescriptor بااستفاده از یکی از روش‌های جدید getFd() یا detachFd() دریافت کنید.

WebKit

  • کوکی‌های طرح فایل
    • CookieManager اکنون از کوکی‌هایی که از طرح‌واره URI file: استفاده می‌کنند پشتیبانی می‌کند. می‌توانید از setAcceptFileSchemeCookies() برای فعال/غیرفعال کردن پشتیبانی از کوکی‌های طرح فایل، قبل‌از ساختن نمونه‌ای از WebView یا CookieManager استفاده کنید. در نمونه CookieManager، می‌توانید با فراخوانی allowFileSchemeCookies() بررسی کنید که آیا کوکی‌های طرح فایل فعال است یا نه.
  • اعلان درخواست ورود به سیستم
    • برای پشتیبانی از ویژگی‌های ورود خودکار مرورگر که در Android 3.0 معرفی شده است، روش جدید onReceivedLoginRequest() به برنامه میزبان اطلاع می‌دهد که درخواست ورود خودکار برای کاربر پردازش شده است.
  • کلاس‌ها و میاناهای برداشته‌شده

مرورگر

برنامه «مرورگر» ویژگی‌های زیر را برای پشتیبانی از برنامه‌های وب اضافه می‌کند:

  • پشتیبانی از بازپخش ردیفی ویدیو جاسازی‌شده در برچسب HTML5 <video>. درصورت امکان، بازپخش با شتاب سخت‌افزاری انجام می‌شود.
  • پشتیبانی لایه برای عناصر بی‌حرکت برای همه سایت‌ها (تلفن همراه و رایانه).

ثابت‌های ویژگی جدید

این پلتفرم ثابت‌های ویژگی سخت‌افزاری جدیدی را اضافه می‌کند که توسعه‌دهندگان می‌توانند در مانیفست‌های برنامه خود اعلام کنند تا به نهادهای خارجی مانند Google Play اطلاع دهند که برنامه به قابلیت‌های سخت‌افزاری جدیدی که در این نسخه از پلتفرم پشتیبانی می‌شود نیاز دارد. توسعه‌دهندگان این ثابت‌های ویژگی و ثابت‌های ویژگی دیگر را در عناصر مانیفست <uses-feature> اعلام می‌کنند.

  • android.hardware.usb.accessory — این برنامه از USB API برای برقراری ارتباط با دستگاه‌های سخت‌افزاری خارجی متصل‌شده ازطریق USB و عملکرد به‌عنوان میزبان استفاده می‌کند.
  • android.hardware.usb.host — این برنامه از میانای برنامه‌سازی کاربردی USB برای برقراری ارتباط با دستگاه‌های سخت‌افزاری خارجی متصل‌شده ازطریق USB و عملکرد به‌عنوان دستگاه استفاده می‌کند.

Google Play برنامه‌ها را براساس ویژگی‌های اعلام‌شده در عناصر مانیفست <uses-feature> فیلتر می‌کند. برای اطلاعات بیشتر درباره اعلام ویژگی‌ها در مانیفست برنامه، فیلترهای Google Play را بخوانید.

گزارش تفاوت‌های API

برای مشاهده جزئیات همه تغییرات API در Android 3.1 (API سطح ۱۲)، به گزارش تفاوت‌های API مراجعه کنید.

سطح ای‌پی‌آی

پلاتفرم Android 3.1 نسخه به‌روزشده‌ای از میانای برنامه‌سازی کاربردی چارچوب را ارائه می‌دهد. به میانای برنامه‌سازی کاربردی Android 3.1 یک شناسه عدد صحیح — ۱۲ — اختصاص داده شده است که در خود سیستم ذخیره می‌شود. این شناسه که «سطح API» نامیده می‌شود، به سیستم امکان می‌دهد قبل‌از نصب برنامه، به‌درستی تشخیص دهد که آیا برنامه با سیستم سازگار است یا نه.

برای استفاده از میاناهای برنامه‌سازی کاربردی معرفی‌شده در Android 3.1 در برنامه‌تان، باید برنامه را درمقابل کتابخانه Android که در پلاتفرم کیت توسعه نرم‌افزار Android 3.1 ارائه شده است کامپایل کنید. بسته به نیازهایتان، ممکن است لازم باشد مشخصه android:minSdkVersion="12" را نیز به عنصر <uses-sdk> در مانیفست برنامه اضافه کنید.

برای اطلاعات بیشتر، سطح API چیست؟ را بخوانید.