You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:52:36