Android加载SD卡目录,文件夹遍历,图片设置,设置文件对应打开方式等

Stella981
• 阅读 606

此案例主要说的是Android使用GridView加载SD卡下所有目录,文件夹多层遍历,文件图标修改,设置文件对应打开方式等功能。

如图:

        Android加载SD卡目录,文件夹遍历,图片设置,设置文件对应打开方式等

public class GridViewFile extends Activity implements View.OnClickListener {

    private Context context;
    private TextView tv_title, textView;
    private GridView listView;
    private final String MUSIC_PATH = "/";

    // 记录当前路径下 的所有文件的数组
    File currentParent;
    // 记录当前路径下的所有文件的文件数组
    File[] currentFiles;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        initView();
    }

    public void initView() {
        findViewById(R.id.public_top_img_close).setOnClickListener(this);
        listView = (GridView) findViewById(R.id.gridview);
        textView = (TextView) findViewById(R.id.llss);
        onLoad();
    }

    public void onLoad() {
        ListSongsName();

    }

    private void ListSongsName() {

        // 获取系统的SD卡目录
        File root = new File(MUSIC_PATH);
        // 如果SD卡存在
        if (root.exists()) {
            currentParent = root;
            currentFiles = root.listFiles();// 获取root目录下的所有文件
            // 使用当前陆慕下的全部文件,文件夹来填充ListView
            inflateListView(currentFiles);
        }
        // 为ListView的列表项的单击事件绑定监视器
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // 用户点击了文件,则调用手机已安装软件操作该文件
                if (currentFiles[position].isFile()) {
                    onError(currentFiles[position].getPath() + "1");
                    Intent intent = OpenFile.openFile(currentFiles[position]
                            .getPath());
                    startActivity(intent);
                } else {

                    // 获取currentFiles[position]路径下的所有文件
                    File[] tmp = currentFiles[position].listFiles();
                    if (tmp == null || tmp.length == 0) {
                        Toast.makeText(GridViewFile.this, "空文件夹!",
                                Toast.LENGTH_SHORT).show();
                    }// if
                    else {
                        // 获取用户单击的列表项对应的文件夹,设为当前的父文件夹
                        currentParent = currentFiles[position];
                        // 保存当前文件夹内的全部问价和文件夹
                        currentFiles = tmp;
                        inflateListView(currentFiles);
                    }
                }
            }
        });

    }

    // 更新列表
    private void inflateListView(File[] files) {
        if (files.length == 0)
            Toast.makeText(GridViewFile.this, "sd卡不存在", Toast.LENGTH_SHORT)
                    .show();
        else {
            // 创建一个List集合,List集合的元素是Map
            List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
            for (int i = 0; i < files.length; i++) {
                Map<String, Object> listItem = new HashMap<String, Object>();
                // 如果当前File是文件夹,使用folder图标;否则使用file图标
                Log.i("path", files[i].getPath());
                Log.i("path", files[i].getName());
                if (files[i].isDirectory())
                    listItem.put("icon", R.drawable.file_wenjianjia);
                // else if(files[i].isFi)
                else
                    listItem.put("icon", R.drawable.file_wenjian1);
                listItem.put("fileName", files[i].getName());
                // 添加List项
                listItems.add(listItem);
            }
            // 创建一个SimpleAdapter
            SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
                    R.layout.acheshi_item, new String[] { "icon", "fileName" },
                    new int[] { R.id.imageView1, R.id.text_path });
            // 位ListView设置Adpter
            listView.setAdapter(simpleAdapter);
            try {
                textView.setText("当前路径为:" + currentParent.getCanonicalPath());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onClick(View v) {
        onbey();
    }

    // 返回上层菜单
    private void onbey() {
        try {
            if (!MUSIC_PATH.equals(currentParent.getCanonicalPath())) {
                // 获取上一层目录
                currentParent = currentParent.getParentFile();
                // 列出当前目录下的所有文件
                currentFiles = currentParent.listFiles();
                // 再次更新ListView
                inflateListView(currentFiles);
            } else {
                new AlertDialog.Builder(this)
                        .setIcon(R.drawable.ic_launcher)
                        .setTitle("提示")
                        .setMessage("确定要退出吗?")
                        .setPositiveButton("确定",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog,
                                            int which) {
                                        finish();
                                    }
                                })
                        .setNegativeButton("取消",
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog,
                                            int which) {
                                    }
                                }).create().show();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onError(Object error) {
        Toast.makeText(getApplicationContext(), error + "", Toast.LENGTH_LONG)
                .show();
    }

    protected void onDestroy() {
        super.onDestroy();
    }

}

不要忘记在AndroidManifest.xml加权限哦!

 <!-- SD卡权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

源码点击下载:https://github.com/DickyQie/android-file

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java——20171121
!(http://a.51jsoft.com/uploads/default/original/1X/c542896b094a42a5653fb75adf6cdacd6e35d12e.png)!(https://static.oschina.net/uploads/space/2017/1121/210719_G80Z_3715033.png)
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
3年前
Android入门:使用Android自带媒体库读取MP3文件
今天研究了下如何在Android读取SD卡中的媒体文件(MP3),开始的思路是遍历SD卡所有目录,相信这也是所有开发者第一会想到的思路,无法就是遍历所有文件,将所有后缀名为.mp3读取出来;但是最后发现,如果你对Android稍有了解,你会发现,其实媒体扫描这个工作,Android设置已经替我们干了,Android系统会在SD卡有更新的时候自动将SD卡文件分
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Redis Cluster in Ubuntu
1\.首先,进到Redisserver 的位置,确认Redisserver 可以正常启动!(https://oscimg.oschina.net/oscnet/fb11911e35266a35f5b62dcbf9b02288c97.png)2. 在 redis5.0.3 目录下创建文件夹redisCluster\_Demo\_byMe
Wesley13 Wesley13
3年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这