Restricting Android Broadcast Receiver from specific app
android, android-permissions, broadcastreceiver
Solution
The tag can also define what permission the broadcasters should have, see http://developer.android.com/guide/topics/manifest/receiver-element.html#prmsn
I means you can protected your receiver from unauthorized broadcasts by coding like this:
...
<permission android:name="com.yourapp.PERMISSION"
android:protectionLevel="signature"
android:label="@string/permission_label"
android:description="@string/permission_desc">
</permission>
...
<receiver android:name=".MyReceiver"
android:permission="com.yourapp.PERMISSION">
<intent-filter>
<action android:name="com.yourapp.ACTION" />
</intent-filter>
</receiver>
...
Problem
I have 2 applications. If I use service, I can set permission so only `app1` can send intent to `app2`: Define permission in `app2` (`protection level: signature`), and use that permission in `app1`. Service in `app2` is protected by that permission. In this way, only `app1` can send an intent to a service on `app2`, and no other app (unless my signature is leaked) can send intent to service on `app2`. Can I do the same with Broadcast Receiver? - app1: sendBroadcast(intent, permission) - app2: define permission, use that permission. To my understanding for using sendBroadcast(intent, permission), the application doesn't need to "use" the permission. Meaning ANY application can send intent to `app2`. Those permission parameters only checked against `app2`, to avoid other applications to receive this intent. (If I remove `app2`, and install fake `app2` with the same permission string defined, fake `app2` can get intent from `app1`, which is unexpected) BTW, If application define the permission and use it itself, the protectionLevel(signature) seems to have no meaning. Is this true? Now, I can set additional permission: - app1: Define permission, use that permission. - app2: Receiver restricted only for that permission. Again, if one removes `app1`, installs fake `app1` with the very same permission, then fake `app1` can send fake intent to `app2`. What can I do to prevent `app2` from receiving fake intent? Thanks