مثل الإصدارات السابقة، يتضمّن Android 17 تغييرات في السلوك قد تؤثر في تطبيقك. تنطبق التغييرات التالية في السلوك حصريًا على التطبيقات التي تستهدف Android 17 أو الإصدارات الأحدث. إذا كان تطبيقك يستهدف Android 17 أو إصدارًا أحدث، عليك تعديله ليتوافق مع هذه السلوكيات، حيثما ينطبق ذلك.
يُرجى أيضًا مراجعة قائمة التغييرات في السلوك التي تؤثر في جميع التطبيقات التي تعمل على Android 17 بغض النظر عن targetSdkVersion لتطبيقك.
تجربة المستخدم وواجهة مستخدم النظام
يتضمّن Android 17 التغييرات التالية التي تهدف إلى إنشاء تجربة مستخدم أكثر اتساقًا وسهولة.
التطبيق المصغّر لحدّ الذاكرة
بدءًا من الإصدار Android 17، يفرض النظام حدًا صارمًا على الذاكرة المستخدَمة في تحديثات RemoteViews للتطبيقات التي تستهدف الإصدار Android 17 (المستوى 37 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث. عندما يمرّر تطبيق عنصر RemoteViews إلى
AppWidgetManager.updateAppWidget،
تحسب system_server إجمالي استهلاك الذاكرة لجميع بيانات الصور في
كل اتجاه وفئة حجم في الحمولة. إذا تجاوز إجمالي الذاكرة الحد الأقصى المسموح به في النظام (mMaxWidgetBitmapMemory)، يرفض النظام التحديث ويعرض الخطأ IllegalArgumentException:
java.lang.IllegalArgumentException: RemoteViews for widget update exceeds maximum bitmap memory usage (used: XXXXX, max: YYYYY)
بالنسبة إلى التطبيقات التي تستهدف المستوى 36 أو أقل من واجهة برمجة التطبيقات، يسجّل النظام انتهاك الذاكرة هذا
كتحذير (Slog.w) بدون طرح استثناء.
مهارات Android
العرض على GitHubإدارة تحديثات AppWidget وذاكرة الصور النقطية
android skills add glance-appwidget-updates-and-memoryكيفية احتساب النظام للحدّ الأقصى للذاكرة
يضبط النظام ميزانية ذاكرة الصور النقطية للأداة على 6 * width * height بايت
(1.5 * 4 * width * height، أي ما يعادل 1.5 مرة حجم مخزن مؤقت ARGB_8888 بملء الشاشة) لإعدادات العرض النشطة. في المستوى 37 من واجهة برمجة التطبيقات والإصدارات الأحدث، يتضمّن هذا الاحتساب ما يلي:
- كائنات
Bitmapفي الذاكرة وIconالمستندة إلى الصور النقطية (Icon.TYPE_BITMAPوIcon.TYPE_ADAPTIVE_BITMAP) المخزَّنة فيRemoteViews.mBitmapCache(مثل طلباتsetImageViewBitmapأوIcon.createWithBitmapأوIcon.createWithAdaptiveBitmapأو Jetpack GlanceImageProvider(bitmap)). يتم احتساب كل مثيل فريد منBitmapأوIconالمستند إلى الصور النقطية فيmBitmapCacheمرة واحدة لكل تسلسل هرمي فيRemoteViews. - لا يتم احتساب الصور المستندة إلى معرّف الموارد المنتظم (URI) (
Icon.createWithContentUriأوsetImageViewUriأو GlanceImageProvider(uri)) ضمن الحد الأقصى لعدد وحدات البايت في الاتصال بين العمليات (IPC) والبالغRemoteViewsفيsystem_server، ولكن عملية مضيف التطبيق المصغّر تفك ترميز ملفcontent://المُشار إليه بدقة كاملة في الذاكرة الديناميكية الخاصة به. يُفضَّل تمريرBitmapتم تقليل معدل عيّناته مباشرةً في الذاكرة (androidx.glance.ImageProvider(bitmap)أوsetImageViewBitmap)، لأنّ منح أذونات معرّف الموارد المنتظم (URI) لـFileProviderيتعذّر عند وضع تطبيق مصغّر لملف العمل على شاشة رئيسية شخصية. إذا كان يجب أن يستخدم تطبيقك المصغّر معرّف موارد منتظم (URI) من النوعFileProvider، يجب دائمًا كتابة صورة بدقة منخفضة فيcontext.cacheDirأولاً.
خطوات الحدّ من التأثير
للحفاظ على تحديثات التطبيقات المصغّرة ضمن الحد الأقصى للذاكرة على الهواتف والأجهزة اللوحية والأجهزة القابلة للطي، اتّبِع الخطوات التالية:
احتساب ميزانية الذاكرة لوقت التشغيل من
WindowMetrics: في مستوى واجهة برمجة التطبيقات 30 والإصدارات الأحدث، يمكنك قراءة حدود النافذة النشطة منWindowManager.currentWindowMetrics.boundsبدلاً منresources.displayMetrics. على الأجهزة المتعددة الدقة والأجهزة القابلة للطي، قد يعرض "displayMetrics" أبعاد الشاشة غير النشطة. قدِّر إجمالي ميزانية صور التطبيقات المصغّرة بمبلغ6L * bounds.width() * bounds.height()كما هو موضّح في المثال التالي:private const val FALLBACK_MAX_BYTES = 15_000_000L fun calculateWidgetMemoryCapBytes(context: Context): Long { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val wm = context.getSystemService(WindowManager::class.java) ?: return FALLBACK_MAX_BYTES val bounds = wm.currentWindowMetrics.bounds return 6L * bounds.width().toLong() * bounds.height().toLong() } val dm = context.resources.displayMetrics return 6L * dm.widthPixels.toLong() * dm.heightPixels.toLong() }يجب تقليل دقة الصور لتتلاءم مع أبعاد العرض في التطبيق المصغّر واستخدام
RGB_565: يجب فك ترميز الصور النقطية باستخدام قيمBitmapFactory.Options.inSampleSizeمن مضاعفات الرقم 2 بحجم يتناسب مع الحد الأقصى لأبعاد العرض في التطبيق المصغّر (maxWidthDpفيmaxHeightDp)، واستخدامBitmap.Config.RGB_565(2بايت لكل بكسل) بدلاً منARGB_8888(4بايت لكل بكسل) للصور الفوتوغرافية والصور المصغّرة غير الشفافة.رفع فك ترميز الصور النقطية خارج
provideContentفي Jetpack Glance: عند استخدامSizeMode.ResponsiveأوSizeMode.Exact، يستدعي Glance دالةprovideContentlambda مرة واحدة لكل مجموعة حجم. يجب فك ترميز كلBitmapمشترَك مرة واحدة داخلprovideGlanceقبل استدعاءprovideContentلكي تشير جميع مجموعات الأحجام إلى مثيلBitmapنفسه فيRemoteViews.mBitmapCache.استخدام طلبات
updateAppWidgetالكاملة عند استبدال الصور: في عمليات تنفيذAppWidgetProviderالكلاسيكية، تجنَّب طلبAppWidgetManager.partiallyUpdateAppWidgetلتبديل طرق عرضBitmapأوIcon. تدمج التعديلات الجزئية الإجراءات الجديدة في شجرةRemoteViewsالحالية فيsystem_serverبدون إزالة إجراءات الصور المخزّنة مؤقتًا سابقًا. يمكنك إنشاء تنسيقRemoteViewsكامل واستدعاءupdateAppWidgetبدلاً من ذلك.توفير تنسيق احتياطي في حال حدوث خطأ: في Jetpack Glance، يمكنك إلغاء
onCompositionErrorلعرض عنصر احتياطيRemoteViewsبدون صور نقطية في حال تعذّر التحديث.
يمكنك فحص استخدام الذاكرة الحالي للصور النقطية المتسلسلة في التطبيق المصغّر على جهاز متصل من خلال تنفيذ ما يلي:
adb shell dumpsys appwidget
الوظيفة الأساسية
يتضمّن Android 17 التغييرات التالية التي تعدّل أو توسّع إمكانات أساسية متنوّعة في نظام Android.
تنفيذ جديد لـ MessageQueue بدون قفل
بدءًا من الإصدار 17 من نظام التشغيل Android، تحصل التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث على تنفيذ جديد بدون قفل لـ android.os.MessageQueue. يؤدي التنفيذ الجديد إلى تحسين الأداء
وتقليل اللقطات المفقودة، ولكنه قد يؤدي إلى تعطُّل البرامج التي تستخدم MessageQueue
الحقول والأساليب الخاصة.
لمزيد من المعلومات، بما في ذلك استراتيجيات تخفيف الأثر، يُرجى الاطّلاع على إرشادات حول تغيير سلوك MessageQueue.
أصبحت الحقول النهائية الثابتة غير قابلة للتعديل الآن
لا يمكن للتطبيقات التي تعمل على الإصدار 17 من نظام التشغيل Android أو الإصدارات الأحدث والتي تستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث تغيير حقول static final. إذا
حاول أحد التطبيقات تغيير حقل static final باستخدام الانعكاس، سيؤدي ذلك إلى
حدوث IllegalAccessException. ستؤدي محاولة تعديل أحد هذه الحقول
من خلال واجهات برمجة تطبيقات JNI (مثل SetStaticLongField()) إلى تعطُّل التطبيق.
تسهيل الاستخدام
يُجري Android 17 التغييرات التالية لتحسين ميزات تسهيل الاستخدام.
تسهيل استخدام لوحة المفاتيح الخارجية المعقّدة التي تستخدم أسلوب الإدخال (IME)
This feature introduces new AccessibilityEvent and TextAttribute
APIs to enhance screen reader spoken feedback for CJKV language input. CJKV IME
apps can now signal whether a text conversion candidate has been selected during
text composition. Apps with edit fields can specify text change types when
sending text changed accessibility events.
For example, apps can specify that a text change occurred during text
composition, or that a text change resulted from a commit.
Doing this enables accessibility
services such as screen readers to deliver more precise feedback based on the
nature of the text modification.
App adoption
IME Apps: When setting composing text in edit fields, IMEs can use
TextAttribute.Builder.setTextSuggestionSelected()to indicate whether a specific conversion candidate was selected.Apps with Edit Fields: Apps that maintain a custom
InputConnectioncan retrieve candidate selection data by callingTextAttribute.isTextSuggestionSelected(). These apps should then callAccessibilityEvent.setTextChangeTypes()when dispatchingTYPE_VIEW_TEXT_CHANGEDevents. Apps targeting Android 17 (API level 37) that use the standardTextViewwill have this feature enabled by default. (That is,TextViewwill handle retrieving data from the IME and setting text change types when sending events to accessibility services).Accessibility Services: Accessibility services that process
TYPE_VIEW_TEXT_CHANGEDevents can callAccessibilityEvent.getTextChangeTypes()to identify the nature of the modification and adjust their feedback strategies accordingly.
الخصوصية
يتضمّن Android 17 التغييرات التالية لتحسين خصوصية المستخدم.
تم تفعيل بروتوكول ECH (Encrypted Client Hello)
يقدّم Android 17 دعمًا على مستوى النظام الأساسي لبروتوكول Encrypted Client Hello (ECH)، وهو إضافة لبروتوكول أمان طبقة النقل (TLS) تعزّز خصوصية المستخدم من خلال تشفير إشارة اسم الخادم (SNI) في تأكيد اتصال بروتوكول أمان طبقة النقل (TLS). يساعد هذا التشفير في منع مراقبي الشبكة من التعرّف بسهولة على النطاق المحدّد الذي يتصل به تطبيقك.
بالنسبة إلى التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 37) أو الإصدارات الأحدث، يتم استخدام ECH لاتصالات بروتوكول أمان طبقة النقل (TLS). لا يتم تفعيل ECH إلا إذا كانت مكتبة الشبكات التي يستخدمها التطبيق (مثل HttpEngine أو WebView أو OkHttp) تتضمّن ميزة ECH وكان الخادم البعيد متوافقًا أيضًا مع بروتوكول ECH. إذا تعذّر التفاوض بشأن ECH، يرسل العميل إضافة ECH بمحتوى عشوائي (آلية تُعرف باسم ECH GREASE). يمكنك الاطّلاع على RFC 9849 لمزيد من التفاصيل حول آلية عمل ECH GREASE.
للسماح للتطبيقات بتخصيص هذا السلوك، يضيف Android 17 عنصر
<domainEncryption> جديدًا إلى ملف "إعدادات أمان الشبكة".
يمكن للمطوّرين استخدام <domainEncryption> ضمن علامات <base-config> أو
<domain-config> لاختيار وضع ECH (على سبيل المثال،
"enabled" أو "disabled") على مستوى عام أو على مستوى النطاق.
لمزيد من المعلومات، يُرجى الاطّلاع على مستندات Encrypted Client Hello.
إذن الوصول إلى الشبكة المحلية مطلوب للتطبيقات التي تستهدف الإصدار 17 من Android
يقدّم Android 17 إذن التشغيل ACCESS_LOCAL_NETWORK
لحماية المستخدمين من الوصول غير المصرَّح به إلى الشبكة المحلية. بما أنّ هذا الإذن يندرج ضمن مجموعة أذونات NEARBY_DEVICES الحالية، لن يُطلب من المستخدمين الذين سبق لهم منح أذونات NEARBY_DEVICES أخرى منح هذا الإذن مرة أخرى. يمنع هذا الشرط الجديد التطبيقات الضارة من استغلال الوصول غير المقيّد إلى الشبكة المحلية لتتبُّع المستخدمين بشكل خفي واستكشاف تفاصيل أجهزتهم. من خلال الإفصاح عن هذا الإذن وطلبه، يمكن لتطبيقك اكتشاف الأجهزة المتصلة بشبكة الاتصال المحلية (LAN) والاتصال بها، مثل الأجهزة المنزلية الذكية أو أجهزة استقبال البث.
أمام التطبيقات التي تستهدف الإصدار 17 من Android (مستوى واجهة برمجة التطبيقات 37) أو الإصدارات الأحدث الآن طريقتان للحفاظ على الاتصال بأجهزة شبكة LAN: استخدام أدوات اختيار الأجهزة التي يتوسّطها النظام والتي تحافظ على الخصوصية لتخطّي طلب الإذن، أو طلب هذا الإذن الجديد صراحةً أثناء وقت التشغيل للحفاظ على الاتصال بالشبكة المحلية.
لمزيد من المعلومات، يُرجى الاطّلاع على مستندات إذن الشبكة المحلية.
إخفاء كلمات المرور من الأجهزة الفعلية
إذا كان التطبيق يستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث وكان المستخدم يستخدم جهاز إدخال ماديًا (مثل لوحة مفاتيح خارجية)، يطبّق نظام التشغيل Android الإعداد الجديد show_passwords_physical على جميع الأحرف في حقل كلمة المرور. يؤدي هذا الإعداد تلقائيًا إلى إخفاء جميع أحرف كلمة المرور.
يعرض نظام Android آخر حرف تم كتابته في كلمة المرور لمساعدة المستخدم في معرفة ما إذا كان قد أخطأ في كتابة كلمة المرور. ومع ذلك، فإن هذا أقل ضرورة مع لوحات المفاتيح الخارجية الأكبر حجمًا. بالإضافة إلى ذلك، غالبًا ما تحتوي الأجهزة التي تتضمّن لوحات مفاتيح خارجية على شاشات أكبر، ما يزيد من خطر رؤية شخص ما لكلمة المرور التي تتم كتابتها.
إذا كان المستخدم يستخدم شاشة الجهاز التي تعمل باللمس، يطبّق النظام الإعداد الجديد
show_passwords_touch.
حماية كلمات المرور الصالحة لمرة واحدة (OTP) في رسائل SMS العادية
بدءًا من الإصدار 17 من نظام التشغيل Android، سيتم توسيع نطاق حماية كلمات المرور الصالحة لمرة واحدة (OTP) في الرسائل القصيرة
لتشمل الرسائل القصيرة العادية (الرسائل القصيرة التي تحتوي على كلمة مرور صالحة لمرة واحدة ولا
تستخدم تنسيقات WebOTP أو SMS Retriever). بالنسبة إلى معظم التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 37) أو الإصدارات الأحدث، لا تصبح رسائل SMS هذه متاحة إلا بعد مرور ثلاث ساعات على استلامها. يهدف هذا التأخير إلى المساعدة في
منع الاستيلاء على كلمة المرور الصالحة لمرة واحدة. خلال فترة التأخير التي تبلغ ثلاث ساعات، يتم حجب بث SMS_RECEIVED_ACTION وتتم فلترة طلبات البحث في قاعدة بيانات مقدّم خدمة الرسائل القصيرة. وتكون الرسالة القصيرة SMS متاحة لهذه التطبيقات بعد التأخير.
يُستثنى من هذا التأخير بعض التطبيقات، مثل تطبيق المساعد التلقائي للرسائل القصيرة والتطبيقات المصاحبة للأجهزة المتصلة وما إلى ذلك. يجب أن تنتقل جميع التطبيقات التي تعتمد على قراءة رسائل SMS لاستخراج كلمات المرور الصالحة لمرة واحدة إلى استخدام واجهات برمجة التطبيقات SMS Retriever أو SMS User Consent لضمان استمرار عملها.
الأمان
يقدّم Android 17 التحسينات التالية على أمان الأجهزة والتطبيقات.
أمان النشاط
在 Android 17 中,平台继续向“默认安全”架构转变,引入了一系列旨在缓解高严重性漏洞利用(例如钓鱼式攻击、互动劫持和混淆代理攻击)的增强功能。此次更新要求开发者明确选择启用新的安全标准,以保持应用兼容性并保护用户。
对开发者产生的主要影响包括:
- BAL 强化和改进的选择启用:我们正在优化后台 activity 启动 (BAL) 限制,将保护范围扩展到
IntentSender。开发者必须停止使用旧版MODE_BACKGROUND_ACTIVITY_START_ALLOWED常量。相反,您应该采用精细控制,例如MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE,它会将 activity 启动限制在调用应用可见的场景中,从而显著减少攻击面。 - 采用工具:开发者应利用严格模式和更新后的 lint 检查来识别旧版模式,并确保为未来的目标 SDK 要求做好准备。
تفعيل شفافية الشهادة تلقائيًا
إذا كان التطبيق يستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، يتم تفعيل ميزة شفافية الشهادات (CT) تلقائيًا. (في Android 16، تتوفّر ميزة "الشفافية في الشهادات"، ولكن كان على التطبيقات الموافقة على استخدامها).
Safer Native DCL—C
إذا كان تطبيقك يستهدف الإصدار 17 من نظام التشغيل Android (المستوى 37 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، فإنّ ميزة "الحماية الأكثر أمانًا لتحميل الرموز البرمجية الديناميكية" التي تم تقديمها في الإصدار 14 من نظام التشغيل Android لملفات DEX وJAR تمتد الآن لتشمل المكتبات المجمّعة من رموز برمجية أصلية.
يجب وضع علامة "للقراءة فقط" على جميع الملفات الأصلية التي يتم تحميلها باستخدام System.load().
وإلا، سيعرض النظام UnsatisfiedLinkError.
ننصح بأن تتجنّب التطبيقات تحميل الرموز البرمجية ديناميكيًا كلما أمكن ذلك، لأنّ ذلك يزيد بشكل كبير من خطر اختراق التطبيق من خلال حقن الرموز البرمجية أو التلاعب بها.
تقييد حقول معلومات تحديد الهوية الشخصية في عرض بيانات CP2
对于以 Android 17(API 级别 37)及更高版本为目标平台的应用,Contacts Provider 2 (CP2) 会限制数据视图中包含个人身份信息 (PII) 的某些列。启用此变更后,系统会从数据视图中移除这些列,以加强用户隐私保护。 受限列包括:
使用 ContactsContract.Data 中这些列的应用可以改为通过与 RAW_CONTACT_ID 联接,从 ContactsContract.RawContacts 中提取这些列。
فرض عمليات تحقّق صارمة من SQL في CP2
对于以 Android 17(API 级别 37)及更高版本为目标平台的应用,如果在没有 READ_CONTACTS 权限的情况下访问 ContactsContract.Data 表,Contacts Provider 2 (CP2) 会强制执行严格的 SQL 查询验证。
做出此项更改后,如果应用没有 READ_CONTACTS 权限,则在查询 ContactsContract.Data 表时会设置 StrictColumns 和 StrictGrammar 选项。如果查询使用的模式与这些模式不兼容,则会被拒绝并导致抛出异常。
Intelligence
يتضمّن Android 17 التغييرات التالية على ذكاء النظام.
إيقاف setContentCaptureEnabled نهائيًا
يتم تفعيل ميزة "التقاط المحتوى" تلقائيًا على أجهزة معيّنة للسماح لميزات تستخدم الذكاء الاصطناعي على الجهاز فقط بتحليل محتوى الشاشة لتقديم تجارب ذكية.
اعتبارًا من الإصدار 17 من نظام التشغيل Android، سيتم إيقاف طريقة واجهة برمجة التطبيقات
ContentCaptureManager.setContentCaptureEnabled(boolean)
نهائيًا. بالنسبة إلى التطبيقات التي تستهدف الإصدار 17 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 37) أو الإصدارات الأحدث، لن يؤدي استدعاء setContentCaptureEnabled(false) إلى إيقاف ميزة "التقاط المحتوى".
إذا كان تطبيقك بحاجة إلى مواصلة إيقاف ميزة "التقاط المحتوى" أو حظر التقاط محتوى الشاشة من قِبل النظام، عليك الانتقال إلى استخدام مَعلمة تنسيق النافذة FLAG_SECURE.
لإيقاف ميزة "التقاط المحتوى"، اضبط العلامة FLAG_SECURE على نافذتك كما هو موضّح في المثال التالي:
Kotlin
window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)
Java
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
);
لمزيد من التفاصيل، يُرجى الاطّلاع على المستندات المرجعية حول WindowManager.LayoutParams.FLAG_SECURE.
الوسائط
يتضمّن Android 17 التغييرات التالية في سلوك الوسائط.
تعزيز أمان الصوت في الخلفية
从 Android 17 开始,音频框架会对后台音频互动(包括音频播放、音频焦点请求和音量更改 API)施加限制,以确保这些更改是由用户有意发起的。
部分音频限制适用于所有应用。不过,如果应用以 Android 17(API 级别 37)为目标平台,则限制会更加严格。如果其中一个应用在后台运行时与音频互动,则必须运行前台服务。此外,应用还必须满足以下一项或两项要求:
- 前台服务必须具有“仅在使用时允许”(WIU) 功能。
- 应用必须具有精确闹钟权限,并且正在与
USAGE_ALARM音频串流互动。
如需了解详情(包括缓解措施),请参阅后台音频安全加固。
أشكال الأجهزة
يتضمّن Android 17 التغييرات التالية لتحسين تجربة المستخدم على مجموعة من أحجام الأجهزة وأشكالها.
تغييرات في واجهة برمجة التطبيقات الخاصة بالمنصة لتجاهل قيود اتجاه الشاشة وإمكانية تغيير الحجم ونسبة العرض إلى الارتفاع على الشاشات الكبيرة (أصغر عرض يساوي 600 وحدة بكسل مستقلة الكثافة أو أكثر)
我们在 Android 16 中引入了平台 API 变更,以便针对以 API 级别 36 或更高级别为目标平台的应用,忽略大屏设备(sw >= 600dp)上的屏幕方向、尺寸调整和宽高比限制。开发者可以选择在 SDK 36 中选择退出这些变更,但对于以 Android 17(API 级别 37)或更高版本为目标平台的应用,此选择退出选项将不再可用。
如需了解详情,请参阅系统会忽略对屏幕方向和可调整大小性的限制。
إمكانية الاتصال
يقدّم Android 17 التغيير التالي لتحسين الاتساق والتوافق مع سلوك Java InputStream العادي لمقابس بلوتوث من نوع RFCOMM.
سلوك ثابت للدالة read() الخاصة بـ BluetoothSocket في RFCOMM
对于以 Android 17(API 级别 37)为目标平台的应用,当套接字关闭或连接断开时,从基于 RFCOMM 的 BluetoothSocket 获取的 InputStream 的 read() 方法现在会返回 -1。
此项变更使 RFCOMM 套接字行为与 LE CoC 套接字保持一致,并与标准 InputStream.read() 文档保持一致,该文档指出,当到达数据流末尾时,会返回 -1。
仅依赖于捕获 IOException 来跳出读取循环的应用可能会受到此变更的影响,应更新 BluetoothSocket 读取循环,以明确检查返回值是否为 -1。这样可确保在远程设备断开连接或套接字关闭时,循环正确终止。如需查看推荐实现的示例,请参阅传输蓝牙数据指南中的代码段。