تطوير Android / دليل حلول تحريري
تشخيص رفض الأذونات والإشعارات المفقودة
افصل API الجهاز وسلوك الاستهداف ومنح التشغيل وقنوات الإشعار قبل تغيير مسار الأذونات.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
تتوقف الكاميرا بعد العودة من الإعدادات أو لا يظهر طلب الإذن أو تبقى التذكيرات مخفية بعد المنح. قد يختلف الإشعار بين التثبيت الجديد والجهاز المرقى. سجل API الجهاز وtargetSdk وتاريخ التثبيت والإجراء الذي يطلب الوصول والمنح وحالة القناة. لا تفسر لقطة حوار واحد التكامل كاملاً.
افهم الأسباب المحتملة
- لا يمنح إعلان manifest إذناً خطيراً أثناء التشغيل. يمكن سحب المنح ويغير تكرار الرفض سلوك الطلب وتصبح قيمة منطقية مخزنة قديمة. للإشعارات بوابات إضافية: POST_NOTIFICATIONS على API 33+ وإعداد التطبيق والقنوات على API 26+ وضبط النشر الصحيح. INTERNET إذن عادي ولا يخلط بمسار طلب الأذونات الخطيرة.
افحص مسار الواجهة والإعلان
حدد هل تحتاج الميزة الإذن فعلاً. يوفر منتقي النظام صوراً مختارة دون وصول واسع، ويختلف عقد التقاط خارجي عن فتح الكاميرا مباشرة. افحص manifest المدمج للإعلان المحدد. ثم افحص الإذن الحالي قبل العملية المحمية مباشرة. عند غياب الوصول اعرض حالة عدم توفر مدعومة بدلاً من جعل SecurityException أول إشارة. لا تستعد علم منح قديم كمرجع بعد إعادة العملية.
اطلب من إجراء مستخدم مقصود
سجل عقد إذن Activity Result بمالك دورة حياة ثابت وأطلقه عند استدعاء الميزة. اعرض مبرراً عند ملاءمته واسمح بالإلغاء وأبقِ الوظائف الأخرى متاحة. لا ترمز واجهات المبرر كل تاريخ رفض بدقة؛ فلا تفترض أن false تعني دائماً أول طلب أو رفضاً دائماً. عندما يعجز النظام عن الطلب مجدداً وفّر طريق إعدادات مفسراً عند رغبة المستخدم. تكرار الطلب بكل عرض ليس تعافياً.
افحص بوابات الإشعار منفصلة
على Android 13، أي API 33، وما بعده تحتاج الإشعارات غير المستثناة POST_NOTIFICATIONS. تتحكم الأهداف API 33+ بتوقيت الطلب مباشرة أكثر من الأقدم. على API 26+ افحص القناة المحددة؛ لا يتجاوز المنح قناة محظورة. يعرض الفحص التالي بوابة التشغيل فقط. تحقق أيضاً من إنشاء القناة وبناء الإشعار وإعداد التطبيق. لا يتطلب بدء الخدمة الأمامية هذا المنح بذاته لكن يظل عقد إشعار الخدمة واجباً.
fun notificationRuntimeGranted(context: Context): Boolean {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return true
return ContextCompat.checkSelfPermission(
context, Manifest.permission.POST_NOTIFICATIONS
) == PackageManager.PERMISSION_GRANTED
}
استخدم SDK يعرّف رموز API 33 وأعلن POST_NOTIFICATIONS واستورد ContextCompat وأصناف المنصة. تعني true على جهاز أقدم أن بوابة التشغيل غير منطبقة؛ وتبقى الإعدادات والقنوات مهمة. لا تطلب الدالة إذناً ولا تنشر إشعاراً.
تحقق من نجاح الإصلاح
تحقق منفصلاً من الرفض الأول والموافقة والسحب في الإعدادات والعودة وقناة تذكير محظورة. بعد كل انتقال نفذ الميزة وتأكد من مطابقة الواجهة للوصول الحالي. اختبر مصفوفة API واستهداف مناسبة ثم تحقق من إشعار منشور بالقناة المقصودة بدلاً من استنتاج النجاح من دالة الإذن وحدها. احترم رفض المستخدم.
امنع تكرار المشكلة
- أبقِ فحوص الإصدار قرب التكامل ووثق البوابة التي تقيمها كل دالة. اطلب أقل وصول في سياقه وحدّث حالة القدرة بعد الإعدادات واختبر الرفض مع النجاح. اربط الدعم بالميزة المحددة بدلاً من اعتبار كل فشل إشعار سبباً لطلب كل الأذونات مجدداً.