ذكري المظهر:هل يتم تصدير أجهزة استقبال البث المسجلة في السياق؟

StackOverflow https://stackoverflow.com//questions/11675245

سؤال

إذا قمت بتسجيل جهاز استقبال البث، فقل في نشاطي مثل هذا،

@Override
protected void onResume() {
    super.onResume();

    myReceiver = new BroadcastReceiver() { ... };
    IntentFilter filter = new IntentFilter("com.example.MY_ACTION");
    registerReceiver(myReceiver, filter);
}

هل هذا الريسيفر تصدير ؟إذا تم بث تطبيق آخر com.example.MY_ACTION, ، هل سيتم استلامه بواسطة myReceiver?

إذا كان الأمر كذلك، أفترض أنني بحاجة إلى استخدام النموذج registerReceiver() يقبل إذن سلسلة، ثم يحدد هذا الإذن في البيان الخاص بي، مما يمنحه مستوى حماية عاليًا (مثل التوقيع).هل هذا صحيح؟هل هناك طريقة أبسط؟

شكرًا.

هل كانت مفيدة؟

المحلول

من مستندات API على BroadcastReceiver API:

إذا لم تكن بحاجة إلى إرسال عمليات بث عبر التطبيقات ، ففكر في استخدام هذه الفئة مع مدير البث المحلي بدلا من المرافق الأكثر عمومية الموضحة أدناه.سيمنحك هذا تطبيقًا أكثر كفاءة (لا يلزم وجود اتصال عبر العملية) ويسمح لك بتجنب التفكير في أي مشكلات أمان تتعلق بتطبيقات أخرى تتمكن من استلام أو إرسال البث.

بهذه الطريقة على الأقل يمكنك إبقاء جهاز الاستقبال داخل التطبيق الخاص بك فقط.

نصائح أخرى

لتجنيب الآخرين العمل ولأغراض الأرشفة الخاصة بي:نعم، أجهزة الاستقبال المسجلة في السياق نكون تصديرها بشكل افتراضي.

لا يبدو أن هناك الكثير توثيق ولكن يمكنك التحقق من صحة ذلك بسرعة عن طريق تشغيل تطبيق منفصل يرسل بثًا مخصصًا.لقد اختبرت هذا على واجهات برمجة التطبيقات 16-29، سيتم استقبال البث وبالتالي ستتمكن كل حزمة من إرسالها إلى جهاز الاستقبال الخاص بك (وهو ما قد يكون ثغرة أمنية).


لحل المشكلة دون استخدام البث المحلي (ينبغي استخدامها حيثما كان ذلك ممكنا) أنت على المسار الصحيح في تحديد إذن مخصص و تقييد عمليات البث على التطبيقات التي طلبت هذا الإذن.من أجل الإنتهاء:

تحديد واستخدام إذن مخصص في البيان:

<permission android:name="com.example.bcrtest.BROADCAST_PERMISSION"
    android:protectionLevel="signature"/>
<uses-permission android:name="com.example.bcrtest.BROADCAST_PERMISSION" />

تسجيل المتلقي بإذن:

registerReceiver(mReceiver, new IntentFilter(MY_INTENT_ACTION), "com.example.bcrtest.BROADCAST_PERMISSION", null );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top