精华内容
下载资源
问答
  • Android安卓实现原生文件选择器(浏览器)多选文件功能
    千次阅读 热门讨论
    2019-07-01 14:34:39

    转载请注明出处: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 文件选择器 DFileSelector

    万次阅读 2018-11-04 23:19:54
    前段时间准备给朋友做一个手机小工具,需要用到选择文件并读取里面的内容。 这个读扩展卡选择文件的功能呢,其实也不难,就是个 RecyclerView 和 Adapter 而已。但是感觉自己有点懒,想找找开源的项目用用。 网上...

    源码地址:https://github.com/mengzhinan/FileSelector

    前段时间准备给朋友做一个手机小工具,需要用到选择文件并读取里面的内容。

    这个读扩展卡选择文件的功能呢,其实也不难,就是个 RecyclerView 和 Adapter 而已。但是感觉自己有点懒,想找找开源的项目用用。

    网上搜索了下,还真有一个叫 LFilePicker 的项目,地址为 https://github.com/leonHua/LFilePicker

    非常好的项目,很优秀,感谢首创的分享精神。坐着考虑的很全面细致,使用起来很简单。有兴趣的麻友自己去看看。

    然而,有强迫症的我,不甘示弱啊。自己阅读了作者的项目,吸收了其优秀数点,再根据自己的思路,也写了一个同样功能的开源小项目。

     

    一、先来看看效果图吧(抱歉,静态图)

    1、需要申请读扩展卡权限

     

    2、单选模式,选择后直接返回到上一个页面,在回调函数中返回选择的文件路径

    3、多选模式,勾选一定数量的文件后,点击底部的确定,返回到上一个也难,回调函数中获取选中的文件路径集合

     

    以上就是大概的默认效果图。

    什么?非常像小米手机的文件管理器界面?对,我就是打开小米手机的文件管理器界面,然后自己码的砖。

    抄袭?不存在的,我是忠实的米粉,看了它一眼而已,界面效果还不错。

     

    二、为什么还要自己造轮子?

    1、首先,作为一个程序员,有充足的时间和心理准备,为什么不自己动手试试呢?你怕多学到什么了吗?又不是赶项目。

    2、作者的项目确实很优秀。但是个人感觉部分功能包装的无余地了。比喻 title 、statusBar 部分,有些需求可能不需要这部分,或者需要考虑到沉浸式状态栏,岂不是很尴尬。

    3、文件类型图标,扩展性不好。图标样式只提供了几种选择,而且貌似文件扩展类型的图标没有个性化处理。

    4、当然,首创作者的项目也有很多优点的,其中之一:提供了 maven 引入的便捷方式。等等。

     

    三、我的轮子有哪些优点?

    1、和谐的界面效果,米粉们有福了。 

    2、支持单选、多选模式。

    3、处理局部结构和多选框样式不能改变外,其他的任何位置都可以自定义属性值。比喻:宽、高、字体大小、字体颜色、文件、图标资源等等,即你可设置 RecyclerView 层面和 Item 层面任意处的样式。

    4、兼容你的感受,提供多种打开方式。比喻:以 Activity 的方式打开、在你的页面直接写布局和 Java 代码。

    5、可自定义文件排序比较器、文件图标提供器、文件过滤器等重要扩展功能。

    6、可以通过设置回调、监听广播或在 onActivityResult() 方法的方式获取到选中的文件信息,非常灵活。

    7、也支持中、英文两种语言。

     

    四、怎么使用呢?

    1、直接使用代码库中的默认 Activity 启动文件选择器,包含 onActivityResult() 和 Receiver 两种接收返回数据方法,自己辨别。内部已经处理了动态权限。

    /**
     * 使用默认的Activity启动选择器
     */
    public class Demo1Activity extends AppCompatActivity implements View.OnClickListener {
        private TextView selectFIle;
        public static final String TAG = "MainActivityTest";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_demo1);
            selectFIle = findViewById(R.id.textview_select_file);
            selectFIle.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            if (v == null) {
                return;
            }
            int id = v.getId();
            if (id == R.id.textview_select_file) {
                DefaultSelectorActivity.startActivity(this);//包含广播
    //            DefaultSelectorActivity.startActivityForResult(this);
            }
        }
    
    //    @Override
    //    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    //        super.onActivityResult(requestCode, resultCode, data);
    //        if (resultCode == Activity.RESULT_OK && requestCode == DefaultSelectorActivity.FILE_SELECT_REQUEST_CODE) {
    //            printData(DefaultSelectorActivity.getDataFromIntent(data));
    //        }
    //    }
    
        private BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (context == null || intent == null) {
                    return;
                }
                if (DefaultSelectorActivity.FILE_SELECT_ACTION.equals(intent.getAction())) {
                    printData(DefaultSelectorActivity.getDataFromIntent(intent));
                    Demo1Activity.this.finish();
                }
            }
        };
    
    
        private boolean isRegister;
        private IntentFilter intentFilter = new IntentFilter(DefaultSelectorActivity.FILE_SELECT_ACTION);
    
        @Override
        protected void onResume() {
            super.onResume();
            if (!isRegister) {
                registerReceiver(receiver, intentFilter);
                isRegister = true;
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if (isRegister) {
                unregisterReceiver(receiver);
                isRegister = false;
            }
        }
    
        private void printData(ArrayList<String> list) {
            if (FileSelectorUtils.isEmpty(list)) {
                return;
            }
            int size = list.size();
            Log.v(TAG, "获取到数据-开始 size = " + size);
            StringBuffer stringBuffer = new StringBuffer("选中的文件:\r\n");
            for (int i = 0; i < size; i++) {
                Log.v(TAG, (i + 1) + " = " + list.get(i));
                stringBuffer.append(list.get(i));
                stringBuffer.append("\r\n");
            }
            Toast.makeText(this, stringBuffer.toString(), Toast.LENGTH_SHORT).show();
            Log.v(TAG, "获取到数据-结束");
        }
    }

    2、直接使用文件选择器的自定义控件,不包含状态栏和标题栏。自己实现动态权限和深度定制 UI。

    R.layout.activity_demo3.xml
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".Demo3Activity">
    
        <com.duke.dfileselector.widget.FileSelectorLayout
            android:id="@+id/file_select_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </android.support.constraint.ConstraintLayout>

    Demo3Activity.java

    /**
     * 直接使用自定义view启动选择器
     */
    public class Demo3Activity extends BasePermissionActivity {
        private FileSelectorLayout fileSelectorLayout;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_demo3);
            fileSelectorLayout = findViewById(R.id.file_select_layout);
        }
    
        @Override
        protected void onPermissionSuccess() {
            FileSelector.with(fileSelectorLayout).listen(new FileSelector.OnFileSelectListener() {
                @Override
                public void onSelected(ArrayList<String> list) {
                    Toast.makeText(Demo3Activity.this, "选中文件个数: size = " + (list == null ? 0 : list.size()), Toast.LENGTH_SHORT).show();
                    Demo3Activity.this.finish();
                }
            }).setup();
        }
    }

    说明:

    1、BasePermissionActivity.java 是我提供的处理动态权限基类,包含在代码库中。你只需关心 onPermissionSuccess() 权限申请成功方法即可。

    2、上例中,你可以通过 FileSelector 类的静态方法定制 UI。

     

    五、FileSelector API 简单介绍( 有点过分 )

    
    FileSelector.with(fileSelectorLayout)
                    .listen(onFileSelectListener) // 设置文件选中回调
                    .setItemParameter(ItemParameter.with(fileSelectorLayout.getContext())// 设置列表 item 的各种属性样式
                                    .setTitleTextSize(R.dimen.sp_20)          // 设置 item 文件名字体大小
                                    .setTitleTextColor(Color.RED)             // 设置 item 文件名字体颜色
                                    .setTitleTextBold(true)                   // 设置 item 文件名字体粗细
                                    .setImageWidth(R.dimen.dp_50)             // 设置 item 文件扩展类型图片宽度
                                    .setImageHeight(R.dimen.dp_50)            // 设置 item 文件扩展类型图片高度
                                    .setImageMarginRight(R.dimen.dp_50)       // 设置 item 文件扩展类型图片右边间距
                                    .setCountTextColor(Color.RED)             // 设置 item 文件个数字体颜色
                                    .setCountTextSize(R.dimen.sp_20)          // 设置 item 文件个数字体大小
                                    .setCountTextBold(true)                   // 设置 item 文件个数字体粗细
                                    .setDateTextSize(R.dimen.sp_20)           // 设置 item 文件日期字体大小
                                    .setDateTextColor(Color.RED)              // 设置 item 文件日期字体颜色
                                    .setDateTextBold(true)                    // 设置 item 文件日期字体粗细
                                    .setLayoutBackgroundColor(Color.RED)      // 设置 item 背景颜色
                                    .setLayoutPadding(R.dimen.dp_1, R.dimen.dp_1, R.dimen.dp_1, R.dimen.dp_1) // 设置 item 边距
                                    .setSplitLineColor(Color.RED)             // 设置 item 的文件个数与日期之间分割线的颜色
                                    .setSplitLineHeight(R.dimen.dp_10)        // 设置 item 的文件个数与日期之间分割线的高度
                                    .setSplitLineWidth(R.dimen.dp_10)         // 设置 item 的文件个数与日期之间分割线的宽度
                                    .setSplitLineMarginLeft(R.dimen.dp_50)    // 设置 item 的文件个数与日期之间分割线的左间距
                                    .setSplitLineMarginRight(R.dimen.dp_50)   // 设置 item 的文件个数与日期之间分割线的右间距
                    )
                    .setMultiSelectionModel(true)                             // 设置是否为多选模式
                    .setMultiModelMaxSize(3)                                  // 设置多选模式时最多可选中文件的个数
                    .setMultiModelToast(true, "最多只能选择3个文件")          // 设置多选模式选择数量达到上限值时是否需要 Toast 提示
                    .setFileSizeProvide(FileSizeProvide fileSizeProvide)      // 设置文件个数处的自定义文本样式
                    .setFileIconProvide(FileIconProvide fileIconProvide)      // 设置文件扩展类型图片自定义提供器
                    .setFileDateProvide(FileDateProvide fileDateProvide)      // 设置文件日期格式化样式自定义提供器
                    .setFileFilter(FileFilter fileFilter)                     // 设置自动以文件顾虑器
                    .setFileOrderProvide(FileOrderProvide fileOrderProvide)   // 设置文件排序比较器
                    .setHeadTopLineVisibility(View.VISIBLE)                   // 设置列表顶部路径栏上边的横线
                    .setHeadTopLineColor(Color.RED)                           // 设置列表顶部路径栏上边横线颜色
                    .setHeadTopLineHeight(R.dimen.dp_30)                      // 设置列表顶部路径栏上边横线高度
                    .setHeadTopLineHeightDP(30)                               // 同上
                    .setHeadTopLineHeightPX(30)                               // 同上
                    .setHeadTopLineMargin(R.dimen.dp_10, R.dimen.dp_10,R.dimen.dp_10,R.dimen.dp_10) // 设置列表顶部路径栏上边横线边距
                    .setHeadTopLineMarginDP(10,10,10,10)                      // 同上
                    .setHeadTopLineMarginPX(10,10,10,10)                      // 同上
                    .setHeadBottomLineVisibility(View.VISIBLE)                // 设置类表顶部路径栏下边的横线
                    .setHeadBottomLineColor(@ColorInt int color)              // 设置类表顶部路径栏下边横线的颜色
                    .setHeadBottomLineHeight(@DimenRes int resId)             // 设置类表顶部路径栏下边横线的高度
                    .setHeadBottomLineHeightDP(float dpHeight)                // 同上
                    .setHeadBottomLineHeightPX(float pxHeight)                // 同上
                    .setHeadBottomLineMargin(@DimenRes int leftDimenRes, @DimenRes int topDimenRes, @DimenRes int rightDimenRes, @DimenRes int bottomDimenRes)
                    .setHeadBottomLineMarginDP(float leftDP, float topDP, float rightDP, float bottomDP)
                    .setHeadBottomLineMarginPX(float leftPX, float topPX, float rightPX, float bottomPX)
                    .setHeadRootHeight(R.dimen.dp_40)                         // 设置列表顶部路栏高度
                    .setHeadRootHeightDP(40)                                  // 同上
                    .setHeadRootHeightPX(120)                                 // 同上
                    .setHeadRootPadding(R.dimen.dp_20,R.dimen.dp_1,R.dimen.dp_30,R.dimen.dp_1)        // 设置列表顶部路栏内容边距
                    .setHeadRootPaddingDP(float leftDP, float topDP, float rightDP, float bottomDP)   // 同上
                    .setHeadRootPaddingPX(float leftPX, float topPX, float rightPX, float bottomPX)   // 同上
                    .setHeadRootBackgroundColor(Color.RED)                    // 设置列表顶部路栏背景颜色
                    .setHeadRootBackgroundResource(@DrawableRes int resId)    // 设置列表顶部路栏背景资源
                    .setHeadLeftTextSize(R.dimen.sp_20)                       // 设置列表顶部路栏左边路径字体大小
                    .setHeadLeftTextSizePX(60)                                // 同上
                    .setHeadLeftTextSizeSP(20)                                // 同上
                    .setHeadLeftTextColor(Color.RED)                          // 设置列表顶部路栏左边路径字体颜色
                    .setHeadLeftTextColor(ColorStateList colors)              // 同上
                    .setHeadLeftTextBold(true)                                // 设置列表顶部路栏左边路径字体粗细
                    .setHeadLeftTextEllipsize(TextUtils.TruncateAt.MARQUEE)   // 设置列表顶部路栏左边路径字体省略模式
                    .setHeadRightImage(Drawable leftDrawable)                 // 设置列表顶部路栏右边返回按钮左边的图片资源
                    .setHeadRightImageDP(Drawable leftDrawable, float widthDP, float heightDP) // 同上
                    .setHeadRightImagePX(Drawable leftDrawable, float widthPX, float heightPX) // 同上
                    .setHeadRightText(@StringRes int resId)                   // 设置列表顶部路栏右边返回按钮的文本
                    .setHeadRightText("上一级")                               // 同上
                    .setHeadRightTextSize(@DimenRes int resId)                // 设置列表顶部路栏右边返回按钮的字体大小
                    .setHeadRightTextSizePX(float px)                         // 同上
                    .setHeadRightTextSizeSP(20)                               // 同上
                    .setHeadRightTextColor(Color.RED)                         // 设置列表顶部路栏右边返回按钮的字体颜色
                    .setHeadRightTextColor(ColorStateList colors)             // 同上
                    .setHeadRightTextBold(true)                               // 设置列表顶部路栏右边返回按钮的字体粗细
                    .setHeadRightTextBackgroundColor(Color.RED)               // 设置列表顶部路栏右边返回按钮的背景
                    .setHeadRightTextBackgroundResource(@DrawableRes int resId)// 同上
                    .setRecyclerViewLineDecoration(RecyclerView.ItemDecoration itemDecoration) // 设置列表的 item 分割线提供器
                    .setRecyclerViewLineColorHeight(Color.RED, R.dimen.dp_1, R.dimen.dp_5)     // 同上
                    .setRecyclerViewLineColorHeightDP(@ColorInt int color, float heightDP, float marginDP) // 同上
                    .setRecyclerViewLineColorHeightPX(@ColorInt int color, float heightPX, float marginPX) // 同上
                    .setRecyclerViewBackgroundColor(Color.GRAY)                   // 设置列表背景颜色
                    .setRecyclerViewBackgroundResource(@DrawableRes int resId)    // 设置列表背景资源
                    .setEmptyText(@StringRes int resId)                           // 设置无数据界面的提示文本
                    .setEmptyText("无数据")                                       // 同上
                    .setEmptyTextColor(Color.RED)                                 // 设置无数据界面的提示文本的颜色
                    .setEmptyTextColor(ColorStateList colors)                     // 同上
                    .setEmptyTextSize(@DimenRes int resId)                        // 设置无数据界面的提示文本字体大小
                    .setEmptyTextSizePX(float px)                                 // 同上
                    .setEmptyTextSizeSP(float sp)                                 // 同上
                    .setEmptyTopImage(@DrawableRes int topDrawableResId)          // 设置无数据界面的提示文本的顶部图片资源
                    .setEmptyTopImage(Drawable topDrawable)                       // 同上
                    .setEmptyTopImage(@DrawableRes int topDrawableResId, @DimenRes int widthResId, @DimenRes int heightResId)
                    .setEmptyTopImageDP(Drawable topDrawable, float widthDP, float heightDP)
                    .setEmptyTopImagePX(Drawable topDrawable, float widthPX, float heightPX)
                    .setSubmitTextViewHeight(@DimenRes int resId)                 // 多选模式,设置确定按钮控件的高度
                    .setSubmitTextViewHeightDP(float dpHeight)                    // 同上
                    .setSubmitTextViewHeightPX(float pxHeight)                    // 同上
                    .setSubmitText(@StringRes int resId)                          // 多选模式,设置确定按钮的文本
                    .setSubmitText("ok")                                          // 同上
                    .setSubmitTextColor(@ColorInt int color)                      // 多选模式,设置确定按钮的字体颜色
                    .setSubmitTextColor(ColorStateList colors)                    // 同上
                    .setSubmitTextSize(@DimenRes int resId)                       // 多选模式,设置确定按钮的字体大小
                    .setSubmitTextSizePX(float px)                                // 同上
                    .setSubmitTextSizeSP(float sp)                                // 同上
                    .setSubmitTextBold(boolean isBold)                            // 多选模式,设置确定按钮的字体粗细
                    .setSubmitViewBackgroundColor(Color.RED)                      // 多选模式,设置确定按钮的背景颜色
                    .setSubmitViewBackgroundResource(@DrawableRes int resId)      // 多选模式,设置确定按钮的背景资源
                    .setDefaultFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)) // 添加设置默认路径方法
                    .setup();                                                     // 生效设置,最后必须调用,否则 UI 界面无数据。
    
    
    

    重点就是这些了,有兴趣的可以下载试用。

    源码地址:https://github.com/mengzhinan/FileSelector

     

     

     

     

     

     

     

     

     

    展开全文
  • Android中文件选择器的实现(代码)

    千次下载 热门讨论 2012-12-20 09:35:18
    Android中文件选择器的实现
  • java文件夹选择框和Java文件选择器

    热门讨论 2010-09-16 23:10:47
    java文件夹选择框和Java文件选择器java文件夹选择框和Java文件选择器java文件夹选择框和Java文件选择器java文件夹选择框和Java文件选择器
  • button打开文件选择器

    千次阅读 2019-08-07 10:26:48
    ###如上图所示,需求是点击button打开一个文件选择器: 以下为简单方法: 在按键事件监听方法加入以下代码: //初始化文件选择框 JFileChooser fDialog = new JFileChooser(); //设置文件选择框的标题 fDialog....

    image.png
    ###如上图所示,需求是点击button打开一个文件选择器:

    以下为简单方法:

    在按键事件监听方法加入以下代码:
    
    //初始化文件选择框
    JFileChooser fDialog = new JFileChooser();
    //设置文件选择框的标题
    fDialog.setDialogTitle("请选择音频文件");
    //弹出选择框
    int returnVal = fDialog.showOpenDialog(null);
    // 如果是选择了文件
    if(JFileChooser.APPROVE_OPTION == returnVal){
    //打印出文件的路径,你可以修改位 把路径值 写到 textField 中
    System.out.println(fDialog.getSelectedFile());
    }
    

    这种方法出来的效果比较难看,是那种很原始的样子
    下为比较好看的界面:源自:https://www.cnblogs.com/xingyunblog/p/3871611.html

    import java.awt.FileDialog;
    import java.awt.Frame;
    import java.awt.Menu;
    import java.awt.MenuBar;
    import java.awt.MenuItem;
    import java.awt.TextArea;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    
    class MyMenuDemo {
        private Frame f;// 定义窗体
        private MenuBar bar;// 定义菜单栏
        private TextArea ta;
        private Menu fileMenu;// 定义"文件"和"子菜单"菜单
        private MenuItem openItem, saveItem, closeItem;// 定义条目“退出”和“子条目”菜单项
    
        private FileDialog openDia, saveDia;// 定义“打开、保存”对话框
        private File file;//定义文件
    
        MyMenuDemo() {
            init();
        }
    
        /* 图形用户界面组件初始化 */
        public void init() {
            f = new Frame("my window");// 创建窗体对象
            f.setBounds(300, 100, 650, 600);// 设置窗体位置和大小
    
            bar = new MenuBar();// 创建菜单栏
            ta = new TextArea();// 创建文本域
    
            fileMenu = new Menu("文件");// 创建“文件”菜单
    
            openItem = new MenuItem("打开");// 创建“打开"菜单项
            saveItem = new MenuItem("保存");// 创建“保存"菜单项
            closeItem = new MenuItem("退出");// 创建“退出"菜单项
    
            fileMenu.add(openItem);// 将“打开”菜单项添加到“文件”菜单上
            fileMenu.add(saveItem);// 将“保存”菜单项添加到“文件”菜单上
            fileMenu.add(closeItem);// 将“退出”菜单项添加到“文件”菜单上
    
            bar.add(fileMenu);// 将文件添加到菜单栏上
    
            f.setMenuBar(bar);// 将此窗体的菜单栏设置为指定的菜单栏。
    
            openDia = new FileDialog(f, "打开", FileDialog.LOAD);
            saveDia = new FileDialog(f, "保存", FileDialog.SAVE);
    
            f.add(ta);// 将文本域添加到窗体内
            myEvent();// 加载事件处理
    
            f.setVisible(true);// 设置窗体可见
    
        }
    
        private void myEvent() {
            
            // 打开菜单项监听
            openItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    
                    openDia.setVisible(true);//显示打开文件对话框
                    
                    String dirpath = openDia.getDirectory();//获取打开文件路径并保存到字符串中。
                    String fileName = openDia.getFile();//获取打开文件名称并保存到字符串中
                    
                    if (dirpath == null || fileName == null)//判断路径和文件是否为空
                        return;
                    else
                        ta.setText(null);//文件不为空,清空原来文件内容。
                    file = new File(dirpath, fileName);//创建新的路径和名称
    
                    try {
                        BufferedReader bufr = new BufferedReader(new FileReader(file));//尝试从文件中读东西
                        String line = null;//变量字符串初始化为空
                        while ((line = bufr.readLine()) != null) {
                            ta.append(line + "\r\n");//显示每一行内容
                        }
                        bufr.close();//关闭文件
                    } catch (FileNotFoundException e1) {
                        // 抛出文件路径找不到异常
                        e1.printStackTrace();
                    } catch (IOException e1) {
                        // 抛出IO异常
                        e1.printStackTrace();
                    }
    
                }
    
            });
            
            // 保存菜单项监听
            saveItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if (file == null) {
                        saveDia.setVisible(true);//显示保存文件对话框
                        String dirpath = saveDia.getDirectory();//获取保存文件路径并保存到字符串中。
                        String fileName = saveDia.getFile();获取打保存文件名称并保存到字符串中
                        
                        if (dirpath == null || fileName == null)//判断路径和文件是否为空
                            return;//空操作
                        else
                            file=new File(dirpath,fileName);//文件不为空,新建一个路径和名称
                    }
                        try {
                            BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
                            
                            String text = ta.getText();//获取文本内容
                            bufw.write(text);//将获取文本内容写入到字符输出流
                            
                            bufw.close();//关闭文件
                        } catch (IOException e1) {
                            //抛出IO异常
                            e1.printStackTrace();
                        }
                    
    
                }
    
            });
            
            // 退出菜单项监听
            closeItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
    
            });
            
            // 窗体关闭监听
            f.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
    
                }
    
            });
        }
    
        public static void main(String[] args) {
            new MyMenuDemo();
        }
    }
    - 
    
    展开全文
  • Android文件选择器

    千次阅读 2017-09-15 18:10:50
    项目中用到文件选择器,功能是可以筛选出常用的文件也可以在所有的文件中选择。 先看一下效果图: 图中,左面是可以选择常用的文件,右边就是从手机跟目录开始一层一层的选择。 UI 方面就不多说啦,使用两个...

    项目中用到文件选择器,功能是可以筛选出常用的文件也可以在所有的文件中选择。
    先看一下效果图:
    这里写图片描述这里写图片描述

    图中,左面是可以选择常用的文件,右边就是从手机跟目录开始一层一层的选择。
    UI 方面就不多说啦,使用两个fragment切换 ,数据通讯通过自定义接口。关键是数据是怎么获得的。

    全部文件

    String path = Environment.getExternalStorageDirectory().getAbsolutePath() 
             File directory = new File(path);
             File[] files = directory.listFiles(filter);

    files 就是我们需要的文件集合。区分是否是文件夹,当点击文件夹的时候,根据当前文件夹的路径可以找到当前文件夹下面的所有文件,更新UI即可。哈哈 是不是很简单。

    常用文件

    查找常用文件也可以根据查找全部文件的方法,递归遍历所有的文件夹,找到所有的文件放在一个集合中。但是我们不知道我们手机中到底有多少文件,当文件数量很多很多的时候,递归遍历会非常耗时。

    其实安卓系统会把手机中的所有的文件都映射到手机的媒体数据库中,比较好的方式就是通过媒体查询(MediaStore.Files),直接查找数据库中的文件,这样的效率比递归就快多啦。

    我们可以查找全部文件也可以通过条件筛选:

    全部查询: 查询条件传null就好啦

    Cursor cursor = context.getContentResolver().query(
                    MediaStore.Files.getContentUri("external"),//数据源
                    projection,//查询类型
                    null,//查询条件
                    null,
                    MediaStore.Files.FileColumns.DATE_ADDED + " DESC");

    条件查询: 填写查询条件比如

     String selection = MediaStore.Files.FileColumns.MIME_TYPE + "= ? "
                    + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? "
                    + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? "
                    + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? "
                    + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? "
                    + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? "
                    + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? ";
            String[] selectionArgs = new String[]{"text/plain", "application/msword",
                    "application/pdf", "application/vnd.ms-powerpoint",
                    "application/vnd.ms-excel", "image/jpeg",
                    "image/png"
            };
            final Cursor cursor = context.getContentResolver().query(
                    MediaStore.Files.getContentUri("external"),//数据源
                    projection,//查询类型
                    selection,//查询条件
                    selectionArgs,
                    MediaStore.Files.FileColumns.DATE_ADDED + " DESC");

    查询条件通过MIME_TYPE类型查找,MIME_TYPE的类型有哪些可以自行百度比如http://blog.liuxianan.com/mime-type.html
    上面的条件是查询手机中的所有的 .tex .doc .dot .xls . jpg .jpeg .png 文件。项目中我们可以根据自己的需求填写查询的条件。
    在查询所有的文件的时候,虽然比直接递归查询要快,但是也是比较耗时的,所以需要放在子线程中去执行啦。

    查询的时候也可以筛选文件夹,根据查询出来的文件路径筛选就可。demo中查询的是微信和QQ中的图片和下载的文件。

    查看文件,通过系统方法查根据MIME_TYPE的类型,从系统中找到可以打开该文件的应用,打开文件。

            Intent intent = new Intent();
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setAction(Intent.ACTION_VIEW);
            Uri uri = getUri(param);
            intent.setDataAndType(uri,"application/vnd.android.package-archive");

    打开不同的类型更改setDataAndType中的类型就好啦。

    demo 地址https://github.com/chsmy/FilePicker

    用法:

     Intent intent = new Intent(this, FilePickerActivity.class);
            startActivityForResult(intent,REQ_CODE);
      @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if(requestCode == REQ_CODE){
            //拿到数据渲染recycleview
                FilePickerShowAdapter adapter = new                            FilePickerShowAdapter(this,PickerManager.getInstance().files);
                mRecyclerView.setAdapter(adapter);
                adapter.setOnItemClickListener(new OnFileItemClickListener() {
                    @Override
                    public void click(int position) {
     startActivity(Intent.createChooser(OpenFile.openFile(PickerManager.getInstance().files.get(position).getPath(), getApplicationContext()), "选择程序"));
                    }
                });
            }
        }
    展开全文
  • FilePicker一个Android文件选择器

    万次阅读 2019-03-28 14:42:29
    文件选择器 效果图: 钉钉中上传的附件的文件选择器,可以选择常用文件和根据文件夹选择全部文件,demo中也实现了这种效果 界面跟钉钉不一样,展示方面没啥好说的每个项目的UI展示可能都不一样,关键是数据是...
  • Java Swing中文件选择器的使用

    千次阅读 多人点赞 2017-08-24 13:52:28
    1.文件选择对话框的用户创建经常使用打开和保存文件的对话框,它是一个独立的组件,我们可以使用文件选择器打开文件和保存文件,有时候将图片和文件保存到数据库,可以使用文件选择器获取文件路径,并把文件路径保存...
  • input file 无法打开手机端文件选择器

    千次阅读 2020-12-29 09:09:43
    版权声明:本文为博主原创文章,未经博主允许不得转载....这种的格式,否则会在点击上传时弹出无法打开文件选择器这样的提示框 标签,但是默认的file标签很难看,而且每个浏览器下都有很大差距. 1.一般解决办法...
  • Android本地文件选择器

    千次阅读 2017-11-17 17:12:10
    由于打在Android系统的手机厂商几乎都对Android系统的源代码做了修改,如果用隐式意图打开本地文件管理的话很难兼容到所有手机,这也是我想开发一个兼容性文件选择器依赖库的初始原因。
  • /*使用showOpenDialog()方法,显示出打开选择文件的窗口,当选择了某个文件后,或者关闭此窗口那么都会返回一个 整型数值,如果返回的是0,代表已经选择了某个文件。如果返回1代表选择了取消按钮或者直接关闭了...
  • JavaSwing_4.3: JFileChooser(文件选择器

    万次阅读 多人点赞 2017-07-23 22:45:22
    Java Swing 图形界面开发(目录) 1. 概述 官方JavaDocsApi: javax.swing.JFileChooser JFileChooser,文件选取。JFileChooser为用户选择文件提供了一种简单的机制,包括 打开文件 和 保存文...
  • 本文介绍了 Android WebView 文件上传功能,介绍了不同厂商系统默认选择器,以及如何自定义文件选择器
  • 选择文件想必大家都不陌生,手机端,电脑端都经常用到——点击一个打开文件选择器的小图标,进入文件选择器,选择好文件之后,啪,返回一个文件所在的真实路径。。。当时想了想貌似也挺简单的,就网上查了点资料然后...
  • JavaFX文件选择器FileChooser

    千次阅读 2017-12-20 20:04:45
    JavaFX文件选择器FileChooser
  • html中实现多文件选择器

    千次阅读 2017-11-07 15:49:11
    但是,这种文件选择器的一个缺点就是一次只能选择一个文件,这对于需要一次性上传多个文件甚至数目不确定的文件无能为力,但是file输入项有一个属性可以将单文件选择器变为多文件选择器:multiple 只要在file的输入...
  • Android学习之文件选择器LFilePicker

    万次阅读 2017-04-19 08:33:40
    在 Android 开发中如果需要选择某个文件,可以直接调取系统的文件管理进行选择,但是无法保证各个厂商的手机界面一致,而且解析Uri 还比较繁琐,如果还需要多选呢?需要文件类型过滤呢?老板说界面丑呢? ...
  • JavaFX8初探(文件选择器

    万次阅读 多人点赞 2015-03-12 13:43:35
    JavaFX8初探(文件选择器)本章主要介绍如何使用FileChooser 来导航文件系统,本章提供的简单的例子解释了如何打开一个或多个文件,配置文件选择窗口,并且保存应用内容。 和其他的接口组件不同,FileChooser 不...
  • android使用WebView来打开文件选择器

    千次阅读 2016-05-05 16:41:37
    最近了解了一下android的webview可以默认的调用系统的文件选择器。首先,网页的html写法要有,这个在ios上也是可以默认调用系统的文件选择器,只不过可以选择部分文件,毕竟ios对文件的选择做了限制;今天主要来介绍...
  • 这两天做一个图形化软件需要选择文件并进行文件读取,因此需要使用到JAVA Spring中的文件选择框。查阅相关资料发现FileChooser是一个不错的选择,在此记录一下使用过程和心得。 拿到一种新的java类,最先做的就是...
  • Android中文件选择器的实现

    万次阅读 2012-11-30 08:59:45
    转载请注明出处:http://blog.csdn.net/qinjuning 今天给大家分享下文件选择器的作用 , 具体就是获取用户在在SD卡选中的文件/文件夹路径 ,类似于C#中 ... 网上流传较广的一个成品如下 [Android实例] 文件选择器
  • flutter_file_selector 文件选择插件,支持多选 ,演示示例在example目录 我代码我传到码云上了,点我跳转 下面是效果图: 第三张是ios端 本插件使用到的依赖 插件依赖 pub仓库地址 ermission_handler ...
  • 1、打开系统自带的文件管理 /** * 打开本地文件器 */ private void openFileSelector() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*");//设置类型,我这里是任意类型,...
  • Android 打开系统文件管理器选择文件

    千次阅读 2019-11-08 17:48:54
    记录一下打开手机文件管理器选择文件的实现代码: //定义 请求返回码 public static final int IMPORT_REQUEST_CODE=10005; public void openFileManager(){ Intent intent = new Intent(Intent.ACTION_GET_...
  • javax.swing.JFileChooser()(文件选择器)提供了一种文件选择机制,一般用于打开文件,保存文件。 二、常用方法。 构造器: 1. public JFileChooser() : 构造一个JFileChooser对象,默认打开的文件夹为用户...
  • C#winform打开文件夹选择器

    千次阅读 2019-08-21 18:46:52
    一、打开文件夹选择器 System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog(); dialog.Description = "请选择文件夹"; if (dialog.ShowDialog() == System....
  • 一、选择文件【系统文件管理】 import android.annotation.SuppressLint; import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.net.Uri; ...
  • 给按钮添加以下点击事件,点击后弹出选择本地文件的对话框: xml_openSelectionBox() { var inputObj=document.createElement('input') inputObj.setAttribute('id','my_inputObj'); inputObj.setAttribute('...
  • java程序中添加文件选择器

    千次阅读 2012-11-05 16:55:48
    最近在写一个网络敏感信息监测预警系统,使用java语言开发的,其中涉及到了文件选择器的使用方法,我用的是选择一个目录,也就是在本地计算机上选择一个文件夹用来保存从网上采集下来的新闻信息,刚开始不知道怎么弄...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,960,262
精华内容 784,104
关键字:

文件选择器

友情链接: 1457535787009024.rar