Vivo手机获取文件管理器里的文件路径为空

近日测试反馈了一个奇怪的bug,说是在一台vivo手机上无法获取文件,一开始还以为是这台手机的第三方文件管理器的原因,后来发现不是。直到打印出这次获得的url才发现了问题的所在,这个url是一个很奇怪content://com.android.providers.media.documents/document/document%3A3088,路径是个正常的路径,但是一般我们在media理处理的都是媒体资源如:图片和视频等。正常情况下url的结尾是image%3A3088这样的,但是这个东西很奇怪是以document结尾的,这样就导致了在获取数据时出现了问题

else if (isMediaDocument(uri)) {
                String docId = DocumentsContract.getDocumentId(uri);
                String[] split = docId.split(":");
                String type = split[0];
                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                } 
                String selection = "_id=?";
                String[] selectionArgs = new String[] { split[1] };
                return getDataColumn(context, contentUri, selection, selectionArgs);

一般情况下如上述代码,我会根据type来确定contentUri然后配合使用id去查找,因为type不能匹配所以每次都拿不到文件路径,没办法我上网查了很多资料,也没找到怎么解决,最后点进mediaStore,发现里面有一个FIles的类,我感觉这个就是来处理文件的,所以我在判断中加了个type,然后重新生成了一个file的contentUri,代码如下:

else if (isMediaDocument(uri)) {
                String docId = DocumentsContract.getDocumentId(uri);
                String[] split = docId.split(":");
                String type = split[0];
                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                } else if ("document".equals(type)) {
                    contentUri = MediaStore.Files.getContentUri("external");
                }
                String selection = "_id=?";
                String[] selectionArgs = new String[] { split[1] };
                return getDataColumn(context, contentUri, selection, selectionArgs);

其中传入的external是表明了我们要查找的数据所在,最后测试了一下是可行的,至于为什么会出现这样的问题,我没有找到答案,可能是国内定制系统做了一些奇怪的改动吧

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值