Android自定义权限permission

    Android是一种特权分隔的操作系统,在Android上运行的每个应用程序都具有各自独立的系统标识(Linux用户ID和组ID)。系统各部分有不同的身份标识。因此,Linux上运行的各个应用程序相互独立且与系统无关。


    Android的“权限许可”机制通过限定特定的进程能够执行的指定操作和限定对每一个资源点对点的访问的URI许可来提供附加细粒度的安全功能。


    由于内核让每个应用程序运行在独立的沙盒中,应用程序必须通过声明所需要而沙盒没有提供的权限来明确的分配资源和数据。Android没有采用会使用户体验复杂并且不利于安全的动态授权机制。应用程序静态的声明他们所需要的权限,在程序安装时Android系统会提示用户同意它们获取这些权限。


   Android权限模型是基于如下两个目标而设计的:
通知用户:

    通过列出应用程序可能执行的所有敏感的操作,让用户更多地意识到安装这个应用存在的潜在风险。这假定用户会阅读在安装时弹出的权限列表,并基于这些信息来作出是否安装应用的决定。
降低风险:
    通过限制应用程序访问Android系统敏感的API接口,来降低应用程序对整个系统带来的伤害(比如病毒)。


   Android权限被分为四个等级:
普通级:

    这些权限并不能真正伤害到用户(比如更换壁纸),当程序需要这些权限是,开发者不需要指定程序会自动赋予这些权限。
危险级:

    这些权限可能会带来真的伤害(比如打电话,打开网络链接等),如果要使用它们需要开发者在AndroidManifest.xml中声明对应的权限。
签名级:

    如果应用使用的是相同的签名证书时,这些权限会自动授予给声明或者创建这些权限的程序。设计这一层级权限的目的是方便组件间数据共享。
签名/系统级:

    和签名级一样,例外的是系统镜像是自动获取这些权限的,这一层级是专为设备制造商设计的。


    在开发Android应用程序的过程中,如果我们要使用系统的某些服务(比如网络、待机、读写文件权限等)都需要首先像下面这样在AndroidManifest.xml中声明对应的权限,然后才可以在代码中访问这些服务:

<!-- 文件读写权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />

    <!-- 访问网络的权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    
    <!-- 屏幕唤醒权限 -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.DEVICE_POWER" />
    同样,除了能够使用Android系统提供的各种权限外,我们还可以自定义权限来限制其它程序访问应用的各种服务或者组件。任何程序想要和此程序的组件交互时,都需要声明相应的权限时才能成功地访问。


自定义权限步骤如下:

    以为一个服务CalledService定义访问权限为例,具体步骤如下:

1、在被调用程序Called的AndroidManifest.xml文件中作如下定义:

<!-- Service Permission -->
    <permission
        android:name="com.uperone.permission.SERVICE"
        android:label="@string/app_name"
        android:permissionGroup="@string/app_name"
        android:protectionLevel="normal" >
    </permission>

关于各标签属性的意义自行脑补,都是见名知意。

<service
            android:name="com.uperone.called.service.CalledService"
            android:permission="com.uperone.permission.SERVICE">
            <intent-filter>
                <action android:name="com.uperone.action.SERVICE" />
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </service>

2、在需要调用该组件的应用程序Call工程的AndroidManifest.mxl文件中声明对应的权限:

<uses-permission android:name="com.uperone.permission.SERVICE" />

3、在需要调用该组件的应用程序Call工程中启动、停止改服务:

case R.id.startServiceBtnId:{
			Intent intent = new Intent( "com.uperone.action.SERVICE" );
			startService(intent);
		}
		break;
特别注意:如果在调用需要权限的组件时没有在Manifest.xml中声明权限,则会在运行对应代码段时报异常!!!!

更多组件自定义权限参见实例:Android自定义权限permission


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。