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

废话没有,先看效果

Android 目录浏览支持文件夹、文件单选或者多选Android 目录浏览支持文件夹、文件单选或者多选

第一步:创建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() {
                    @Override
                    public 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.png和_16_folder.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至624739273@qq.com举报,一经查实,本站将立刻删除。
Like (0)
柳的头像

相关推荐

发表回复

Please Login to Comment
微信
微信
SHARE
TOP
要想花得少,就用购宝。话费电费9折起,官方公众号:购宝