في إطار تحسين جودة التطبيقات وحماية خصوصية المستخدمين، ننصحك بتقليل استخدام الأذونات في تطبيقاتك. ويساعد ذلك المستخدمين في العثور على التطبيقات العالية الجودة واستخدامها، والتي توفّر بيئة آمنة للمستخدمين.
يؤدي طلب الأذونات من المستخدمين إلى مقاطعة مسار المستخدم، ويمكن للمستخدمين رفض طلبك. بالإضافة إلى ذلك، في كل مرة تفصح فيها عن إذن جديد، عليك مراجعة كيفية طلب تطبيقك لبيانات المستخدمين ومشاركتها. تتطلّب بعض الأذونات وواجهات برمجة التطبيقات الحسّاسة بشكل خاص أن تقدّم بيان إفصاح داخل التطبيق عن إمكانية وصول تطبيقك إلى البيانات وجمعه واستخدامه ومشاركته لها.
تتوفّر عدة طرق بديلة لتقليل استخدام الأذونات:
- عليك الإفصاح عن الأذونات التي توفّر معلومات الموقع الجغرافي التقريبي، بدلاً من معلومات الموقع الجغرافي الدقيق، إذا كان تطبيقك يحتاج إلى الموقع الجغرافي التقريبي فقط.
- استدعاء واجهات برمجة التطبيقات التي تسمح لتطبيقك بتنفيذ الوظيفة المطلوبة بدون الإفصاح عن الأذونات
- استدعاء نوايا أو معالجات أحداث معيّنة لتنفيذ وظائف، بدلاً من تعريف الأذونات
- يوفر النظام عقودًا مدمجة لعمليات الملفات المختلفة، ويتيح أيضًا عقودًا مخصّصة.
إذا كان عليك الإفصاح عن أحد الأذونات، عليك دائمًا احترام قرار المستخدم وتوفير طريقة لخفض إصدار تطبيقك على نحو ملائم.
توضّح هذه الصفحة العديد من حالات الاستخدام التي يمكن أن يستوفيها تطبيقك بدون الحاجة إلى تضمين أي أذونات في نموذج البيان.
عرض الأماكن القريبة
قد يحتاج تطبيقك إلى معرفة الموقع الجغرافي التقريبي للمستخدم. ويفيد ذلك في عرض معلومات تستند إلى الموقع الجغرافي، مثل المطاعم القريبة.
لا تتطلّب بعض حالات الاستخدام سوى تقدير تقريبي للموقع الجغرافي للجهاز. في هذه الحالات، اتّخِذ أحد الإجراءَين التاليَين، وذلك حسب عدد المرات التي يحتاج فيها تطبيقك إلى معلومات تستند إلى الموقع الجغرافي:
- إذا كان تطبيقك يحتاج إلى تحديد الموقع الجغرافي بشكل متكرّر، عليك تضمين إذن
ACCESS_COARSE_LOCATION
في بيان الأذونات. يوفّر الإذن تقديرًا للموقع الجغرافي للجهاز من خدمات الموقع الجغرافي، كما هو موضّح في المستندات حول دقة الموقع الجغرافي التقريبي. - إذا كان تطبيقك يحتاج إلى بيانات الموقع الجغرافي بمعدّل أقل أو مرة واحدة فقط، ننصحك بأن تطلب من المستخدم إدخال عنوان أو رمز بريدي بدلاً من ذلك.
تتطلّب حالات الاستخدام الأخرى تقديرًا أكثر دقة للموقع الجغرافي للجهاز. هذه الحالات هي الحالات الوحيدة التي يكون فيها من المقبول الإفصاح عن إذن ACCESS_FINE_LOCATION
.
إنشاء الملفات والوصول إليها
يتيح لك نظام التشغيل Android إنشاء الملفات والوصول إليها بدون الحاجة إلى الإفصاح عن أي أذونات متعلقة بمساحة التخزين أو أجهزة الاستشعار.
فتح ملفات الوسائط
قد يسمح تطبيقك للمستخدمين بالاختيار من بين صورهم وفيديوهاتهم، مثلاً لإرفاقها بالرسائل أو استخدامها كصور للملفات الشخصية.
لاستخدام هذه الوظيفة، استخدِم أداة اختيار الصور. لا يتطلّب أداة اختيار الصور أي أذونات وقت التشغيل لاستخدامها. عندما يتفاعل المستخدم مع أداة اختيار الصور لاختيار صور أو فيديوهات لمشاركتها مع تطبيقك، يمنح النظام إذن قراءة مؤقتًا لمعرّف الموارد المنتظم (URI) المرتبط بملفات الوسائط المحدّدة.
إذا كان تطبيقك بحاجة إلى الوصول إلى ملفات الوسائط بدون استخدام أداة اختيار الصور، لن تحتاج إلى الإفصاح عن أي أذونات متعلقة بمساحة التخزين:
- إذا كنت تصل إلى ملفات الوسائط التي أنشأها تطبيقك، يكون تطبيقك قد حصل على إذن الوصول إلى هذه الملفات في متجر الوسائط.
- إذا كنت تريد الوصول إلى ملفات وسائط أنشأتها تطبيقات أخرى، عليك استخدام إطار عمل الوصول إلى مساحة التخزين.
فتح المستندات
قد يعرض تطبيقك المستندات التي أنشأها المستخدم، سواء في تطبيقك أو في تطبيق آخر، ومن الأمثلة الشائعة على ذلك ملف نصي.
في هذه الحالة، يجب الإفصاح عن
READ_EXTERNAL_STORAGE
لضمان التوافق مع الأجهزة القديمة فقط. اضبط قيمة android:maxSdkVersion
على 28
.
استنادًا إلى التطبيق الذي أنشأ المستند، نفِّذ أحد الإجراءات التالية:
- إذا أنشأ المستخدم المستند في تطبيقك، يمكنك الوصول إليه مباشرةً.
- إذا أنشأ المستخدم المستند في تطبيق آخر، استخدِم إطار عمل الوصول إلى مساحة التخزين.
التقاط صورة
قد يلتقط المستخدمون صورًا في تطبيقك باستخدام تطبيق كاميرا النظام المثبَّت مسبقًا.
في هذه الحالة، لا تطلب الإذن CAMERA
. بدلاً من ذلك، استخدِم إجراء النية
ACTION_IMAGE_CAPTURE
.
تسجيل فيديو
قد يسجّل المستخدمون فيديوهات في تطبيقك باستخدام تطبيق كاميرا النظام المثبَّت مسبقًا.
في هذه الحالة، لا تطلب الإذن CAMERA
. بدلاً من ذلك، استخدِم إجراء النية
ACTION_VIDEO_CAPTURE
.
تحديد الجهاز الذي يتم تشغيل نسخة من تطبيقك عليه
قد تحتاج نسخة معيّنة من تطبيقك إلى معرفة الجهاز الذي يتم تشغيلها عليه. ويكون ذلك مفيدًا للتطبيقات التي تتضمّن إعدادات مفضّلة أو رسائل خاصة بالأجهزة، مثل قوائم تشغيل مختلفة لأجهزة التلفزيون والأجهزة القابلة للارتداء.
في هذه الحالة، لا يمكنك الوصول إلى رمز IMEI للجهاز مباشرةً. في الواقع، لا يمكنك إجراء ذلك على الإصدار 10 من نظام التشغيل Android والإصدارات الأحدث، ولكن يمكنك اتّخاذ أحد الإجراءات التالية:
- احصل على معرّف فريد للجهاز خاص بمثيل تطبيقك باستخدام مكتبة Instance ID.
- أنشئ معرّفًا خاصًا بك يقتصر نطاقه على مساحة تخزين تطبيقك. استخدام وظائف النظام الأساسية، مثل
randomUUID()
الإقران بجهاز عبر البلوتوث
قد يوفّر تطبيقك تجربة محسّنة من خلال نقل البيانات إلى جهاز آخر عبر البلوتوث.
لإتاحة هذه الوظيفة، لا تُدرِج الأذونات ACCESS_FINE_LOCATION
أو ACCESS_COARSE_LOCATIION
أو BLUETOOTH_ADMIN
. بدلاً من ذلك، استخدِم إقران الأجهزة المرافقة.
إدخال رقم بطاقة دفع تلقائيًا
توفّر "خدمات Google Play" مكتبة تتيح لك إدخال رقم بطاقة الدفع تلقائيًا. بدلاً من تعريف إذن CAMERA
، يمكنك استخدام مكتبة التعرّف على بطاقات السحب الآلي وبطاقات الائتمان.
إدارة المكالمات الهاتفية والرسائل النصية
توفّر خدمات Android وGoogle Play مكتبات تتيح لك إدارة المكالمات الهاتفية والرسائل النصية بدون الحاجة إلى الإفصاح عن أي أذونات ذات صلة بالمكالمات الهاتفية أو الرسائل القصيرة.
إدخال رمز مرور صالح لمرة واحدة تلقائيًا
لتبسيط عملية المصادقة الثنائية، قد يملأ تطبيقك تلقائيًا رمز المرور الصالح لمرة واحدة الذي يتم إرساله إلى جهاز المستخدم لإثبات هويته.
لإتاحة هذه الوظيفة على الأجهزة التي تعمل بخدمات Google Play، لا تُدرِج الإذن READ_SMS
في البيان. بدلاً من ذلك، استخدِم SMS Retriever
API.
على الأجهزة الأخرى، إذا كان تطبيقك يستهدف الإصدار 8.0 من نظام التشغيل Android (المستوى 26 لواجهة برمجة التطبيقات) أو إصدارًا أحدث، يمكنك إنشاء رمز مميّز خاص بالتطبيق باستخدام createAppSpecificSmsToken()
. مرِّر الرمز المميّز إلى تطبيق أو خدمة أخرى يمكنها إرسال رسالة SMS لإثبات الملكية.
إدخال رقم هاتف المستخدم تلقائيًا
لتقديم مبيعات أو دعم أكثر فعالية، قد يسمح تطبيقك للمستخدم بإدخال رقم هاتفه تلقائيًا.
لإتاحة هذه الوظيفة على الأجهزة التي تعمل بخدمات Google Play، لا تُدرِج الإذن READ_PHONE_STATE
في البيان. يمكنك بدلاً من ذلك استخدام مكتبة Phone Number
Hint.
فلترة المكالمات الهاتفية
لتقليل الانقطاعات غير الضرورية للمستخدم، قد يفلتر تطبيقك المكالمات الهاتفية بحثًا عن المكالمات غير المرغوب فيها.
لإتاحة هذه الوظيفة، لا تُدرِج الإذن READ_PHONE_STATE
.
استخدِم واجهة برمجة التطبيقات
CallScreeningService
بدلاً من ذلك.
إجراء مكالمات هاتفية
قد يوفّر تطبيقك إمكانية إجراء مكالمة هاتفية من خلال النقر على معلومات جهة اتصال.
لاستخدام هذه الوظيفة، استخدِم إجراء النية ACTION_DIAL
بدلاً من الإجراء ACTION_CALL
. يتطلّب تطبيق ACTION_CALL
الإذن CALL_PHONE
الذي يتم منحه أثناء التثبيت، ما يمنع تثبيت تطبيقك على الأجهزة التي لا يمكنها إجراء المكالمات، مثل بعض الأجهزة اللوحية.
إيقاف الوسائط مؤقتًا عند مقاطعة تطبيقك
إذا تلقّى المستخدم مكالمة هاتفية أو حدث تنبيه ضبطه المستخدم، يجب أن يوقف تطبيقك أي وسائط قيد التشغيل مؤقتًا إلى أن يستعيد تطبيقك تركيز الصوت.
لإتاحة هذه الوظيفة، لا تُدرِج الإذن READ_PHONE_STATE
. بدلاً من ذلك، استخدِم معالج الأحداث
onAudioFocusChange()
، الذي يتم تنفيذه تلقائيًا عندما يغيّر النظام تركيز الصوت.
مزيد من المعلومات حول كيفية تنفيذ ميزة "تركيز الصوت"
مسح الرموز الشريطية ضوئيًا
يتضمّن Android إمكانية استخدام Google Code Scanner API، الذي توفّره "خدمات Google Play"، ما يتيح لك فك ترميز الرموز الشريطية بدون الحاجة إلى منح أي أذونات لاستخدام الكاميرا. تساعد واجهة برمجة التطبيقات هذه في الحفاظ على خصوصية المستخدمين وتقلّل من احتمالية الحاجة إلى إنشاء واجهة مستخدم مخصّصة لحالة استخدام مسح الرموز الشريطية.
تفحص واجهة برمجة التطبيقات الرمز الشريطي وتعرض نتائج الفحص فقط في تطبيقك. تتم معالجة الصور على الجهاز، ولا تخزّن Google أي بيانات أو نتائج فحص.
إذا كان تطبيقك يحتاج إلى دعم حالات استخدام أو تنسيقات رموز شريطية معقّدة، أو إذا كان يتطلّب واجهة مستخدم مخصّصة، استخدِم واجهة برمجة التطبيقات لمسح الرموز الشريطية في ML Kit بدلاً من ذلك.
إعادة ضبط الأذونات غير المستخدَمة
يوفّر نظام التشغيل Android طرقًا متعدّدة لإعادة ضبط أذونات وقت التشغيل غير المستخدَمة إلى حالتها التلقائية، أي حالة الرفض.
اطّلِع على إرشادات التصميم.
طلب أذونات التشغيل
بعد تقييم احتياجات تطبيقك من حيث الإفصاح عن أذونات وقت التشغيل وطلبها، اتّبِع سير عمل محدّدًا لإجراء ذلك.
اطّلِع على إرشادات التصميم.
توضيح سبب احتياج تطبيقك إلى أذونات
يؤدي استخدام requestPermissions()
إلى عرض مربّع حوار يشير إلى الأذونات التي يريد تطبيقك استخدامها بدون توضيح السبب، ما قد يثير استغراب المستخدم.
لمزيد من التفاصيل والاقتراحات حول كيفية عرض مربّع الحوار هذا ومتى يجب عرضه، يُرجى الاطّلاع على إرشادات التصميم.
التعامل مع حالات رفض الأذونات
يجب أن يساعد تطبيقك المستخدمين في فهم الآثار المترتبة على رفض منح أحد الأذونات، وذلك قبل وبعد اتّخاذهم هذا القرار.
اطّلِع على إرشادات التصميم.