Android安卓实现原生文件选择器(浏览器)多选文件功能

本文介绍了如何在Android应用中启用系统原生文件选择器的多选文件功能。通过设置`Intent.EXTRA_ALLOW_MULTIPLE`为true,允许用户长按文件图标进行多选。同时,文章提到解析返回的uri比较复杂,会在另一篇文章中单独讲解。
部署运行你感兴趣的模型镜像

转载请注明出处:codog_main的博客

前言

  有时我们想选择文件,但是又懒得自己去写一个文件浏览器,使用安卓原生的文件选择器或引入第三方库无疑是最佳选择,因为写自己不喜欢的东西真的非常痛苦。
  安卓开启系统原生文件浏览器的教程在网上已经烂大街了,但是很少有文章提及如何进行多选文件。我们在开启原生的文件浏览器时,默认是单选的,即点击文件立即返回uri,想实现多选只需要加入语句:
  intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
  此时就可以多选文件了(长按文件图标)。
  最近,朋友希望我的软件能加入这个功能,于是就找时间研究了一下。按照朋友的说辞,应该是有一个参数可以实现这个功能的,但是我发现网上(或者说是百度引擎),严重缺乏这方面的文章。没办法,我只能试着看看有没有相关的参数,于是在AS中敲入“Intent.MULT”,没想到还真出现了这句“Intent.EXTRA_ALLOW_MULTIPLE”,于是我放网上一查,找到了stackoverflow上的这篇提问,问题也就解决了。
  本篇文章只介绍原生文件浏览器如何实现多选,对于返回uri的解析会放到另一篇文章中进行讲解。
  对原生浏览器uri的解析异常困难,网上流传很广的方法来自国外论坛,但具体是哪个大神研究出来的也不可考究了。我翻遍了国内外论坛、github都找不到让我满意的答案,不同版本的系统返回的uri差异太大了,网上还没有一条万能公式可以解决uri解析问题,我的方法或许并不完善,但总比那些毫无灵魂的复制粘贴文要好多了,这篇文章正在准备中。

代码

  为了让没接触过的人有个总体的了解,也方便不知道如何启动原生文件浏览器的人无需再去找其他文章,下面放出完整代码。其中的getPath函数就是对uri的解析,她可以把uri转化为真实的文件路径,这部分留到另一篇文章中讲解。

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //注册添加文件按钮
        findViewById(R.id.selectButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);//意图:文件浏览器
                intent.setType("*/*");//无类型限制
                intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);//关键!多选参数
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                startActivityForResult(intent, 1);
            }
        });
    }

    /**
     * 获取返回值uri
     */
    @SuppressLint("NewApi")//minSdkVersion需要在15以上
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            if (data.getData() != null) {
                //单次点击未使用多选的情况
                try {
                    Uri uri = data.getData();
                    //TODO 对获得的uri做解析,这部分在另一篇文章讲解
                    //String path = getPath(getApplicationContext(),uri);
                    //TODO 对转换得到的真实路径path做相关处理
                    System.out.println(uri);
                } catch (Exception e) { }
            }
            else{
                //长按使用多选的情况
                ClipData clipData = data.getClipData();
                if (clipData != null) {
                    List<String> pathList=new ArrayList<>();
                    for (int i = 0; i < clipData.getItemCount(); i++) {
                        ClipData.Item item = clipData.getItemAt(i);
                        Uri uri = item.getUri();
                        //TODO 对获得的uri做解析,这部分在另一篇文章讲解
                        //String path = getPath(getApplicationContext(),uri);
                        //routers.add(path);
                        pathList.add(uri.toString());
                    }
                    //TODO 对转换得到的真实路径path做相关处理
                    System.out.println(pathList);
                }
            }
        }
    }
}

activity_main.html:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/selectButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="打开原生文件浏览器"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>
    
</android.support.constraint.ConstraintLayout>

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值