美文网首页工作生活
Android,一招解决文件选择 2019-06-30

Android,一招解决文件选择 2019-06-30

作者: nullpt | 来源:发表于2019-06-30 16:12 被阅读0次

最近在公司项目开发中,遇到了关于图片选择,文件选择等一系列操作。这东西在网上有着一大堆框架,只要搜索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实现提供的返回参数对应(例如现阶段图片就只能返回BitmapFile,当然泛型也可以不写哈~~~

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

相关文章

网友评论

    本文标题:Android,一招解决文件选择 2019-06-30

    本文链接:https://www.haomeiwen.com/subject/aowvcctx.html