تمنح الأذونات المتعلقة بالموقع الجغرافي والميكروفون والكاميرا تطبيقك إمكانية الوصول إلى معلومات حساسة بشكل خاص عن المستخدمين. تتضمّن المنصة آليات متعدّدة، موضّحة في هذه الصفحة، لمساعدة المستخدمين في البقاء على اطّلاع على التطبيقات التي يمكنها الوصول إلى الموقع الجغرافي والميكروفون والكاميرا والتحكّم فيها.
يجب ألا تؤثر ميزات النظام التي تحافظ على الخصوصية في طريقة تعامُل تطبيقك مع الأذونات المتعلقة بالموقع الجغرافي والميكروفون والكاميرا، طالما أنّك تتبع أفضل ممارسات الخصوصية.
على وجه الخصوص، تأكَّد من تنفيذ ما يلي في تطبيقك:
- انتظِر حتى يمنح المستخدم تطبيقك إذن
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.إذا كان تطبيقك يستهدف الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، عليك تحديد قيمة للسمة بشكل صريح
android:exported.أضِف intent filter التالي إلى النشاط الذي تمّت إضافته مؤخرًا:
<!-- 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_NAMEEXTRA_ATTRIBUTION_TAGS،EXTRA_START_TIME، وEXTRA_END_TIME.
- إذا استدعى النظام
استنادًا إلى فلاتر الأهداف التي تضيفها، يرى المستخدمون رمز معلومات بجانب اسم تطبيقك على شاشات معيّنة:
- إذا أضفت فلتر الأهداف الذي يحتوي على إجراء
VIEW_PERMISSION_USAGE، يرى المستخدمون الرمز في صفحة أذونات تطبيقك في إعدادات النظام. يمكنك تطبيق هذا الإجراء على جميع أذونات وقت التشغيل. - إذا أضفت فلتر الأهداف الذي يحتوي على إجراء
VIEW_PERMISSION_USAGE_FOR_PERIOD، يرى المستخدمون الرمز بجانب اسم تطبيقك كلما ظهر تطبيقك في شاشة "لوحة بيانات الخصوصية".
عندما ينقر المستخدمون على هذا الرمز، يتم بدء نشاط الأساس المنطقي لتطبيقك.
المؤشرات
على الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، يظهر رمز في شريط الحالة عندما يصل أحد التطبيقات إلى الميكروفون أو الكاميرا. إذا كان التطبيق في وضع مجسم، يظهر الرمز في أعلى يسار الشاشة. يمكن للمستخدمين فتح "الإعدادات السريعة" والنقر على الرمز للاطّلاع على التطبيقات التي تستخدم حاليًا الميكروفون أو الكاميرا. يعرض الشكل 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);