Tuesday, May 7, 2013

[android-developers] Re: Exported receiver does not require permission - what should I do with BOOT receivers

Exactly - I consider it perfectly fine to request a permission for _receiving_ - and I do exactly this :

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
But I have no <permission> attribute in the manifest - so the relevant quote from the docs :

"The name of a permission that broadcasters must have to send a message to the broadcast receiver. If this attribute is not set, the permission set by the <application> element's permission attribute applies to the broadcast receiver. "

Does not really apply. So it is strange that no warning is issued

Quick tests (as in I just changed the Manifest - did not uninstall reinstall) suggest that android:exported="false" does not make a difference - adding android:exported="false" does not prevent the system from calling my receiver (Froyo)

Quick
tests

BTW - there is a bug with android.permission.RECEIVE_BOOT_COMPLETED" - still NEW http://code.google.com/p/android/issues/detail?id=14044

On Monday, May 6, 2013 1:26:26 AM UTC+3, Piren wrote:
Why not ask for a permission for receiving? that's the same as there are permissions for reading contacts or call logs... the idea is to inform the user your app is doing something that they might not want to happen, like informing you the device just powered on which can be used to start an app without them knowing. Permissions aren't just for modifying things.
 
You don't define permission for the broadcaster since that broadcast is a system broadcast...

On Monday, May 6, 2013 1:13:27 AM UTC+3, Palmer Eldritch wrote:
What confuses me really is that I request a permission for _receiving_ a particular intent (whose action is boot_completed) - I do not define anywhere a permission the _broadcaster_ must request/hold

Thanks

PS : testing vs asking - I found about the android.intent.action.QUICKBOOT_POWERON permission while browsing for an answer to this question - don't think I need it but added it :)

On Monday, May 6, 2013 12:18:25 AM UTC+3, Piren wrote:
I'm not 100% positive only the system can call it, but i'm pretty sure about it. It depands on the security level of that specific permission and these are not easy to find out (i can't recall any documentation that lists that.. i think it is only available in the source code). It's something that you need to remember, some of these calls can only be made by the system... some of these, were only blocked to be system only in later versions of android (and as usual, there's barely any documentation of these) so sometimes code that worked before, just stops working.
 
To test Boot_Completed, just restart your device. that's why i did, that's also how i found our some HTC devices require you to also use "android.intent.action.QUICKBOOT_POWERON" (another tip ;-)) and don't forget you need the app to run at least once before (yet another tip :-D) 
 
If you want 0 warnings, tell the compiler to stop showing them :)
 
 
On Sunday, May 5, 2013 11:07:12 PM UTC+3, Palmer Eldritch wrote:

On Sunday, May 5, 2013 6:58:39 PM UTC+3, Piren wrote:
Did you read the answer you quoted?
"IF you didnt set any permissions for it."

And back to my first answer, had you read the docs you would have seen this:
"The name of a permission that broadcasters must have to send a message to the broadcast receiver. If this attribute is not set, the permission set by the <application> element's permission attribute applies to the broadcast receiver. "

Now, you didn't provide the Permission attribute of you manifest (nor the Uses-Permissions), but i'd bet a pretty penny that it has receive_boot_completed there...since you know.. it doesn't work without it.
 
This makes sense - so since I ask for receive_boot_completed the system checks my intent filter, sees the intent I filter for is "android.intent.
action.BOOT_COMPLETED" and automatically applies this permission to my receiver ? So this receiver _requires permission_ and no warning is issued
That is not so straightforward - does it mean that only the system can call my receiver ?
 

BTW, some of the questions are just plain annoying which is why i ignored them and just let you figure it out yourself with the docs... "Does it mean that it won't work if exported="false" ?"  Why are you asking us? Instead of posting a question about it, isn't it easier to just do a quick test instead of relying on the memory of other people?  You already have the code ready.. just run the damn thing and check.
I could test in this case yes - but i wanted a general answer on all similar intent filters and moreover i have no other app to call my receiver from - it's not a quick test
 

Also, considering this is only a warning, you're giving it way too much emphasis.
 
I disagree - I do pay attention to warnings - I want none :)


On Sunday, May 5, 2013 6:29:52 PM UTC+3, Palmer Eldritch wrote:
Did you read the question ?

"
If Exported=True or Exported is not set and it has an Intent Filter, you get a warning saying you didn't specify any permissions for it IF you didnt set any permissions for it.
"

I HAVE an intent filter and I get NO warning - I have posted the manifest and specific questions
Please read before posting - I feel a bit offended being redirected to the docs after the effort I put in asking this

On Sunday, May 5, 2013 10:22:07 AM UTC+3, Piren wrote:
Did you read the docs? what's not to get here?
http://developer.android.com/guide/topics/manifest/receiver-element.html#prmsn

If Exported=False or not set and no IntentFilter, only your app can access it so it needs no permissions thus no warning.
If Exported=True or Exported is not set and it has an Intent Filter, you get a warning saying you didn't specify any permissions for it IF you didnt set any permissions for it.



On Saturday, May 4, 2013 3:47:06 PM UTC+3, Palmer Eldritch wrote:
Still interested in this

1. Why there is no warning :

    <receiver <!-- no warning -->
        android:name=".receivers.TriggerMonitoringBootReceiver"
        android:enabled="false" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

Does it mean that it won't work if exported="false" ? In this case :

2. Which intents are meant to be exported with no warnings ? All the intents in android.intent.action. namespace ?

There are reports that contradict that - adding to general confusion.
See for instance :

http://stackoverflow.com/questions/11462936/exported-activity-does-not-require-permission-when-attempting-to-launch-from-a/11526028#comment18783318_11526028
http://stackoverflow.com/questions/11875371/what-permission-should-i-use-to-receiver-of-android-notitications#comment15822652_11875525
http://stackoverflow.com/questions/13517128/android-onbootreceiver-exported-receiver-does-not-require-permission#comment23027535_13517128
http://stackoverflow.com/questions/16112470/android-exported-receiver-does-not-require-permission-on-receivers-meant-to
http://stackoverflow.com/a/12180426/281545
http://stackoverflow.com/questions/12718231/making-nfc-activity-private-without-androidexported-false
http://stackoverflow.com/questions/14381807/how-to-stop-opening-the-application-from-other-application-in-android/14381976#14381976

As you see both black and white are true so I would appreciator some official feedback
In short - when one has receivers that receive System intents like "android.intent.action.BOOT_COMPLETED" and "android.net.wifi.SCAN_RESULTS" - setting the `exported="false"` will prevent the receivers from working ? Is this the reason why "Exported receiver does not require permission" warning is not displayed ? Which intents fall into this category ?

Thanks :)

On Saturday, April 20, 2013 3:44:52 PM UTC+3, Palmer Eldritch wrote:
I have the following receivers declared :
<pre>
    <receiver <!-- no warning -->
        android:name=".receivers.TriggerMonitoringBootReceiver"
        android:enabled="false" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
    <receiver <!-- no warning -->
        android:name=".receivers.ScanResultsReceiver"
        android:enabled="false" >
        <intent-filter>
            <action android:name="android.net.wifi.SCAN_RESULTS" />
        </intent-filter>
    </receiver>
</pre>

These receivers are exported - right ? If I put `exported="false"` would they still be able to work ?

Thanks

--
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
---
You received this message because you are subscribed to the Google Groups "Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to android-developers+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

No comments:

Post a Comment