إنّ الأذونات المتعلّقة بالموقع الجغرافي والميكروفون والكاميرا تمنح تطبيقك إمكانية الوصول إلى معلومات حساسة بشكل خاص عن المستخدمين. وتتضمّن النظام الأساسي العديد من الآليات الموضحة في هذه الصفحة لمساعدة المستخدمين في البقاء على اطّلاع بآخر المعلومات والتحكّم في اختيار التطبيقات التي يمكنها الوصول إلى الموقع الجغرافي والميكروفون والكاميرا.
يجب ألا تؤثر ميزات نظام الحفاظ على الخصوصية هذه في كيفية معالجة تطبيقك للأذونات المتعلّقة بالموقع الجغرافي والميكروفون والكاميرا، طالما أنّك تتّبع أفضل ممارسات الخصوصية.
على وجه الخصوص، تأكّد من تنفيذ ما يلي في تطبيقك:
- انتظِر للوصول إلى كاميرا الجهاز إلى أن يمنح المستخدم إذن
CAMERA
إلى تطبيقك. - انتظِر للوصول إلى ميكروفون الجهاز إلى أن يمنح المستخدم
إذن
RECORD_AUDIO
لتطبيقك. - انتظِر إلى أن يتفاعل المستخدم مع ميزة في تطبيقك تتطلّب تحديد الموقع الجغرافي قبل أن تطلب الحصول على إذن
ACCESS_COARSE_LOCATION
أو إذنACCESS_FINE_LOCATION
، كما هو موضّح في الدليل حول كيفية طلب أذونات تحديد الموقع الجغرافي. - عليك الانتظار إلى أن يمنح المستخدم تطبيقك إما إذن
ACCESS_COARSE_LOCATION
أو إذنACCESS_FINE_LOCATION
قبل أن تطلب الحصول على إذنACCESS_BACKGROUND_LOCATION
.
لوحة بيانات الخصوصية
على الأجهزة المتوافقة التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، تظهر شاشة "لوحة بيانات الخصوصية" في إعدادات النظام. في هذه الشاشة، يمكن للمستخدمين الوصول إلى شاشات منفصلة تظهر عندما تصل التطبيقات إلى معلومات الموقع والكاميرا والميكروفون. تعرض كل شاشة جدولاً زمنيًا لوقت وصول التطبيقات المختلفة إلى نوع معين من البيانات. يوضح الشكل 1 الجدول الزمني للوصول إلى البيانات لمعلومات الموقع.
إظهار أسباب الوصول إلى البيانات
يمكن أن يقدّم تطبيقك سببًا منطقيًا للمستخدمين لمساعدتهم في فهم سبب وصول تطبيقك إلى معلومات الموقع الجغرافي أو الكاميرا أو الميكروفون. يمكن أن يظهر هذا الأساس على شاشة "لوحة بيانات الخصوصية" الجديدة أو على شاشة أذونات تطبيقك أو كليهما.
لتوضيح سبب وصول تطبيقك إلى معلومات الموقع الجغرافي والكاميرا والميكروفون، يُرجى إكمال الخطوات التالية:
أضف نشاطًا يوفر عند بدئه بعض الأسباب المنطقية لسبب تنفيذ تطبيقك لنوع معين من إجراءات الوصول إلى البيانات. في هذا النشاط، اضبط السمة
android:permission
علىSTART_VIEW_PERMISSION_USAGE
.إذا كان تطبيقك يستهدف نظام التشغيل Android 12 أو إصدارًا أحدث، عليك تحديد قيمة للسمة
android:exported
بشكل صريح.أضِف فلتر الأهداف التالي إلى النشاط المُضاف حديثًا:
<!-- android:exported required if you target Android 12. --> <activity android:name=".DataAccessRationaleActivity" android:permission="android.permission.START_VIEW_PERMISSION_USAGE" android:exported="true"> <!-- VIEW_PERMISSION_USAGE shows a selectable information icon on your app permission's page in system settings. VIEW_PERMISSION_USAGE_FOR_PERIOD shows a selectable information icon on the Privacy Dashboard screen. --> <intent-filter> <action android:name="android.intent.action.VIEW_PERMISSION_USAGE" /> <action android:name="android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD" /> <category android:name="android.intent.category.DEFAULT" /> ... </intent-filter> </activity>
حدد ما يجب أن يظهره نشاط أسباب الوصول إلى البيانات. على سبيل المثال، قد تعرض الموقع الإلكتروني لتطبيقك أو مقالة في مركز المساعدة. لتقديم شرح أكثر تفصيلاً حول أنواع البيانات التي يصل إليها تطبيقك، وكذلك وقت حدوث الوصول، تعامل مع العناصر الإضافية التي يتضمنها النظام عندما يستدعي القصد من استخدام الإذن:
- إذا استدعى النظام
ACTION_VIEW_PERMISSION_USAGE
، يمكن لتطبيقك استرداد قيمة لـEXTRA_PERMISSION_GROUP_NAME
. - إذا استدعى النظام
ACTION_VIEW_PERMISSION_USAGE_FOR_PERIOD
، يمكن لتطبيقك استرداد قيمEXTRA_PERMISSION_GROUP_NAME
وEXTRA_ATTRIBUTION_TAGS
وEXTRA_START_TIME
وEXTRA_END_TIME
.
- إذا استدعى النظام
استنادًا إلى فلاتر الأهداف التي تضيفها، يظهر للمستخدمين رمز المعلومات بجانب اسم تطبيقك على شاشات معيّنة:
- إذا أضفت فلتر الأهداف الذي يحتوي على إجراء
VIEW_PERMISSION_USAGE
، سيظهر للمستخدمين الرمز على صفحة أذونات تطبيقك في إعدادات النظام. يمكنك تطبيق هذا الإجراء على جميع أذونات وقت التشغيل. - وإذا أضفت فلتر الأهداف الذي يحتوي على إجراء
VIEW_PERMISSION_USAGE_FOR_PERIOD
، سيظهر للمستخدمين الرمز بجانب اسم تطبيقك كلما ظهر تطبيقك في شاشة "لوحة بيانات الخصوصية".
وعندما يختار المستخدمون ذلك الرمز، يتم بدء نشاط الأساس المنطقي لتطبيقك.
المؤشرات
على الأجهزة التي تعمل بنظام التشغيل Android 12 أو إصدار أحدث، عندما يصل أحد التطبيقات إلى الميكروفون أو الكاميرا، يظهر رمز في شريط الحالة. إذا كان التطبيق في الوضع المجسم، سيظهر الرمز في أعلى يسار الشاشة. يمكن للمستخدمين فتح "الإعدادات السريعة" وتحديد الرمز للاطّلاع على التطبيقات التي تستخدم الميكروفون أو الكاميرا حاليًا. يوضّح الشكل 2 مثالاً للقطة شاشة تحتوي على الرموز.
تحديد موقع شاشة المؤشرات
إذا كان تطبيقك يدعم الوضع المجسم أو واجهة مستخدم بملء الشاشة، فقد تتداخل المؤشرات أحيانًا مع واجهة مستخدم التطبيق. وللمساعدة في مواءمة واجهة المستخدم مع هذه المؤشرات،
يقدّم النظام طريقة
getPrivacyIndicatorBounds()
التي يوضّحها مقتطف الرمز التالي. باستخدام واجهة برمجة التطبيقات هذه، يمكنك
تحديد الحدود التي قد تظهر فيها المؤشرات. قد تقرر بعد ذلك تنظيم واجهة
المستخدم على الشاشة بشكل مختلف.
Kotlin
view.setOnApplyWindowInsetsListener { view, windowInsets -> val indicatorBounds = windowInsets.getPrivacyIndicatorBounds() // change your UI to avoid overlapping windowInsets }
تبديلات
على الأجهزة المتوافقة التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، يمكن للمستخدمين تفعيل وإيقاف إمكانية الوصول إلى الكاميرا والميكروفون لجميع التطبيقات على الجهاز من خلال الضغط على خيار تبديل واحد. يمكن للمستخدمين الوصول إلى الخيارات القابلة للتبديل من الإعدادات السريعة، كما هو موضّح في الشكل 3، أو من شاشة الخصوصية في إعدادات النظام.
يؤثر تبديل الكاميرا والميكروفون في جميع التطبيقات على الجهاز:
- عندما يوقِف المستخدم الوصول إلى الكاميرا، يتلقّى تطبيقك خلاصة فارغة للكاميرا.
عندما يوقف المستخدم الوصول إلى الميكروفون، يتلقى التطبيق صوتًا صامتًا. بالإضافة إلى ذلك، تكون أجهزة استشعار الحركة محدودة، بغض النظر عمّا إذا كنت قد أعلنت عن إذن
HIGH_SAMPLING_RATE_SENSORS
.
عندما يوقِف المستخدم إمكانية الوصول إلى الكاميرا أو الميكروفون، ثم يشغِّل تطبيقًا يحتاج إلى الوصول إلى معلومات الكاميرا أو الميكروفون، يذكّر النظام المستخدم بإيقاف التبديل على مستوى الجهاز.
التحقّق من دعم الجهاز
للتحقق مما إذا كان أحد الأجهزة يدعم الميكروفون والكاميرا، أضف المنطق الذي يظهر في مقتطف الرمز التالي:
Kotlin
val sensorPrivacyManager = applicationContext .getSystemService(SensorPrivacyManager::class.java) as SensorPrivacyManager val supportsMicrophoneToggle = sensorPrivacyManager .supportsSensorToggle(Sensors.MICROPHONE) val supportsCameraToggle = sensorPrivacyManager .supportsSensorToggle(Sensors.CAMERA)
لغة Java
SensorPrivacyManager sensorPrivacyManager = getApplicationContext() .getSystemService(SensorPrivacyManager.class); boolean supportsMicrophoneToggle = sensorPrivacyManager .supportsSensorToggle(Sensors.MICROPHONE); boolean supportsCameraToggle = sensorPrivacyManager .supportsSensorToggle(Sensors.CAMERA);