安卓选择本地图片或者视频

这篇博客介绍了如何在Android中实现让用户选择本地图片或视频,包括如何编写通用的Intent代码以及处理选择后的回调。同时,博主提醒了不区分图片和视频可能导致的问题,即可能会让用户误选通讯录,并给出了恢复默认设置的步骤。

正常情况下,

1.选择本地图片时应该使用如下代码:

Intent intent = new Intent(Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

startActivityForResult(intent, REQUESTCODE_CHOOSEIMAGE);

2.选择本地视频时使用如下代码:

Intent intent = new Intent(Intent.ACTION_PICK,
                    android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
            intent.setDataAndType(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "video/*");

那么如果是不区分视频还是图片 需要用户随意选择 如何改呢?

研究了一下之后,可以使用如下代码实现:

Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("*/*");
            intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"image/*", "video/*"});

此时牵扯到一个回调问题,现在不区分图片和视频,意味着要在回调后判断选择的文件类型或者用统一的方法处理,我使用统一的方法处理,不必区分文件类型:

Uri selectedImage = data.getData();
                String[] filePathColumns = { MediaStore.Files.FileColumns.DISPLAY_NAME,
                        MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.SIZE,
                        MediaStore.Files.FileColumns.MIME_TYPE };
                Cursor c = mContext.getContentResolver().query(selectedImage, filePathColumns, null, null, null);
                c.moveToFirst();
                String name = c.getString(c.getColumnIndex(filePathColumns[0]));//文件名
                String path = c.getString(c.getColumnIndex(filePathColumns[1]));//完整路径
                String size = c.getString(c.getColumnIndex(filePathColumns[2]));//文件大小
                String type = c.getString(c.getColumnIndex(filePathColumns[3]));//类型 例如image/xxx
                c.close();

 

2020.10.14补充一下:

不区分图片和视频的方法 不建议使用,

因为使用后系统会把所有匹配的应用都弹出给用户选择,尤其会弹出“通讯录”给用户选择,此时如果用户选了“通讯录”并且选了“总是/始终”,下次就弹不出来选项,而会直接跳到通讯录,而且一般用户不太容易去重置此选项。从代码角度也只有root设备才可以重置默认选项。当然可以引导用户手动重置。

如果用户误选了通讯录,点了“总是/始终”弹出选项,恢复方法:

(针对华为设备的解决方法是:打开 “设置”-》“应用”-》“联系人”-》 “应用信息”-》“默认打开”-》点击“清除默认设置 ” 即可 针对oppo设备的解决方法是:打开 “设置”-》“应用管理”-》“显示系统进程”-》“电话本”-》“默认打开“ -》点击“清除默认设置 ” 即可 以上解决方法 可能不同机型 有所不同 大概方法是一样的)

可以换一种方法跳转:

targetIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
targetIntent.setType("image/* video/*");

但是目前发现oppo机型 只能选到图片 不能选视频 临时方案是,如果判断是oppo机型使用如下方法避免用户误点“总是/始终”选项

            intent = new Intent(Intent.ACTION_PICK);
            intent.setType("*/*");
            intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"image/*", "video/*"});
            
            intent = Intent.createChooser(intent,"标题");//这句是关键,强制每次都创建选择器!!!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值