文档章节

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

切切歆语
 切切歆语
发布于 2017/01/03 15:12
字数 710
阅读 269
收藏 0

此案例主要说的是Android使用GridView加载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

© 著作权归作者所有

切切歆语
粉丝 22
博文 345
码字总数 235421
作品 0
杭州
程序员
私信 提问
系出名门Android(1) - 在 Windows 下搭建 Android 开发环境,以及 ...

系出名门Android(1) - 在 Windows 下搭建 Android 开发环境,以及 Hello World 程序 作者:webabcd 介绍 搭建 Android 的开发环境,以及写⼀个简单的示例程序 在 Windows 下搭建 Android 开发...

庸人谷
2012/12/27
115
0
加载assets下APK文件 及快速加载插件APK里面的资源

Android 系统为每个新设计的程序提供了/assets目录,这个目录保存的文件可以打包在程序里。/res 和/assets的不同点是,android不为/assets下的文件生成ID。如果使用/assets下的文件,需要指定...

desaco
01/09
0
0
在 Android 模拟器中启用摄像头支持

在Android中,默认创建的AVD不能使用照相机.如果你的程序用到了相机API,在模拟器中就不能正常工作.为了使用相机,SD卡必须在模拟器中定义. 在模拟器中打开相机,只需要在AVD’sconfig.inifi...

oschina
2013/04/28
31.9K
8
FileProvider无法获取外置SD卡问题解决方案 | Failed to find configured root that contains

随着Android版本越来越高,Android官方对用户数据保护力度也越来越大。Android提供FileProvider类来供应用之间共享数据。 如: FileProvider所支持的几种path类型 从Android官方文档上可以看...

丁佳辉
07/15
41
0
说说 Android 中如何使用摄像头和相册

很多 APP 应用都有用户头像功能,用户既可以调用摄像头马上拍一张美美的自拍,也可以打开相册选取一张心仪的照片作为头像。 1 调用摄像头 布局文件: 活动类代码: getExternalCacheDir() 可...

deniro
2018/05/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

新建作业20191011121223

2.编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound,Sally shouted,"By the Great Pumpkin,what was that!" #include<stdio.h>int main(){printf("\a");......

电子197朱妍
26分钟前
3
0
家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
47分钟前
6
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
48分钟前
6
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
50分钟前
10
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
54分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部