4***@qq.com
4***@qq.com
  • 发布:2025-07-30 23:27
  • 更新:2025-08-05 15:02
  • 阅读:244

安卓13及以上部分安卓 uni.chooseImage相册无内容

分类:uni-app

现象描述:
VIVO(Y36 安卓13) OPPO(PJU110 安卓14)这两款机型,用户授权后,打开相册无图片可选,但是手动关闭某一项权限后(系统会提示,关闭会连带其他权限一起关闭,如:照片和视频、音频文件),在手动开启,权限后,相册中就有图片可以选择。有懂的大佬能帮忙看一下嘛?到底是权限没弄好,还是bug。

我查阅部分咨询,有些地方说还需要加一个文件和文档权,但是这个权限没办法用户获取,我实际打包之后,这个权限调用的时候都是true,只有基础基座测试才会走进false的逻辑中,包括自定义基座也是true。下列有我权限列表的截图(安卓14


// manifest.json 权限部分  
"<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",  
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",  
"<uses-permission android:name=\"android.permission.MANAGE_EXTERNAL_STORAGE\"/>",  
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",  
"<uses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" />",  
"<uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\" />",  
"<uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" />"  

// 手机端获取权限部分代码  我是用uni.addInterceptor 监听chooseImage的  

function isManageAllFilesGranted() {  
    try {  
        const Environment = plus.android.importClass('android.os.Environment');  
        const File = plus.android.importClass('java.io.File');  
        const testFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath());  
        const canRead = testFile.canRead();  
        console.log('Environment.isExternalStorageManager()', Environment.isExternalStorageManager());  
        console.log('testFile.canRead()', canRead);  
        if (canRead) return true;  
        return Environment.isExternalStorageManager();  
    } catch (err) {  
        console.error('checkManageAllFilesPermission failed:', err)  
        return false  
    }  
}  

async function chooseMedia({ type = 'image' }) {  
    try {  
        const cameraStatus = await permisionUtil.requestAndroidPermission('android.permission.CAMERA')  

        const mediaPermission = osAndroidAPILevel >= 33  
            ? type === 'video'  
                ? 'android.permission.READ_MEDIA_VIDEO'  
                : 'android.permission.READ_MEDIA_IMAGES'  
            : 'android.permission.READ_EXTERNAL_STORAGE';  

        const mediaStatus = await permisionUtil.requestAndroidPermission(mediaPermission);  

        const audioStatus = osAndroidAPILevel >= 33  
            ? await permisionUtil.requestAndroidPermission('android.permission.READ_MEDIA_AUDIO')  
            : 1;  

        let hasManageAllFiles = true;  
        if (osAndroidAPILevel >= 30) {  
            hasManageAllFiles = isManageAllFilesGranted();  
            if (!hasManageAllFiles) {  
                setModalContent('我们需要您授予“文件和文档访问”权限,才能正常访问相册内容,请前往设置开启权限。');  
            }  
        }  
        console.log('摄像头使用权:cameraStatus',cameraStatus)  
        console.log('图库使用权:imageStatus',mediaStatus)  

        console.log('音频使用权:audioStatus',audioStatus)  

        console.log('文件文档使用权:hasManageAllFiles',hasManageAllFiles)  

        if (cameraStatus === 1 && mediaStatus === 1 && audioStatus === 1 && hasManageAllFiles) {  
            return 1;  
        } else {  
            return -1;  
        }  
    } catch (e) {  
        console.error(`${type} 权限申请异常`, e);  
        return 0;  
    }  
}  

chooseImage: () => chooseMedia({ type: 'image' })  
chooseVideo: () => chooseMedia({ type: 'video' })
2025-07-30 23:27 负责人:DCloud_Android_zl 分享
已邀请:
DCloud_Android_zl

DCloud_Android_zl

发一下安装包和manifest.json,我这边云打包之后再Android15的设备上没有问题。

  • 4***@qq.com (作者)

    下载地址和manifest.json私信您了。我这边也是部分机型有这个情况,红米K70 安卓14、VIVOIQOO 安卓10这两部手机正常

    2025-07-31 19:05

  • 4***@qq.com (作者)

    目前主要是这种情况,以安卓14举例:

    云打包后的APP,使用相册API前,我获取权限(摄像头、照片与视频、音频文件)允许APP需要的权限后,就拉起相册,相册内始终没图片,去权限管理查看,括号内的三个权限全是允许状态的。然后手动关闭相册权限会提示会一起关闭掉音频文件权限,随即打开权限,重新打开APP,相册就有图片了。

    且我也试过,只要成功手动打开过一次权限,后面几遍手动拒绝了,APP重新获取到权限,也可以正常使用相册

    2025-07-31 19:11

  • DCloud_Android_zl

    回复 4***@qq.com: 你出一个简单的能复现的示例给我一下吧,我这边按照你的配置都走了一遍,没能复现问题。

    2025-08-01 16:55

  • 4***@qq.com (作者)

    回复 DCloud_Android_zl: 您好,我将相关文件更新在帖子上了,以防你能看不到,也给您私信了一份,分别是简化demo的压缩包,和我复现的视频文件。目前该情况,主要是出现在部分老旧机型,公司买的测试开发手机。(大多都是VIVO OPPO 公司的开发手机都基本是这个品牌,开发者24年10月红米K70 Ultra允许权限后打开相册是正常的 )

    2025-08-01 19:56

CD_小C

CD_小C - CD_PUSH

解决了吗!同一个问题

  • 4***@qq.com (作者)

    等解决了,我会回复的,这个问题好抽象,并不是全部机型会这样,仅是个别机型会 ┭┮﹏┭┮

    2025-08-01 15:35

  • CD_小C

    我也遇到相关问题了,也是上面那个官方,正在排查

    2025-08-01 15:40

  • 4***@qq.com (作者)

    回复 CD_小C: 我看了看你的帖子,目前似乎是只有安卓13及以上的VIVO OPPO这两家的部分机型有这个情况。我提供了相关的视频,让官方排查,希望能发现问题

    2025-08-01 19:58

  • CD_小C

    回复 4***@qq.com: 哎。难受

    2025-08-04 10:50

  • 4***@qq.com (作者)

    回复 CD_小C: 看我的回复 目前问题解决了

    2025-08-04 22:37

4***@qq.com

4***@qq.com (作者) - 一个新用户

核心是:osAndroidAPILevel >= 33 需要加上 “android.permission.READ_EXTERNAL_STORAGE”权限也就是 READ_MEDIA_IMAGES+READ_EXTERNAL_STORAGE,为了以防万一,我还额外加上了READ_MEDIA_AUDIO权限,已经文件管理权限档保险栓,虽然暂时用不上这么多,有需要的可以调整一下代码

async function chooseMedia({ type = 'image' }) {  
    try {  
        const cameraStatus = await permisionUtil.requestAndroidPermission('android.permission.CAMERA')  
        "android.permission.READ_EXTERNAL_STORAGE"  
        let mediaStatus;  
        const comminStatus = await permisionUtil.requestAndroidPermission('android.permission.READ_EXTERNAL_STORAGE');  
        if (osAndroidAPILevel >= 33) {  
            let mediaPermission;  
            if (type ==='video') {  
                mediaPermission = 'android.permission.READ_MEDIA_VIDEO';  
            } else {  
                mediaPermission = 'android.permission.READ_MEDIA_IMAGES';  
            }  
            mediaStatus = await permisionUtil.requestAndroidPermission(mediaPermission);  
            if (!mediaStatus || !comminStatus) return -1;  
        } else {  
            mediaStatus = comminStatus;  
        }  

        const audioStatus = osAndroidAPILevel >= 33  
            ? await permisionUtil.requestAndroidPermission('android.permission.READ_MEDIA_AUDIO')  
            : 1;  

        let hasManageAllFiles = true;  
        if (osAndroidAPILevel >= 30) {  
            hasManageAllFiles = isManageAllFilesGranted();  
            if (!hasManageAllFiles) {  
                setModalContent('我们需要您授予“文件和文档访问”权限,才能正常访问相册内容,请前往设置开启权限。');  
            }  
        }  
        console.log('摄像头使用权:cameraStatus',cameraStatus)  
        console.log('图库使用权:imageStatus',mediaStatus)  

        console.log('音频使用权:audioStatus',audioStatus)  

        console.log('文件文档使用权:hasManageAllFiles',hasManageAllFiles)  

        if (cameraStatus === 1 && mediaStatus === 1 && audioStatus === 1 && hasManageAllFiles) {  
            return 1;  
        } else {  
            return -1;  
        }  
    } catch (e) {  
        console.error(`${type} 权限申请异常`, e);  
        return 0;  
    }  
}
  • CD_小C

    permisionUtil这个类是什么

    2025-08-05 11:23

  • 4***@qq.com (作者)

    回复 CD_小C: 就是调用权限的方法 封装的 传入权限名 调用权限

    function requestAndroidPermission(permissionID) {

    return new Promise((resolve, reject) => {

    plus.android.requestPermissions(

    [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装

    function(resultObj) {

    var result = 0;

    for (var i = 0; i < resultObj.granted.length; i++) {

    var grantedPermission = resultObj.granted[i];

    console.log('已获取的权限:' + grantedPermission);

    result = 1

    }

    for (var i = 0; i < resultObj.deniedPresent.length; i++) {

    var deniedPresentPermission = resultObj.deniedPresent[i];

    console.log('拒绝本次申请的权限:' + deniedPresentPermission);

    result = 0

    }

    for (var i = 0; i < resultObj.deniedAlways.length; i++) {

    var deniedAlwaysPermission = resultObj.deniedAlways[i];

    console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);

    result = -1

    }

    resolve(result);

    // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限

    // if (result != 1) {

    // gotoAppPermissionSetting()

    // }

    },

    function(error) {

    console.log('申请权限错误:' + error.code + " = " + error.message);

    resolve({

    code: error.code,

    message: error.message

    });

    }

    );

    });

    }

    2025-08-05 14:44

4***@qq.com

4***@qq.com (作者) - 一个新用户

感谢:DCloud_Android_zl大佬的问题排查

// permisionUtil是一个安卓权限类   

// 主要方法  
// Android权限查询  
function requestAndroidPermission(permissionID) {  
    return new Promise((resolve, reject) => {  
        plus.android.requestPermissions(  
            [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装  
            function(resultObj) {  
                var result = 0;  
                for (var i = 0; i < resultObj.granted.length; i++) {  
                    var grantedPermission = resultObj.granted[i];  
                    console.log('已获取的权限:' + grantedPermission);  
                    result = 1  
                }  
                for (var i = 0; i < resultObj.deniedPresent.length; i++) {  
                    var deniedPresentPermission = resultObj.deniedPresent[i];  
                    console.log('拒绝本次申请的权限:' + deniedPresentPermission);  
                    result = 0  
                }  
                for (var i = 0; i < resultObj.deniedAlways.length; i++) {  
                    var deniedAlwaysPermission = resultObj.deniedAlways[i];  
                    console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);  
                    result = -1  
                }  
                resolve(result);  
                // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限  
                // if (result != 1) {  
                // gotoAppPermissionSetting()  
                // }  
            },  
            function(error) {  
                console.log('申请权限错误:' + error.code + " = " + error.message);  
                resolve({  
                    code: error.code,  
                    message: error.message  
                });  
            }  
        );  
    });  
}

要回复问题请先登录注册