AndroidQ 系统自带文件选择器

 

Android Q 作用域规则

如果我们要读取SD卡上非图片、音频、视频类的文件,比如说先选择一个doc文件,这个时候就不能再使用MediaStore API了,而是要使用系统自带的文件选择器。直接上代码。

//选择文件
private void performFileSearch() {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        //允许多选 长按多选
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
        //不限制选取类型
        intent.setType("*/*");
        startActivityForResult(intent, -1);
}

//接收返回值
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case -1:
            if (resultCode == Activity.RESULT_OK && data != null) {
                //当单选选了一个文件后返回
                if (data.getData() != null) {
                    handleSingleDocument(data);
                } else {
                    //多选
                    ClipData clipData = data.getClipData();
                    if (clipData != null) {
                        Uri[] uris = new Uri[clipData.getItemCount()];
                        for (int i = 0; i < clipData.getItemCount(); i++) {
                            uris[i] = clipData.getItemAt(i).getUri();
                        }
                    }
                }
            }
            break;
    }
}

//将uri转换为我们需要的path,多选类似
private void handleSingleDocument(Intent data) {
    Uri uri = data.getData();
    String filePath = FileUtils.getRealPath(this, uri);
}

FileUtils.java文件 (根据Uri获取Path)

网上流传的很多Uri获取Path的方法虽然都适配到了Android 4.4,但是到了Android 8.0又不好使了,下面是在Android 10.0上测试通过的版本。

public class FileUtils {
    public static String getRealPath(Context context, Uri fileUri) {
        String realPath;
        // SDK < API11
        if (Build.VERSION.SDK_INT < 11) {
            realPath = FileUtils.getRealPathFromURI_BelowAPI11(context, fileUri);
        }
        // SDK >= 11 && SDK < 19
        else if (Build.VERSION.SDK_INT < 19) {
       
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值