权限申请与Android版本有关
在Android6.0之前,直接在Manifest.xml文件中写入需要的权限
<uses-permission android:name="android.permission.INTERNET" />
在Android6.0之后, Android13之前,直接在Manifest.xml文件中写入权限,并且要动态申请权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
动态申请权限:
先使用ContextCompat.checkSelfPermission检查权限情况
使用 ActivityCompat.requestPermissions() 方法请求权限
在onRequestPermissionsResult中处理权限请求的结果
public class MainActivity extends AppCompatActivity {
final int REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// 这里是用户授予或拒绝权限后回调的地方
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE) {
if (grantResults.length != 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "权限开启成功", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "权限开启失败", Toast.LENGTH_LONG).show();
}
}
}
}
Android13版本
Android13之前,读取SD卡只需要申请一个权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
但Android13之后,这个权限被细化成了三个,这三个权限需要分别单独去申请。
在manifest.xml中
<!--安卓13之后读取图片权限-->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<!--安卓13之后读取视频权限-->
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<!--安卓13之后读取音频权限-->
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
如果是升级Android13之前就已经具有读写SDK的权限,那么升级到13之后,自动就会有上述三个权限。
如果是升级Android13之后新装的应用,且targetSDK小于33,申请READ_EXTERNAL_STORAGE权限时,会自动转化为对上述三个权限的申请,申请框只一个.
如果是升级Android13之后新装的应用,且targetSDK大于等于33,则申请READ_EXTERNAL_STORAGE权限时会自动拒绝(同理WRITE_EXTERNAL_STORAGE也是一样)。必须申请上面三个权限才可以。下午就是安卓13新安装APP,直接申请读写权限被拒绝.
动态请求:
String[] list = new String[10];
if (Build.VERSION.SDK_INT >=33)
list[0] = "android.permission.READ_MEDIA_IMAGES"; //图片
list[1] = "android.permission.READ_MEDIA_VIDEO"; //视频
list[2] = "android.permission.READ_MEDIA_AUDIO"; //音频
else
list[0] = Manifest.permission.READ_EXTERNAL_STORAGE;
ActivityCompat.requestPermissions(MainActivity.this, list, 000);
打开相册兼容方法:
public static void openPhotoAlbum(Activity activity)
Intent intent;
if (Build.VERSION.SDK_INT >= 33)
//安卓13以上打开相册.
intent = new Intent("android.provider.action.PICK_IMAGES");
intent.setType("images/*");//设置只显示图片
/**
* 设置选择照片的个数,默认1张时可不添加该属性,大于1的时候再设置.
* 可指定图片数量上限为最大数字,调用 MediaStore.getPickImagesMaxLimit().
*/
//intent.putExtra("android.provider.extra.PICK_IMAGES_MAX", MediaStore.getPickImagesMaxLimit());
else
intent = new Intent(Intent.ACTION_PICK);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
activity.startActivityForResult(intent, 888);
撤销权限:
- 在AndroidManifest.xml中删除准备撤销的视频和音频权限.
- 在代码中把需要撤销的权限保存到List集合,然后调用API接口即可.
if (Build.VERSION.SDK_INT >= 33)
ArrayList<String> permissions = new ArrayList<>();
permissions.add("android.permission.READ_MEDIA_VIDEO");
permissions.add("android.permission.READ_MEDIA_AUDIO");
revokeSelfPermissionsOnKill(permissions);