Android运行时权限

概述

一直都知道Android 6.0 以后引入了运行时权限的概念,但在项目中每次都是在AndroidManifest里面声明权限了即可,并没有实际接触到运行时权限,所以对这个概念一直都不是很理解,所以下面就参考《第一行代码》中的例子说明一下这个问题。

代码示例

首先在AndroidManifest中声明权限:

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

之后在Activity中请求打电话的功能:

 findViewById(R.id.call_btn).setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
         Intent intent = new Intent(Intent.ACTION_CALL);
         intent.setData(Uri.parse("tel:10086"));
         startActivity(intent);
     }
 });

同时,查看gradle中的配置

    compileSdkVersion 26
    defaultConfig {
        applicationId "com.example.lwz15.runtimetest"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

运行结果

之后,在我的小米MIX 2手机上运行,不出所料的崩溃了:
运行结果1

崩溃的原因很清除,因为没有获取到对应的权限,这样就引起了一个问题,为什么在我的工作项目中,对于这种权限的调用就没有出现崩溃呢?原因就在于gradle中设置的targetSdkVersion的问题,试着把TargetVersion改成21,也就是Android 6.0版本之前:

    compileSdkVersion 26
    defaultConfig {
        applicationId "com.example.lwz15.runtimetest"
        minSdkVersion 21
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

改成这样以后,在小米8上面运行就不会出现崩溃了。

结论

可以看出Android 6.0以后引入的运行时权限的限制,不仅和目标机器的Android版本有关,还和targetSdkVersion的版本有关。

后续工作

  1. gradlecompileSdkVersiontargetSdkVersionminSdkVersion的关系。
  2. Android运行时机制到底是如何和目标机器版本和targetSdkVersion相关联的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值