概述
一直都知道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手机上运行,不出所料的崩溃了:
崩溃的原因很清除,因为没有获取到对应的权限,这样就引起了一个问题,为什么在我的工作项目中,对于这种权限的调用就没有出现崩溃呢?原因就在于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
的版本有关。
后续工作
gradle
中compileSdkVersion
、targetSdkVersion
、minSdkVersion
的关系。- Android运行时机制到底是如何和目标机器版本和
targetSdkVersion
相关联的。