Android权限检查机制

Android权限检查机制  

  程序想要执行任何的特定操作,必须先申请权限,申请方法只需要在程序的AndroidManifest.xml中添加相应的权限代码即可。比如,在程序中使用发短信的功能,需添加:

    <uses-permission android:name = "android.permission.SEND_SMS" />

  所有可以使用的权限分为两大类:直接读写设备的底层权限(low-level)与间接读写设备的高层权限(high-level),举几个例子:

  android.permission.INTERNET权限属于底层权限,声明如下:

    <permission name = "android.permission.INTERNET" >          //name表示权限名称

      <group gid = "inet" />       //gid表示所关联的用户组

    </permission>                     //当软件声明了该权限后,运行时的进程所属的用户就会添加到inet用户组

  高层权限与底层权限不同,高层权限是通过Framework层的权限检查代码来进行权限控制的。比如权限android.permission.ACCESS_NETWORK_STATE权限:

    private boolean CheckNetworkState() {

      boolean fiag = false;

      ConnectivityManager manager = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE) ;

      if(manager.getActiveNetworkInfo() != null) {

        flag = manager.getActiveNetworkInfo().isAvailable();

      }

      return flag;

    }

  其中,CheckNetworkState()方法用于检查当前网络状态是否可用,调用的ConnectivityManager类的getActiveNetworkInfo()方法就需要使用android.permission.ACCESS_NETWORK_STATE权限。

  getActiveNetworkInfo()的实现如下:

  public NetworkInfo getActiveNetworkInfo() {

    enforceAccessPermission();

    final int uid = Binder.getCallingUid();

    return getNetworkInfo(mActiveDefaultNetwork , uid);

  }

  enforceAccessPermission()用于执行权限检查,实现如下:

  private void enforceAccessPermission() {

    mContext.enforceCallingOrSelfPermission (android.Manifest.permission.ACCESS_NETWORK_STATE , "ConnectivityService");

  }

  经分析是调用enforceCallingOrSelfPermission()方法来检查,该方法的作用是检查是否声明了访问网络状态的权限android.permission.ACCESS_NETWORK_STATE。

  根据检查的内容与处理方法的不同,将权限检查分为以下几类:

  (1)检查权限并返回结果型

  (2)检查权限失败抛出异常型

  (3)Uri权限控制型

  (4)Uri权限检查并返回结果型

  (5)Uri权限检查失败抛出异常型

posted @ 2021-10-23 18:48  Sunshine_y  阅读(747)  评论(0编辑  收藏  举报