android选择文件(安卓系统文件夹详解)
android选择文件(安卓系统文件夹详解)
2024-06-02 06:55:33  作者:個悳冬天  网址:https://m.xinb2b.cn/life/thh296065.html

废话没有,先看效果

android选择文件(安卓系统文件夹详解)(1)

第一步:创建MainActivity

import android.app.Activity;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import com.rdsa.singleselectedfileorfolder.R;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {    public Context mContext;    private Button selectFile, selectFolder, mSelectFile, mSelectFolder;    private TextView result;    private Activity activity;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        this.mContext = this;        this.activity = this;        setContentView(R.layout.activity_main);        initView();        initData();        initEvent();    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (requestCode == ChooseFileOrDirActivity.RequestCode && resultCode == ChooseFileOrDirActivity.ResultCode) {            ArrayList<String> resPath = data.getStringArrayListExtra(ChooseFileOrDirActivity.ResultData);            StringBuffer sb = new StringBuffer();            for(String item : resPath) {                sb.append(item).append("rn");            }            result.setText(sb.toString());        }    }    private void initView() {        this.result = super.findViewById(R.id.result);        this.selectFile = super.findViewById(R.id.selectFile);        this.selectFolder = super.findViewById(R.id.selectFolder);        this.mSelectFile = super.findViewById(R.id.mSelectFile);        this.mSelectFolder = super.findViewById(R.id.mSelectFolder);    }    private void initData() {    }    private void initEvent() {        selectFile.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(activity, ChooseFileOrDirActivity.class);                intent.putExtra(ChooseFileOrDirActivity.EnterVar, ChooseFileOrDirActivity.SingleFile);                activity.startActivityForResult(intent, ChooseFileOrDirActivity.RequestCode);            }        });        selectFolder.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(activity, ChooseFileOrDirActivity.class);                intent.putExtra(ChooseFileOrDirActivity.EnterVar, ChooseFileOrDirActivity.SingleFolder);                activity.startActivityForResult(intent, ChooseFileOrDirActivity.RequestCode);            }        });        mSelectFile.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(activity, ChooseFileOrDirActivity.class);                intent.putExtra(ChooseFileOrDirActivity.EnterVar, ChooseFileOrDirActivity.MultiFile);                activity.startActivityForResult(intent, ChooseFileOrDirActivity.RequestCode);            }        });        mSelectFolder.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(activity, ChooseFileOrDirActivity.class);                intent.putExtra(ChooseFileOrDirActivity.EnterVar, ChooseFileOrDirActivity.MultiFolder);                activity.startActivityForResult(intent, ChooseFileOrDirActivity.RequestCode);            }        });    }}

第二步:创建MainActivity布局文件activity_main.xml

<LinearLayout 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"    android:orientation="vertical"    tools:context="com.rdsa.selectedfileorfolder.MainActivity">    <Button        android:id="@+id/selectFolder"        android:text="文件夹选择(单选)"        android:layout_width="match_parent"        android:layout_height="wrap_content"   />    <Button        android:id="@+id/selectFile"        android:text="文件选择(单选)"        android:layout_width="match_parent"        android:layout_height="wrap_content"   />    <Button        android:id="@+id/mSelectFolder"        android:text="文件夹选择(多选)"        android:layout_width="match_parent"        android:layout_height="wrap_content"   />    <Button        android:id="@+id/mSelectFile"        android:text="文件选择(多选)"        android:layout_width="match_parent"        android:layout_height="wrap_content"   />    <TextView        android:id="@+id/result"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Wait for Result" /></LinearLayout>

第三步:创建目录数据存储类FileOrDirBeans

public class FileOrDirBeans {    String isFile, name, isCheckVisible, isChecked, absolutePath ;    public FileOrDirBeans(String... params) {        this.isFile = params[0];        this.name = params[1];        this.isCheckVisible = params[2];        this.isChecked = params[3];        this.absolutePath = params[4];    }    public String getIsFile() {        return isFile;    }    public void setIsFile(String isFile) {        this.isFile = isFile;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getIsCheckVisible() {        return isCheckVisible;    }    public void setIsCheckVisible(String isCheckVisible) {        this.isCheckVisible = isCheckVisible;    }    public String getIsChecked() {        return isChecked;    }    public void setIsChecked(String isChecked) {        this.isChecked = isChecked;    }    public String getAbsolutePath() {        return absolutePath;    }    public void setAbsolutePath(String absolutePath) {        this.absolutePath = absolutePath;    }}

第四步:创建文件浏览ChooseFileOrDirActivity

import android.Manifest;import android.app.Activity;import android.content.Intent;import android.content.pm.PackageManager;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.view.KeyEvent;import android.view.View;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;import com.rdsa.singleselectedfileorfolder.R;import java.io.File;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.List;public class ChooseFileOrDirActivity extends Activity {    public static final String EnterVar = "EnterVar";    public static final String ResultData = "SELECTED";    public static final int RequestCode = 888;    public static final int ResultCode = 999;    public static final int SingleFile = 1000;    public static final int SingleFolder = 2000;    public static final int MultiFile = 3000;    public static final int MultiFolder = 2001;    private String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath();    private static final int REQUESCODE = 5;    private static final String NEED_PERMISSION = Manifest.permission.WRITE_EXTERNAL_STORAGE;    private ListView listView4File;    private TextView noDataTip;    private Button btChose;    private List<String> data;    private ArrayList<FileOrDirBeans> fileOrDirList;    private FileAdapter fileAdapter;    private int enterVar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.ly_choose_file_or_folder);        this.enterVar = this.getIntent().getIntExtra(EnterVar, SingleFile);        this.initView();        this.initData();        this.initEvent();    }    private void initData() {        this.listView4File.setEmptyView(noDataTip);        this.data = new ArrayList<>();        this.fileOrDirList = new ArrayList<>();        this.fileAdapter = new FileAdapter(this, fileOrDirList, enterVar);        this.listView4File.setAdapter(fileAdapter);        if (Build.VERSION.SDK_INT >= 23) {      // 判断系统版本是否大于6.0            if (checkSelfPermission(NEED_PERMISSION) == PackageManager.PERMISSION_GRANTED) {  //检查是否有读写权限                loadDataFromPath(rootPath, enterVar);//从路径中加载数据            } else {                requestPermissions(new String[]{NEED_PERMISSION}, REQUESCODE); // 申请权限            }        } else {            loadDataFromPath(rootPath, enterVar);//系统版本小于6.0直接加载数据        }    }    private void loadDataFromPath(final String mPath, final int type) {        this.data.clear();    // data为 ListView 中要显示的数据        this.fileOrDirList.clear();        new Thread() {            public void run() {                super.run();                data = orderByName(mPath, type == SingleFolder || type == MultiFolder);                fileOrDirList = getBeans(data, type);                runOnUiThread(new Runnable() {@Overridepublic void run() {    fileAdapter.setData(data, fileOrDirList);//将数据载入适配器当中}                });            }        }.start();    }    private ArrayList<FileOrDirBeans> getBeans(List<String> fileList, final int type) {        ArrayList<FileOrDirBeans> resultList = new ArrayList<>();        for(String fileItem : fileList) {            File file = new File(fileItem);            String isFile = String.valueOf(file.isFile());            String isCheckVisible = (file.isFile() || type == SingleFolder || type == MultiFolder) ?  "true" : "false";;            FileOrDirBeans bean = new FileOrDirBeans(isFile, file.getName(), isCheckVisible, "false", fileItem);            resultList.add(bean);        }        return resultList;    }    private void initView() {        listView4File = findViewById(R.id.rvFileView);        noDataTip = findViewById(R.id.noDataTip);    }    private void initEvent() {        fileAdapter.setEvent(new FileAdapter.Event() {            @Override            public void enterNextDir(String path) {                rootPath = path;                loadDataFromPath(rootPath, enterVar);            }        });        findViewById(R.id.btChose).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent();                intent.putStringArrayListExtra(ResultData, fileAdapter.getSelectData());                setResult(ResultCode, intent);                finish();            }        });    }    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode == REQUESCODE && permissions[0].equals(NEED_PERMISSION)) {            loadDataFromPath(rootPath, enterVar);        }    }    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {//点击的是返回键            if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {//按键的按下事件                if (rootPath.trim().equals(Environment.getExternalStorageDirectory().getAbsolutePath())) {return super.onKeyDown(keyCode, event);                } else {File file = new File(rootPath);if (!file.exists()) {    return super.onKeyDown(keyCode, event);}rootPath = file.getParent();loadDataFromPath(rootPath, enterVar);return false;                }            }        }        return super.onKeyDown(keyCode, event);    }    public static ArrayList<String> orderByName(String filePath, boolean excludeFile) {        ArrayList<String> FileNameList = new ArrayList<String>();        File file = new File(filePath);        File[] files = file.listFiles();        List fileList = Arrays.asList(files);        Collections.sort(fileList, new Comparator<File>() {            @Override            public int compare(File o1, File o2) {                if (o1.isDirectory() && o2.isFile())return -1;                if (o1.isFile() && o2.isDirectory())return 1;                return o1.getName().compareTo(o2.getName());            }        });        for (File itemFile : files) {            if(itemFile.getName().startsWith(".")) {                continue;            } else {                if(itemFile.isFile() && excludeFile) {continue;                }                FileNameList.add(itemFile.getAbsolutePath());  //往集合中添加符合条件的数据            }        }        return FileNameList;    }}

第五步:创建ChooseFileOrDirActivity布局文件ly_choose_file_or_folder.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="50dp"        android:background="#F9F9FA">        <TextView            android:id="@+id/tvTitle"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerInParent="true" />        <Button            android:id="@+id/btChose"            android:layout_width="wrap_content"            android:layout_height="30dp"            android:layout_alignParentRight="true"            android:layout_centerVertical="true"            android:layout_marginRight="5dp"            android:background="@drawable/bg_button"            android:text="确定"            android:textColor="#458B74" />    </RelativeLayout>    <ListView        android:id="@+id/rvFileView"        android:layout_width="match_parent"        android:layout_height="match_parent" />    <TextView        android:id="@+id/noDataTip"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center_vertical|center_horizontal"        android:text="没有数据可用,返回上一层" /></LinearLayout>

第六步:创建ListView的数据容器类FileAdapter

import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.ImageView;import android.widget.TextView;import com.rdsa.singleselectedfileorfolder.R;import java.util.ArrayList;import java.util.List;public class FileAdapter extends BaseAdapter {    private Context context;    private Event event;    private ArrayList<String> selectData;    private ArrayList<FileOrDirBeans> fileOrDirList;    private LayoutInflater mLayoutInflater;      //   将 Item 的 XML 转换成 View    private final int enterVar;    public FileAdapter(Context context, final ArrayList<FileOrDirBeans> fileOrDirList, int enterVar) {        this.context = context;        this.selectData = new ArrayList<>();        this.mLayoutInflater = LayoutInflater.from(context);     // context 必须是界面所在的 context        this.enterVar = enterVar;        this.fileOrDirList = fileOrDirList;    }    @Override    public int getCount() {        return this.fileOrDirList.size();    }    @Override     // 数据项    public Object getItem(int position) {        return fileOrDirList.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    // 显示的内容    public View getView(final int position, View convertView, ViewGroup viewGroup) {        ViewHolder viewHolder;        if(convertView == null) {            convertView = mLayoutInflater.inflate(R.layout.filechoose_layout_fileitme, null);            viewHolder = new ViewHolder();            viewHolder.icon = convertView.findViewById(R.id.icon);            viewHolder.fileName = convertView.findViewById(R.id.fileName);            viewHolder.checkBox = convertView.findViewById(R.id.checkBox);            convertView.setTag(viewHolder);        } else {            viewHolder = (ViewHolder)convertView.getTag();        }        final FileOrDirBeans bean = fileOrDirList.get(position);        final String absPath = bean.getAbsolutePath();        bean.setIsChecked("false");    //   初始化一个boolean值 来判断是否被选中        for (String s : selectData) {    // 遍历选中的集合            if (s.trim().equals(absPath)) {    // 如果集合中的子元素与适配其中的路径相同                bean.setIsChecked("true");     // 判断已被选中                break; //终止循环            }        }        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {            @Override            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {//设置checkBox的点击事件                if (isChecked) {//选中状态if (selectData.contains(absPath)) {//如果集合中包含了该元素则直接返回    if (enterVar == ChooseFileOrDirActivity.SingleFile || enterVar == ChooseFileOrDirActivity.SingleFolder) {        selectData.clear();        selectData.add(absPath);    }} else {//否则添加    if(enterVar == ChooseFileOrDirActivity.SingleFile || enterVar == ChooseFileOrDirActivity.SingleFolder) {        selectData.clear();    }    selectData.add(absPath);}                } else {//未选中状态if (selectData.contains(absPath)) {//如果集合中包含了该元素则移除    selectData.remove(absPath);} else {//否则 返回    return;}                }                notifyDataSetChanged();            }        });        viewHolder.icon.setImageDrawable(Boolean.parseBoolean(bean.getIsFile()) ?  context.getResources().getDrawable(R.drawable._16_file) : context.getResources().getDrawable(R.drawable._16_folder));        viewHolder.fileName.setText(bean.getName());        viewHolder.checkBox.setVisibility((Boolean.parseBoolean(bean.isCheckVisible))?  View.VISIBLE : View.GONE);        viewHolder.checkBox.setChecked(Boolean.parseBoolean(bean.getIsChecked()));        viewHolder.fileName.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if(!Boolean.parseBoolean(bean.getIsFile())) {event.enterNextDir(fileOrDirList.get(position).getAbsolutePath());                }            }        });        return convertView;    }    static class ViewHolder {        private ImageView icon;        private TextView fileName;        private CheckBox checkBox;    }    public interface Event {        void enterNextDir(String path);//进入下一个文件夹    }    public void setData(List<String> data, ArrayList<FileOrDirBeans> fileOrDirList) {        this.fileOrDirList.clear();        this.fileOrDirList.addAll(fileOrDirList);        notifyDataSetChanged();    }    public void setEvent(Event event) {        this.event = event;    }    public ArrayList<String> getSelectData() {        return selectData;    }}

第七步:创建FileAdapter每一项的布局文件filechoose_layout_fileitme.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >    <ImageView        android:id="@+id/icon"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginStart="8dp"        android:layout_marginEnd="8dp"        android:layout_alignParentStart="true"        android:layout_centerVertical="true"        android:src="@drawable/file" />    <TextView        android:id="@+id/fileName"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginBottom="8dp"        android:layout_marginTop="8dp"        android:paddingRight="50dp"        android:layout_toRightOf="@+id/icon"        android:layout_centerVertical="true"        android:text="TextView"  />    <CheckBox        android:id="@+id/checkBox"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentEnd="true"        android:layout_centerVertical="true"        android:layout_marginEnd="8dp" /></RelativeLayout>

第八步:AndroidManifest 增加对文件操作的授权

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

第九步:用到的图片资源_16_file.jpg"和_16_folder.jpg"

  • 昌吉赣高铁通车了吗(确保昌吉赣客专年内建成通车)
  • 2024-06-02确保昌吉赣客专年内建成通车1月24日,省委常委、常务副省长毛伟明实地沿线察看昌吉赣客专项目建设现场,看望慰问一线建设人员,在峡江县出席项目调度推进会并讲话毛伟明指出,昌吉赣客专是我国南北高铁大动脉的重要组成部分,也是我省铁路“。
  • 福建贯彻5+2工作制(六中全会精神在基层)
  • 2024-06-02六中全会精神在基层晋江是福建省县域发展排头兵,创造了民营经济发展的“晋江经验”一个百万外来人口的城市,如何让外地人安心进城、稳定就业?一个全国最早成立县级慈善总会的城市,如何让公益覆盖城乡各个角落?一个拥有50家上市企。
  • 50个出自历史典故的成语(70个与历史人物相关的成语)
  • 2024-06-0270个与历史人物相关的成语中华文化博大精深,成语是其中一颗璀璨的明珠东山再起、胸有成竹、鞠躬尽瘁、一诺千金…你知道这些熟悉的成语涉及哪些历史人物吗?背后又有怎样的故事?…学习成语,不仅要记住意思,更要了解背后的渊源↓↓来源:人。
  • 外国人看新加坡春节活动(总台记者看世界)
  • 2024-06-02总台记者看世界总台记者看世界!大家好,我是总台驻新加坡记者邓雪梅先给各位拜年了,祝大家新年快乐,万事如意!正值兔年新春,我和我在世界各地的总台驻外记者同事们,都将为您带来总台记者看世界的新春特辑也希望借此机会,为您。
  • 爱莲君唱腔(爱莲君疙瘩腔集锦)
  • 2024-06-02爱莲君疙瘩腔集锦本文作者:筱贾爱莲君(1918-1939),评剧早期四大名旦之一,14岁组班“爱莲社”,16岁赴日灌制唱片,17岁名扬大上海,21岁与世长辞其个人命运是短暂和悲惨的,但她所创立的“爱派”艺术及“疙瘩腔。
  • 生死两茫茫故事(接连三人在深夜死亡)
  • 2024-06-02接连三人在深夜死亡本故事已由作者:眉似煤,授权每天读点故事app独家发布,旗下关联账号“深夜奇谭”获得合法转授权发布,侵权必究1今明市的夏季是由浸满热汗的背心,除不尽的霉菌,与过境的台风组成的罗春抵达今明市这一天,台风。
  • 光芒怀孕是哪一集(三集升职五集结婚)
  • 2024-06-02三集升职五集结婚这个9月,国产剧市场一片惨淡,可要说最惨的,还是张新成的新剧《光芒》原本被观众寄予厚望《余生请多指教》临时撤档,《光芒》空降开播,几乎零宣发,播出当晚毫无关注度紧急开播后,又因为湖南卫视的排播原因,播。
  • 元宵花灯制作(制作花灯的步骤)
  • 2024-06-02制作花灯的步骤拿出准备好的一只纸杯,如果纸杯上的图案是横竖均匀的图案最好,实在没有,可以在上面粘上一层装修图案然后用剪刀沿口至底方向,将纸杯均匀剪成大小一致的条状纵向剪好后,再对杯口边缘进行修剪,确保整齐、简洁可以。
  • 五个字的名字(有什么五个字的网名)
  • 2024-06-02有什么五个字的网名独奏奈何桥冰似绕指柔花开柳相依春江花月夜离别相思苦帘外雨潺潺独倚望江楼烟雨风飘渺清月聊无痕雪蝶宿秋风落梅如雪乱咫尺天涯间雪漫似穹天雨后云初霁忧蓝似残梦花落最伊颜愁挂斜阳树犹蓝的沧情何以竹萧默倚楼听风雨。
  • 剑网3哪个版本最好玩新手(剑网3壮志凌云版本有什么日常)
  • 2024-06-02剑网3壮志凌云版本有什么日常剑网3全新版本壮志凌云4月28日火热公测针对众多宠物收集控、成就党、挂件党等休闲玩家,新版本中也准备了三只全新的奇遇宠物和新声望永安行势力奉献给大家,下面6399小编就来介绍下剑网3壮志凌云版本新日常。
  • 云顶之弈最新版本龙魂阵容站位(11.3版本最新更新)
  • 2024-06-0211.3版本最新更新文/筱文聊电竞英雄联盟官方即将在2月4日进行一波更新,届时云顶之弈也会随着一起进行更新,让我们一起来看看这次云顶更新的内容吧,提前了解版本的变化首先是此次更新主要是龙魂羁绊的增强,天神羁绊的小幅度重做。
  • 我好方是什么梗(我好方解释)
  • 2024-06-02我好方解释“我好方”是“我好慌”谐音的说法,调侃f、h分的不太清楚的一种说法,意思为当遇到某些烦恼和懵逼的境况的时候的一种比较调侃的说法,类似于“宝宝心里苦”的含义除此之外,“我好方”一词也被用作“我有点方”的。