Android 13(SDK33)下Karumi Dexter READ_EXTERNAL_STORAGE权限失效问题
问题解决:Android 13(SDK33)下无法获取视频文件权限
核心原因
Android 13(API 33)对媒体权限做了拆分,原有的READ_EXTERNAL_STORAGE权限不再适用于视频等媒体文件访问,需要使用专门的READ_MEDIA_VIDEO权限。同时,直接请求旧权限在API33+设备上不会触发权限弹窗,导致权限申请逻辑失效。
修复步骤
1. 更新AndroidManifest权限声明
在AndroidManifest.xml中同时添加兼容低版本和API33的权限:
<!-- 兼容SDK32及以下版本 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- SDK33及以上版本访问视频文件需要的权限 --> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
2. 修改权限请求逻辑
根据系统版本动态选择要申请的权限,修改ChooseVideo()方法:
private void ChooseVideo() { String permission; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // Android 13及以上,使用READ_MEDIA_VIDEO permission = Manifest.permission.READ_MEDIA_VIDEO; } else { // 低版本使用旧权限 permission = Manifest.permission.READ_EXTERNAL_STORAGE; } Dexter.withContext(this) .withPermission(permission) .withListener(new PermissionListener() { @Override public void onPermissionGranted(PermissionGrantedResponse response) { Intent intent = new Intent(); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("video/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, 102); } @Override public void onPermissionDenied(PermissionDeniedResponse response) { // 可添加权限被拒绝后的提示逻辑,比如引导用户去设置开启权限 } @Override public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) { token.continuePermissionRequest(); } }).check(); }
3. 修复onActivityResult中的语法错误
原代码中if (requestCode==102 &resultCode==RESULT_OK);末尾多了分号,导致后续代码无论条件是否成立都会执行,容易引发空指针异常,修改为:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 102 && resultCode == RESULT_OK && data != null) { videoUri = data.getData(); binding.VideoViewAVA.setVisibility(View.VISIBLE); binding.VideoViewAVA.setVideoURI(videoUri); Cursor mCursor = getApplicationContext().getContentResolver().query(videoUri, null, null, null, null); if (mCursor != null) { int indexedName = mCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); mCursor.moveToFirst(); songName = mCursor.getString(indexedName); finalSongTitle = songName.replace(".mp4", "") .replace(".wmv", "") .replace(".webm", "") .replace(".mkv", ""); mCursor.close(); binding.btnUploadVideo.setEnabled(true); binding.vTitle.setText(finalSongTitle); } } }
额外添加了data != null和mCursor != null的空判断,避免空指针崩溃。
内容的提问来源于stack exchange,提问作者MD MEHEDI FAKIR
相关产品推荐
相关产品推荐

