最近在公司项目开发中,遇到了关于图片选择,文件选择等一系列操作。这东西在网上有着一大堆框架,只要搜索Android图片选择就会有一堆结果,但是本着学习探索的精神,借着这几天的空闲,封装了一套便于扩展的Android文件选择器。
引入
首先是依赖library GitHub项目地址
暂时还没有添加gradle方式,所以只需要将localfileselectionlibrary导入项目即可
默认使用
使用方法如下↓
public class MainActivity extends AppCompatActivity {
Selection<Bitmap> selection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button select = findViewById(R.id.select);
final ImageView image = findViewById(R.id.image);
selection = SelectionFactory.getSelection(MainActivity.this, SelectionImage.class);
select.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selection.select(new CallBack<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
image.setImageBitmap(bitmap);
}
});
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
selection.getSelection().onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onDestroy() {
super.onDestroy();
selection.getSelection().flush();
}
}
下面这段代码是通过工厂返回一个Selection
实例(当前框架还仅支持图片,视频,音频选择,不过不要急嘛,下面会告诉你如何扩展哦)。Selection
可以使用泛型参数,但是要与对应Selection实现
提供的返回参数对应(例如现阶段图片就只能返回Bitmap
和File
),当然泛型也可以不写哈~~~
Selection<Bitmap> selection = SelectionFactory
.getSelection(MainActivity.this, SelectionImage.class);
通过如下方法可以选择更改返回类型可以不调用,默认File返回
selection.getType().file();//以文件形式返回,图片、音视频通用,默认返回格式
selection.getType().bitmap();//以bitmap格式返回,当前仅图片用
selection.getType().path();//以Srting格式返回路径,当前音视频用
通过如下方法配置选择执行线程可以不调用,默认异步执行
selection.getType().main();//主线程执行
selection.getType().async();//基于AsyncTask异步线程执行,默认实现此方式
主角方法登场,该方法为主要调用方法
selection.select(CallBack<T> callBack);//选择单个文件调用
selection.selects(CallBack<List<T>> callBack);//选择多个文件调用
设置接收系统回调,该方法为必要调用方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//一定要在此处调用,不然select是收不到回调的哈
selection.getSelection().onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onDestroy() {
super.onDestroy();
selection.getSelection().flush();//养成良好习惯哈
}
经过如上方式的讲解,相信你一定能熟练使用该框架熟练进行Android文件选择,当然该框架功能还不够齐全,小兄弟我也是正在加紧添加修改哈~~~
扩展使用
咦???我记得还有扩展呢不是吗???
别急,这就告诉你如何在该框架的基础上进行扩展使用,具体方法如下↓
分别实现自定义的ConVersion和Selection即可
public class MyConVersion extends ConVersionBase<Void,Void,String> {
public MyConVersion(Activity activity, Intent intent) {
super(activity, intent);
}
@Override
protected String doInBackground(Void... voids) {
return getFile().getPath();
}
//UI线程执行该方法返回选择的数据
@Override
public Object forCall() {
return getFile().getPath();
}
//异步线程执行该方法回调选择的数据
@Override
public void forCall(TaskCallBack callBack) {
super.forCall(callBack);
execute();
}
}
public class MySelection<T> extends SelectionBase<T> {
public MySelection(Activity activity) {
super(activity);
}
@Override
public void select(CallBack<T> callBack) {
super.select(callBack);
SimpleBase.setConVersionClass(MyConVersion.class);
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(SimpleBase.SELECT_ALL);
getActivity().startActivityForResult(intent, SimpleBase.requestCode());
}
@Override
public void selects(CallBack<List<T>> callBack) {
super.selects(callBack);
}
}
在ConVersionBase
中,看到doInBackground(Void... voids)
方法想必大家都明白了,这是一个继承自AstncTask
的类,关于其泛型参数的使用就不过多赘述了。该类内部getFile()
方法返回选择的文件对象,getIntent()
方法返回包含选择数据的Uri的Intent对象。
在SelectionBase<T>
中,通过实现select
单选和selects
多选这两个方法实现选择。例如select
方法内,首先要在SimpleBase
中注册自定义的ConVersion
类,然后定义自己需求的Intent
对象,最后通过getActivity().startActivityForResult(intent, SimpleBase.requestCode())
方法开启。
结语
目前,该框架还处于开发阶段,我会持续进行更新的哈,欢迎大家批评指正~~~
这是我的第一篇文章,也是我从学校正式进入工作岗位的开始,希望以后和大家一起积累,一起进步~~~
FileUtils
借鉴GitHub aFileChooser
网友评论