转载请注明出处: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>
本文介绍了如何在Android应用中启用系统原生文件选择器的多选文件功能。通过设置`Intent.EXTRA_ALLOW_MULTIPLE`为true,允许用户长按文件图标进行多选。同时,文章提到解析返回的uri比较复杂,会在另一篇文章中单独讲解。
955





