zoukankan      html  css  js  c++  java
  • Android自定义权限与使用*

    1. 如何自定义权限

    Android允许我们使用permission标签,在Manifest文件中定义属于自己的权限,一个例子如下,

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.zlp.myapplication">
    
        <permission
            android:name="paul.permission.TEST"
            android:description="@string/permdesc_deadlyActivity"
            android:permissionGroup="paul.permission-group.TEST"
            android:protectionLevel="signature" />
    
    
        ...
    </manifest>

    有一点需要注意,就是permission是位于manifest标签下,和application标签同级的。千万不要将其放在application标签下哦。

    对permission标签的各个属性大概说明一下, 
    1. name,该标签就是权限的名字啦。 
    2. description,该标签就是权限的介绍。 
    3. permissionGroup,指定该权限的组。 
    4. protectionLevel,指定保护级别。

    Android将权限分为若干个保护级别,normal, dangerous, signature等。normal就是正常权限,该权限并不会给用户或者设备的隐私带来风险;dangerous就是危险权限,该级别的权限通常会给用户的数据或设备的隐私带来风险;signature指的是,只有相同签名的应用才能使用该权限。更多的介绍可以参考protectionLevel

    还有一点重要的是,Android不允许两个不同的应用定义一个相同名字的权限(除非这两个应用拥有相同的签名),所以在命名的时候,需要注意哦。

    2. 使用自定义的权限,将某个组件暴露出去

    我们知道,Android允许一个应用(客户端)调用另一个应用(服务端)的组件。那么作为服务端的应用就得暴露相应的组件,客户端应用才能访问。当然,在暴露的时候,权限是非必须的,如果暴露的组件没有权限的话,那么任何的其他应用都可以来调用该组件;如果该组件申请了权限,那么只有拥有该权限的应用才能调用该组件。

    正常情况下,我们可以这样来暴露自己的组件,以Activity为例,

            <activity
                android:name=".PrivateActivity"
                android:exported="true"
                android:label="@string/title_activity_private"/>

    exported属性就是代表是否暴露。该例子并没有要求调用者需要申请权限,也就是说,任何的应用就可以调用才组件。

    如果没个应用都可以调用我们的组件的话,显然是不安全的,我们希望只有使用了我们的权限的应用,才能调用我们暴露的组件,我们可以在activity中加入permission属性,如下,

            <activity
                android:name=".PrivateActivity"
                android:exported="true"
                android:label="@string/title_activity_private"
                android:permission="paul.permission.TEST" />

    这样,我们就给该暴露的activity加入了权限,只有申请了paul.permission.TEST权限的应用,才能调用该activity。

    3. 如何使用权限,调用暴露的组件

    在2中,我们介绍了,服务端应用如何将自己的组件暴露出去,并使用自定义的权限保护该组件。本小节介绍如何编写客户端应用,访问该暴露组件。

    首先,由于暴露的组件是需要权限的,我们需要在manifest文件中申请该权限,该权限的使用和Android提供的权限的使用是一样的,均为使用uses-permission标签。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.zlp.clientapplicant">
        <uses-permission android:name="paul.permission.TEST" />
            ...
    </manifest>

    然后,我们使用代码来调用暴露的组件,以2中的activity为例,

    Intent intent = new Intent();
    intent.setClassName("com.example.zlp.myapplication", "com.example.zlp.myapplication.PrivateActivity");
    startActivity(intent);

    我们使用隐式Intent来调用暴露的activity,注意setClassName的第一个参数是完整的包名,第二个参数是完整的activity类名(包括包名)。

    如果我们没有申请相应的权限,就调用需要权限的暴露组件的话,会抛出一个没有申请权限的异常。

    流程总结起来:

    1. 先在需要自定义权限的应用的AndroidManifest中定义所需的权限,然后在想要设置权限的activity中通过标签android:permission配置。
    2. 在需要申请权限的应用的AndroidManifest中通过<use-permission 标签声明所需的权限,然后根据该权限的保护等级作出相应的操作,比如通过运行时权限机制获取。
  • 相关阅读:
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit  atiMail atiDns新特性 v2  q39
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit.aticmd v4  新特性q39 添加定时器释放功能
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31
    知也atitit.解决struts2 SpringObjectFactory.getClassInstance NullPointerException  v2 q31无涯 - I
  • 原文地址:https://www.cnblogs.com/chenxibobo/p/9610366.html
Copyright © 2011-2022 走看看