什么时候需要请求权限
android6.0推出了新的权限管理机制,因为公司项目原因,一直没有进行适配,今天正好碰到一个需要适配的插件,这里记录一下。
谷歌官方上的说法:如果设备运行的是 Android 6.0(API 级别 23)或更高版本,并且应用的 targetSdkVersion 是 23 或更高版本,则应用在运行时向用户请求权限。 也就是说,我们可以把 targetSdkVersion调到23以下就可以避免在运行时请求权限,这个方法有点取巧,而且在某些国产手机上面是行不通的,还得运行时获取权限。
权限分类
6.0把权限分为正常权限、危险权限、特殊权限。
正常权限我们在AndroidManifest.xml声明即可;危险权限必须由用户明确向应用授予该权限;特殊权限,其行为方式与正常权限及危险权限都不同。SYSTEM_ALERT_WINDOW 和 WRITE_SETTINGS 特别敏感,因此大多数应用不应该使用它们。如果某应用需要其中一种权限,必须在清单中声明该权限,并且发送请求用户授权的 intent。系统将向用户显示详细管理屏幕,以响应该 intent。
权限申请
其实权限申请的过程很简单,这里就直接上代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//检测权限
int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permissionCheck == PackageManager.PERMISSION_GRANTED){
//已经获取到了权限
} else if (permissionCheck == PackageManager.PERMISSION_DENIED){
//没有获取到权限
//下面这段代码这样写是为了区分这两个方法的作用
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)){
//已经向用户请求过一次权限,但是被拒绝,在这里可以向用户解释获取此权限的作用
//这里依然请求权限
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},100);
} else {
//第一次请求权限
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},100);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 100:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
//用户授予了权限
} else {
//拒绝了权限
}
break;
}
}
}
权限组
6.0中还有一个权限组的概念,比如读sdcard和写sdcard是一个权限组,我们只要获取了其中一个的权限,那么我们用另一个权限的时候会自动授权