SD卡文件浏览器

    SD卡文件浏览器,主要练习:如何获取SD卡的文件目录。

    由于真机带有内置SD卡,

      File root = Environment.getExternalStorageDirectory(); 
            这条语句获取到的是内置SD卡的文件目录,外置SD卡(真正的SD卡)文件目录并没有获取到。

    获取外置SD卡文件目录的方法参考:获取外置SD卡路径的方法

    现有代码(获取到的是内置SD卡)如下:


布局文件:

activity_main.xml:

<RelativeLayout 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"
     >

    <TextView
        android:id="@+id/path"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentTop="true" />
    
    <ListView
        android:id="@+id/listView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:divider="#000"
        android:dividerHeight="1px"
        android:layout_below="@+id/path"
        />
    
    <Button 
        android:id="@+id/parent"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:background="@drawable/parent"
        />
    
</RelativeLayout>


line.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="horizontal" >
    
    <ImageView
        android:id="@+id/file_icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        />
    <TextView
        android:id="@+id/file_name"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        />

</LinearLayout>

Java部分代码:

MainActivity.java:

package com.example.sdfileexplorer;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	ListView listView;
	TextView textView;
	File currentParent;
	File[] currenFiles;
	String finalPath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.listView);
        textView = (TextView) findViewById(R.id.path);
        //获取系统的SD卡的目录
        File root = Environment.getExternalStorageDirectory();
        //如果SD卡存在
        if (root.exists()) {
        	currentParent = root;
        	currenFiles = root.listFiles();
        	//获得SD卡的路径,保存为String类型
        	try {
				finalPath = root.getCanonicalPath();
			} catch (IOException e) {
				e.printStackTrace();
			}
        	//使用当前目录下的全部文件、文件夹来填充ListView
        	inflateListView(currenFiles);
        }
        //为ListView列表项的单击事件绑定监听器
        listView.setOnItemClickListener(new OnItemClickListener() {
        	@Override
        	public void onItemClick(AdapterView<?> parent, View view, int position,
        			long id) {
        		//用户单击了文件,直接返回,不做任何处理
        		if (currenFiles[position].isFile()){
        			return;
        		}
        		//获取用户单击的文件夹下的所有文件
        		File[] tmp = currenFiles[position].listFiles();
        		if (tmp ==null || tmp.length == 0) {
        			Toast.makeText(MainActivity.this, "当前路径不可访问或该路径下没有文件", Toast.LENGTH_SHORT).show();
        		}
        		else {
        			//获取用户单击的列表项对应的文件夹,设为当前的父文件夹
        			currentParent = currenFiles[position];
        			//保存当前的父文件夹内的全部文件和文件夹
        			currenFiles = tmp;
        			//再次更新ListView
        			inflateListView(currenFiles);
        		}
        	}
		});
        //获取上一级目录的按钮
        Button parent = (Button) findViewById(R.id.parent);
        parent.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View source) {
				try {
					if (currentParent.getCanonicalPath().equals(finalPath)) {
						Toast.makeText(MainActivity.this, "已经到底了", Toast.LENGTH_SHORT).show();
					}
					if (!currentParent.getCanonicalPath().equals(finalPath)) {
						//获取上一级目录
						currentParent = currentParent.getParentFile();
						currenFiles = currentParent.listFiles();
						inflateListView(currenFiles);
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		});
    }
    
    private void inflateListView(File[] files) {
    	//创建一个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图标
    		if (files[i].isDirectory()) {
    			listItem.put("icon", R.drawable.folder);
    		}
    		else {
    			listItem.put("icon", R.drawable.file);
    		}
    		listItem.put("name", files[i].getName());
    		listItems.add(listItem);
    	}
    	//创建一个SimpleAdapter
    	SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,R.layout.line, new String[]{"icon","name"}, new int[]{R.id.file_icon,R.id.file_name});
    	listView.setAdapter(simpleAdapter);
    	try {
    		textView.setText("当前路径为:"+currentParent.getCanonicalPath());
		} catch (IOException e) {
			e.printStackTrace();
		}
    	
    }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值