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