Android 之System Permission

516 查看


每个应用都运行在自己的砂箱中,并且具有不同的UserId和进程。

  1. 签名
    每个开发者都具有自己的私有签名key,
  2. User IDs and File Access
    由于每个应用都具有自己的UserID和进程号,因此其打开的文件也都只能自己访问。若需要两个app共享文件,那么需要两个app设置shareUserId并且使用相同的签名。
  3. 使用权限
    uses-permission,声明在Manifest中
xml<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.app.myapp" >
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    ...
</manifest>
  1. 声明和强制权限
    自定义自己的权限,需要在Manifest中使用<permission>tag首先声明。如:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.me.app.myapp" >
    <permission android:name="com.me.app.myapp.permission.DEADLY_ACTIVITY"
        android:label="@string/permlab_deadlyActivity"
        android:description="@string/permdesc_deadlyActivity"
        android:permissionGroup="android.permission-group.COST_MONEY"
        android:protectionLevel="dangerous" />
    ...
</manifest>

其中description是对该权限的解释,将在用户安装App时显示。permissionGroup是表示该权限所属组,如本例中的消费金钱。protectionLevel是方便Android在安装时以何种方式通知用户,本例为危险,因为需要花钱。
可以使用Settings App查看个App的应用权限,或者使用cmd
adb shell pm list permissions -s

  1. Manifest中的强制Permission
    对四大组件均可以在其tag中设定权限,如果某个调用者无权限调用该组件,将会得到 SecurityException的异常。其中ContentProvider具有写入权限和读取权限两种。
  2. URIs Permission
    对于某些应用而言,其数据比较私密,对于不具备权限的App根本无法读取或者写入。如Email中的图片,当调用其他App来显示该图片时,由于不具备读取权限,因而报异常。因此呢,Android引入了URI权限,即在发送Intent时,附带 Intent.FLAG_GRANT_READ_URI_PERMISSION 和或者Intent.FLAG_GRANT_WRITE_URI_PERMISSION