يقدّم Android 10 (المستوى 29 لواجهة برمجة التطبيقات) عددًا من الميزات والتغييرات في السلوك لحماية خصوصية المستخدمين بشكل أفضل. وتوفّر هذه التغييرات المزيد من الشفافية والتحكّم للمستخدمين في بياناتهم والصلاحيات التي يمنحها للتطبيقات. قد تعني هذه الميزات أنّ السلوكيات أو البيانات المحدّدة التي يعتمد عليها تطبيقك قد تتصرف بشكلٍ مختلف مقارنةً بالإصدارات القديمة من المنصة. من المفترض ألا يكون للتغييرات أي تأثير على تطبيقك إذا كان يتبع أفضل الممارسات الحالية في التعامل مع بيانات المستخدمين.
تعرض هذه الصفحة ملخّصًا لكل تغيير.
أهم التغييرات
يتضمّن هذا القسم التغييرات الأساسية التي طرأت على Android 10 في ما يتعلّق بالخصوصية.
الوصول إلى مساحة التخزين الخارجية يقتصر على ملفات التطبيق ووسائطه
تحصل التطبيقات التي تستهدف الإصدار 10 من نظام التشغيل Android والإصدارات الأحدث تلقائيًا على إذن وصول محدود إلى مساحة التخزين الخارجية أومساحة تخزين محدودة. ويمكن لهذه التطبيقات الاطّلاع على الأنواع التالية من الملفات داخل جهاز تخزين خارجي بدون الحاجة إلى طلب أي أذونات مستخدم ذات صلة بمساحة التخزين:
- الملفات في الدليل الخاص بالتطبيق، والتي يمكن الوصول إليها باستخدام
getExternalFilesDir()
- الصور والفيديوهات والمقاطع الصوتية التي أنشأها التطبيق من مخزّن الوسائط
للاطّلاع على مزيد من المعلومات عن مساحة التخزين ذات النطاق المحدّد، بالإضافة إلى كيفية مشاركة الملفات المحفوظة على أجهزة التخزين الخارجية والوصول إليها وتعديلها، يمكنك الاطّلاع على الأدلة حول كيفية إدارة الملفات في مساحة التخزين الخارجية والوصول إلى ملفات الوسائط وتعديلها.
للوصول إلى الموقع الجغرافي للجهاز في الخلفية، يجب الحصول على إذن
لتوفير التحكُّم الإضافي الذي يمكن للمستخدمين التحكّم به في وصول التطبيق إلى
معلومات الموقع الجغرافي، يوفِّر Android 10 إذن
ACCESS_BACKGROUND_LOCATION
.
على عكس إذنَي
ACCESS_FINE_LOCATION
و
ACCESS_COARSE_LOCATION
، لا يؤثر إذن ACCESS_BACKGROUND_LOCATION
إلا في
وصول التطبيق إلى الموقع الجغرافي عندما يعمل في الخلفية. يُعتبر أنّ التطبيق
يحصل على الموقع الجغرافي في الخلفية ما لم يتم استيفاء أحد الشروط التالية:
- ظهور نشاط ينتمي إلى التطبيق
يشغِّل التطبيق خدمة تعمل في المقدّمة تم تحديد نوع خدمة لها هو
location
.للإشارة إلى نوع الخدمة التي تعمل في المقدّمة في تطبيقك، اضبط
targetSdkVersion
أوcompileSdkVersion
في تطبيقك على29
أو إصدار أحدث. اطّلِع على مزيد من المعلومات عن كيفية مواصلة الخدمات التي تعمل في المقدّمة لأداء إجراءات بدأها المستخدم والتي تتطلّب الوصول إلى الموقع الجغرافي.
إذا كان تطبيقك ينشئ حدودًا جغرافية ويراقبها ويستهدف
الإصدار 10 من نظام التشغيل Android (المستوى 29 لواجهة برمجة التطبيقات) أو إصدارًا أحدث، يجب الإفصاح عن الإذن
ACCESS_BACKGROUND_LOCATION
.
يتم منح الإذن بالوصول تلقائيًا عند استهداف أجهزة Android 9 أو الإصدارات الأقدم.
إذا كان تطبيقك يعمل على الإصدار 10 من نظام التشغيل Android أو إصدار أحدث ولكنه يستهدف الإصدار 9 (المستوى 28 لواجهة برمجة التطبيقات) أو إصدارًا أقدم، يطبّق النظام الأساسي السلوك التالي:
- إذا كان تطبيقك يعلن عن عنصر
<uses-permission>
لكل منACCESS_FINE_LOCATION
أوACCESS_COARSE_LOCATION
، يضيف النظام تلقائيًا عنصر<uses-permission>
لملف APKACCESS_BACKGROUND_LOCATION
أثناء التثبيت. - إذا طلب تطبيقك
ACCESS_FINE_LOCATION
أوACCESS_COARSE_LOCATION
، يضيف النظام تلقائيًاACCESS_BACKGROUND_LOCATION
إلى الطلب.
الوصول عند ترقية الجهاز إلى Android 10
إذا منح المستخدم تطبيقك إذن الوصول إلى الموقع الجغرافي للجهاز، سواءً كان
ACCESS_COARSE_LOCATION
أو
ACCESS_FINE_LOCATION
، ثمّ أجرى ترقية لجهازه من Android 9 إلى Android 10،
سيُعدّل النظام تلقائيًا مجموعة الأذونات المستندة إلى الموقع الجغرافي الممنوحة
لتطبيقك. وتعتمد مجموعة الأذونات التي يحصل عليها تطبيقك بعد الترقية
على إصدار حزمة تطوير البرامج (SDK) المستهدَف وأذوناته المحدّدة، كما هو موضّح في
الجدول التالي:
إصدار النظام الأساسي المستهدَف | هل تم منح الإذن التقريبي أو الجيد؟ |
هل تم تحديد إذن الوصول إلى البيانات في الخلفية في البيان؟ |
حالة الإذن التلقائي المعدَّلة |
---|---|---|---|
الإصدار 10 من نظام التشغيل Android | نعم | نعم | الوصول إلى المقدمة والخلفية |
Android 10 | نعم | لا | الوصول إلى البيانات أثناء ظهورها على الشاشة فقط |
الإصدار 10 من نظام التشغيل Android | لا | (يتجاهلها النظام) | بلا إذن وصول |
الإصدار 9 من Android أو الإصدارات الأقدم | نعم | تتم إضافتها تلقائيًا من قِبل النظام في وقت ترقية الجهاز. | الوصول إلى المقدمة والخلفية |
الإصدار 9 من Android أو الإصدارات الأقدم | لا | (يتجاهلها النظام) | بلا إذن وصول |
يُرجى العِلم أنّه يمكن للمستخدم تغيير مستوى الوصول هذا حتى بعد أن يُعدِّل النظام تلقائيًا إذن وصول تطبيقك إلى الموقع الجغرافي للجهاز. على سبيل المثال، قد يقلل المستخدم من إمكانية وصول تطبيقك إلى المقدّمة فقط أو يُبطله تمامًا. قبل محاولة الوصول إلى الموقع الجغرافي للجهاز، خاصةً في خدمة تعمل في المقدّمة، يجب أن يتحقّق تطبيقك مما إذا كان المستخدم لا يزال يسمح لتطبيقك بتلقّي معلومات الموقع الجغرافي هذه.
تم إبطال إمكانية الوصول عند تعديل مستوى واجهة برمجة التطبيقات المستهدَف على أجهزة Android 10.
ضع في اعتبارك الحالة التي تم فيها تثبيت تطبيقك مسبقًا على جهاز يعمل بنظام التشغيل Android 10. إذا كنت قد عدّلت تطبيقك لاستهداف الإصدار
Android 10 في هذه الحالة، سيُلغي الجهاز إذن
ACCESS_BACKGROUND_LOCATION
.
لمزيد من المعلومات حول كيفية استرداد الموقع الجغرافي للجهاز عندما يكون تطبيقك في الخلفية، اطّلِع على الدليل حول تلقّي التعديلات الدورية على الموقع الجغرافي.
القيود المفروضة على بدء الأنشطة من الخلفية
بدءًا من الإصدار Android 10، سيفرض النظام قيودًا على بدء الأنشطة من الخلفية. يساعد تغيير السلوك هذا في الحد من مقاطعات المستخدم ومنحه تحكمًا أكبر في المحتوى الذي يظهر على الشاشة. وطالما أنّ تطبيقك يبدأ الأنشطة كنتيجة مباشرة لتفاعل المستخدم، من المرجّح ألا يتأثر تطبيقك بهذه القيود.
للاطّلاع على مزيد من المعلومات عن البديل المقترَح لبدء الأنشطة من الخلفية، يمكنك الاطّلاع على الدليل حول كيفية تنبيه المستخدمين بشأن الأحداث التي تعتمد على الوقت في تطبيقك.
المعرّفات والبيانات
يسرد هذا القسم التغييرات الخاصة بالتعامل مع معرّفات الأجهزة وبياناتها.
إزالة التشابه بين جهات الاتصال
بدءًا من الإصدار Android 10، لا يتتبّع النظام الأساسي معلومات التقارب من جهات الاتصال. نتيجةً لذلك، إذا أجرى تطبيقك عملية بحث في جهات اتصال المستخدم، لن يتم ترتيب النتائج حسب معدّل التفاعل.
يحتوي الدليل حول ContactsProvider
على إشعار يصف الحقول والطُرق التي أصبحت
قديمة على جميع الأجهزة
بدءًا من Android 10.
اختيار عنوان MAC بشكل عشوائي
على الأجهزة التي تعمل بنظام التشغيل Android 10 أو الإصدارات الأحدث، ينقل النظام عناوين MAC العشوائية بشكل تلقائي.
إذا كان تطبيقك يعالج حالة استخدام للمؤسسات، سيوفّر النظام الأساسي واجهات برمجة تطبيقات للعديد من العمليات المتعلقة بعناوين MAC:
- الحصول على عنوان MAC عشوائي: يمكن لتطبيقات مالك الجهاز وتطبيقات مالك الملف الشخصي استرداد عنوان MAC العشوائي الذي تم تحديده لشبكة معيّنة من خلال استدعاء
getRandomizedMacAddress()
. - الحصول على عنوان MAC الأصلي: يمكن لتطبيقات مالك الجهاز استرداد عنوان MAC للجهاز الفعلي من خلال الاتصال بـ
getWifiMacAddress()
. وتكون هذه الطريقة مفيدة لتتبُّع أسطول من الأجهزة.
قيود على الوصول إلى نظام الملفات /proc/net
على الأجهزة التي تعمل بنظام التشغيل Android 10 أو إصدار أحدث، لا يمكن للتطبيقات الوصول إلى
/proc/net
، الذي يتضمّن معلومات عن حالة شبكة الجهاز. وعلى التطبيقات
التي تحتاج إلى الوصول إلى هذه المعلومات، مثل الشبكات الافتراضية الخاصة، استخدام الفئة
NetworkStatsManager
أو
ConnectivityManager
.
القيود المفروضة على معرّفات الأجهزة غير القابلة لإعادة الضبط
بدءًا من الإصدار 10 من نظام التشغيل Android، يجب أن تحصل التطبيقات على
READ_PRIVILEGED_PHONE_STATE
الإذن المميّز للوصول إلى
المعرّفات غير القابلة لإعادة الضبط للجهاز، والتي تشمل رقم IMEI والرقم التسلسلي.
تشمل الطرق المتأثرة ما يلي:
Build
TelephonyManager
إذا لم يكن تطبيقك يملك الإذن وحاولت طلب معلومات عن المعرِّفات غير القابلة لإعادة الضبط على أي حال، يختلف ردّ المنصة استنادًا إلى إصدار حزمة SDK المستهدَف:
- إذا كان تطبيقك يستهدف الإصدار 10 من نظام التشغيل Android أو إصدارًا أحدث، يحدث
SecurityException
. - إذا كان تطبيقك يستهدف الإصدار 9 من نظام التشغيل Android (المستوى 28 من واجهة برمجة التطبيقات) أو إصدارًا أقدم، ستُعرِض الطريقة الرمز
null
أو بيانات العنصر النائب إذا كان التطبيق يملك الإذنREAD_PHONE_STATE
. وبخلاف ذلك، تحدثSecurityException
.
لا تحتاج العديد من حالات الاستخدام إلى معرّفات أجهزة لا يمكن إعادة ضبطها. على سبيل المثال، إذا كان تطبيقك يستخدم معرّفات الأجهزة التي لا يمكن إعادة ضبطها لأغراض تتبُّع الإعلانات أو إحصاءات المستخدمين، يمكنك استخدام المعرِّف الإعلاني على Android لحالات الاستخدام هذه تحديدًا. لمزيد من المعلومات، اطّلِع على أفضل الممارسات المتعلّقة بالمعرِّفات الفريدة.
وصول محدود إلى بيانات الحافظة
لا يمكن لتطبيقك الوصول إلى بيانات الحافظة على الإصدار 10 من Android أو إصدارٍ أحدث ما لم يكن هو محرر طريقة الإدخال (IME) التلقائي أو التطبيق الذي يتم التركيز عليه حاليًا.
حماية الرقم التسلسلي لجهاز USB
إذا كان تطبيقك يستهدف Android 10 أو إصدارًا أحدث، لن يتمكّن تطبيقك من قراءة الرقم التسلسلي إلا بعد أن يمنح المستخدم إذنًا للتطبيق بالوصول إلى جهاز USB أو الملحق.
لمعرفة المزيد من المعلومات حول استخدام أجهزة USB، يمكنك الاطّلاع على دليل حول كيفية ضبط مضيفات USB.
الكاميرا وإمكانية الاتصال
يسرد هذا القسم التغييرات المتعلّقة بالبيانات الوصفية للكاميرا وواجهات برمجة التطبيقات للاتصال.
القيود المفروضة على الوصول إلى تفاصيل الكاميرا وبياناتها الوصفية
يغيّر Android 10 اتساع المعلومات التي تعرضها طريقة
getCameraCharacteristics()
تلقائيًا. على وجه التحديد، يجب أن يحصل تطبيقك على إذن
CAMERA
للوصول إلى
البيانات الوصفية التي يُحتمل أن تكون خاصة بالجهاز والتي يتم تضمينها في قيمة
عرض هذه الطريقة.
لمعرفة المزيد من المعلومات حول هذه التغييرات، يمكنك الاطّلاع على القسم حول حقول الكاميرا التي تتطلّب إذنًا.
تقييد تفعيل شبكة Wi-Fi وإيقافها
لا يمكن للتطبيقات التي تستهدف الإصدار 10 من نظام التشغيل Android أو الإصدارات الأحدث تفعيل شبكة Wi-Fi أو إيقافها. تُرجع الطريقة
WifiManager.setWifiEnabled()
دائمًا القيمة false
.
إذا كنت بحاجة إلى مطالبة المستخدمين بتفعيل شبكة Wi-Fi وإيقافها، استخدِم panel الإعدادات.
القيود المفروضة على الوصول المباشر إلى شبكات Wi-Fi التي تم ضبطها
لحماية خصوصية المستخدم، يقتصر الضبط اليدوي لقائمة شبكات Wi-Fi على تطبيقات النظام ووحدات التحكّم بسياسة الأجهزة (DPC). يمكن أن يكون "المسؤول عن إدارة البيانات الشخصية" هو مالك الجهاز أو مالك الملف الشخصي.
إذا كان تطبيقك يستهدف الإصدار 10 من نظام التشغيل Android أو إصدارًا أحدث، ولم يكن تطبيقًا تابعًا للنظام أو أداة إدارة الخدمات، لن تُعرِض الطرق التالية بيانات مفيدة:
تُرجع الطريقة
getConfiguredNetworks()
قائمة فارغة دائمًا.إنّ كل طريقة لعملية الشبكة التي تعرض قيمة عددية كاملة،
addNetwork()
وupdateNetwork()
، تعرِض دائمًا قيمة -1.كل عملية شبكة تعرض قيمة منطقية، مثل
removeNetwork()
وreassociate()
وenableNetwork()
وdisableNetwork()
وreconnect()
وdisconnect()
، تعرض دائمًا القيمةfalse
.
إذا كان تطبيقك يحتاج إلى الاتصال بشبكات Wi-Fi، استخدِم البديل التالي للحصول على الإذن:
- لبدء اتصال فوري بشبكة Wi-Fi على الجهاز، استخدِم
WifiNetworkSpecifier
في عنصرNetworkRequest
عادي. - لإضافة شبكات Wi-Fi من أجل النظر في إمكانية توفير إمكانية الوصول إلى الإنترنت للمستخدِم، استخدِم عناصر
WifiNetworkSuggestion
. يمكنك إضافة الشبكات التي تظهر في مربع الحوار لاختيار شبكة الاتصال التلقائي وإزالتها من خلال النقر على رمزَيaddNetworkSuggestions()
وremoveNetworkSuggestions()
، على التوالي. ولا تتطلّب هذه الطرق أي أذونات لتحديد الموقع الجغرافي.
تتطلّب بعض واجهات برمجة التطبيقات (API) الخاصة بخدمات الهاتف والبلوتوث وWi-Fi الحصول على إذن تحديد الموقع الجغرافي بدقة.
إذا كان تطبيقك يستهدف الإصدار 10 من نظام التشغيل Android أو إصدارًا أحدث، يجب أن يكون لديه إذن
ACCESS_FINE_LOCATION
لاستخدام عدة طرق ضمن واجهات برمجة تطبيقات Wi-Fi أو Wi-Fi Aware
أو Bluetooth. تعرِض الأقسام التالية الفئات والطُرق المتأثّرة.
الاتصالات الهاتفية
TelephonyManager
getCellLocation()
getAllCellInfo()
requestNetworkScan()
requestCellInfoUpdate()
getAvailableNetworks()
getServiceState()
TelephonyScanManager
requestNetworkScan()
TelephonyScanManager.NetworkScanCallback
onResults()
PhoneStateListener
onCellLocationChanged()
onCellInfoChanged()
onServiceStateChanged()
Wi-Fi
WifiManager
startScan()
getScanResults()
getConnectionInfo()
getConfiguredNetworks()
WifiAwareManager
WifiP2pManager
WifiRttManager
البلوتوث
BluetoothAdapter
startDiscovery()
startLeScan()
BluetoothAdapter.LeScanCallback
BluetoothLeScanner
startScan()
الأذونات
يوضّح هذا القسم التعديلات التي سيتم إجراؤها على نموذج أذونات Android.
تم حظر الوصول إلى محتوى الشاشة
لحماية محتوى شاشة المستخدمين، يمنع نظام التشغيل Android 10 الوصول الصامت
إلى محتوى شاشة الجهاز من خلال تغيير نطاق أذونات
READ_FRAME_BUFFER
وCAPTURE_VIDEO_OUTPUT
وCAPTURE_SECURE_VIDEO_OUTPUT
. اعتبارًا من Android 10، ستتوفر هذه الأذونات
الوصول إلى التوقيع
فقط.
على التطبيقات التي تحتاج إلى الوصول إلى محتوى شاشة الجهاز استخدام واجهة برمجة تطبيقات MediaProjection
التي تعرض رسالة تطلب من المستخدم الموافقة.
التحقّق من الأذونات الموجَّهة للمستخدمين في التطبيقات القديمة
إذا كان تطبيقك موجهًا إلى الإصدار 5.1 من نظام التشغيل Android (المستوى 22 من واجهة برمجة التطبيقات) أو إصدار أقدم، ستظهر للمستخدمين شاشة تطلب منهم منح الأذونات عند استخدام تطبيقك على جهاز يعمل بالإصدار 10 من نظام التشغيل Android أو إصدارًا أحدث لأول مرة، كما هو موضّح في الشكل 1. وتمنح هذه الشاشة المستخدمين فرصة لإبطال الوصول إلى الأذونات التي منحها النظام سابقًا لتطبيقك عند التثبيت.
التعرّف على النشاط البدني
يوفّر Android 10 إذن تشغيل
android.permission.ACTIVITY_RECOGNITION
للتطبيقات التي تحتاج إلى رصد عدد خطوات المستخدم أو
تصنيف نشاطه البدني، مثل المشي أو ركوب الدرّاجة أو التحرّك
في مركبة. صُمِّمت هذه الميزة لمنح المستخدمين إمكانية الاطّلاع على طريقة استخدام بيانات أداة استشعار الجهاز
في "الإعدادات".
بعض المكتبات ضمن خدمات Google Play، مثل واجهة برمجة التطبيقات التعرُّف على النشاط وGoogle Fit API، لا تعرض النتائج ما لم يمنح المستخدم تطبيقك هذا الإذن.
إنّ أجهزة الاستشعار المدمجة فقط في الجهاز والتي تتطلّب منك تقديم بيان بهذا الإذن هي أجهزة الاستشعار عدّاد الخطوات وأداة كشف الخطوات.
إذا كان تطبيقك يستهدف الإصدار 9 من نظام التشغيل Android (المستوى 28 من واجهة برمجة التطبيقات) أو إصدارًا أقدم، يمنح النظام تلقائيًا
إذن android.permission.ACTIVITY_RECOGNITION
لتطبيقك، عند الحاجة،
إذا كان تطبيقك يستوفي كلًّا من الشروط التالية:
- يتضمّن ملف البيان الإذن
com.google.android.gms.permission.ACTIVITY_RECOGNITION
. - لا يتضمّن ملف البيان
الإذن
android.permission.ACTIVITY_RECOGNITION
.
إذا منحت ميزة "النظام التلقائي" الإذن android.permission.ACTIVITY_RECOGNITION
، يحتفظ تطبيقك بالإذن بعد تحديث تطبيقك لاستهداف
Android 10. ومع ذلك، يمكن للمستخدم سحب هذا الإذن في أي
وقت من خلال إعدادات النظام.
مجموعات الأذونات التي تمت إزالتها من واجهة المستخدم
اعتبارًا من Android 10، لا يمكن للتطبيقات البحث عن كيفية grouped تجميع الأذونات في واجهة المستخدم.