安卓6.0之后权限申请机制有了改变,在6.0之前,我的的权限申请只要在Manifest文件中用uses-permission写出我们需要的权限就可以了,但是6.0之后我们不仅要在Manifest中声明要使用的权限,还要在使用这些权限的时候征得用户同意,也就是会有弹窗提示我们要使用某某权限,弹窗并不是主动弹出的,是我们动态请求(requestPermission)权限弹出的,如果我们不申请直接使用在6.0以后会直接报错,只有用户同意了我们才能使用这些权限。当然并不是所有的权限都需要征得用户同意,只是一些危险权限才需要动态申请,比如读取短信、读写sd卡等,还有了权限组的概念,当权限组被允许了,组内的所有权限都会获得权限。当用户拒绝是哟个权限之后并且不再提醒我们就需要用户手动去应用中允许权限了,同意之后下次默认获取权限点击这里查看危险权限
申请权限的封装
public class BaseActivity extends AppCompatActivity {
public static final int EXTERNAL_STORAGE_PERMISSION=0x01;//读写SD卡requestcode
public static final int CAMERA_PERMISSION=0x02;//请求相机权限requestcode
//检查是否有相应权限
public boolean hasPermission(String... permissions){
for (String permission : permissions){
if (ContextCompat.checkSelfPermission(this,permission)!= PackageManager.PERMISSION_GRANTED){
return false;
}
}
return true;
}
//请求权限
public void requestPermission(int requestCode,String... permissions){
//6.0之后才需要动态申请
if (Build.VERSION.SDK_INT>=23){
requestPermissions(permissions,requestCode);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case EXTERNAL_STORAGE_PERMISSION:
if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
//同意权限申请
doSDCard();
}else {
}
break;
case CAMERA_PERMISSION:
if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){
//同意权限申请
doCamera();
}else {
}
break;
}
}
//读写SD卡业务逻辑,由具体的子类重写
public void doSDCard(){}
public void doCamera(){}
}
使用
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//如果涌泉权限直接执行,没有就申请
if (hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
}else {
requestPermission(EXTERNAL_STORAGE_PERMISSION,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE});
}
}
@Override
public void doSDCard() {
super.doSDCard();
}
}