Enforcing Permissions in AndroidManifest.xml
High-level permissions restricting access to entire components of the
system or application can be applied through your
AndroidManifest.xml
. All that this requires is including an android:permission attribute on the desired
component, naming the permission that will be used to control access to
it.
Activity permissions
(applied to the
<activity> tag)
restrict who can start the associated
activity. The permission is checked during
Context.startActivity() and
Activity.startActivityForResult();
if the caller does not have
the required permission then SecurityException is thrown
from the call.
Service permissions
(applied to the
<service> tag)
restrict who can start or bind to the
associated service. The permission is checked during
Context.startService(),
Context.stopService() and
Context.bindService();
if the caller does not have
the required permission then SecurityException is thrown
from the call.
BroadcastReceiver permissions
(applied to the
<receiver> tag)
restrict who can send broadcasts to the associated receiver.
The permission is checked after
Context.sendBroadcast() returns,
as the system tries
to deliver the submitted broadcast to the given receiver. As a result, a
permission failure will not result in an exception being thrown back to the
caller; it will just not deliver the intent. In the same way, a permission
can be supplied to
Context.registerReceiver()
to control who can broadcast to a programmatically registered receiver.
Going the other way, a permission can be supplied when calling
Context.sendBroadcast()
to restrict which BroadcastReceiver objects are allowed to receive the broadcast (see
below).
ContentProvider permissions
(applied to the
<provider> tag)
restrict who can access the data in
a ContentProvider. (Content providers have an important
additional security facility available to them called
URI permissions which is described later.)
Unlike the other components,
there are two separate permission attributes you can set:
android:readPermission restricts who
can read from the provider, and
android:writePermission restricts
who can write to it. Note that if a provider is protected with both a read
and write permission, holding only the write permission does not mean
you can read from a provider. The permissions are checked when you first
retrieve a provider (if you don't have either permission, a SecurityException
will be thrown), and as you perform operations on the provider. Using
ContentResolver.query() requires
holding the read permission; using
ContentResolver.insert(),
ContentResolver.update(),
ContentResolver.delete()
requires the write permission.
In all of these cases, not holding the required permission results in a
SecurityException being thrown from the call.