【FileExplorer】文件管理器--------根据不同分类来获取对应的数据
2014-12-19 14:27
471 查看
闲来无事,看了下文件管理器的代码。本文先说一下根据不同的文件分类来获取对应的数据。分类有:音乐、视频、图片、文档、压缩包、安装包、收藏夹。
首先来看一下文件管理的入口类MainActivity.java. 首先来看onCreate() 方法。
上面线程类CategoryUpdateThread 中还有两个获取文件路径的方法,FileUtils.java 中的:
首先来看一下文件管理的入口类MainActivity.java. 首先来看onCreate() 方法。
private ViewPager mViewPager; <pre name="code" class="html">private ViewPagerAdapter mViewPagerAdapter;
private ActionBar actionbar;
public static ArrayList<String> musicFile = null; public static ArrayList<String> videoFile = null; public static ArrayList<String> imageFile = null; public static ArrayList<String> docFile = null; public static ArrayList<String> archiveFile = null; public static ArrayList<String> apkFile = null;
private Thread cthread = null; // add 20140212 private Object mLock = new Object();
@Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.file_explorer_activity); actionbar = getActionBar(); actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager()); mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mViewPagerAdapter); mViewPager.setOnPageChangeListener(mPageChangeListener); mViewPager.setOffscreenPageLimit(TAB_INDEX_COUNT); mViewPager.setCurrentItem(CATEGORY); actionbar.addTab( actionbar.newTab().setText(R.string.category).setTabListener(new MyTabListener()), CATEGORY, true); actionbar.addTab( actionbar.newTab().setText(R.string.folder).setTabListener(new MyTabListener()), FOLDER, false); musicFile = new ArrayList<String>(); videoFile = new ArrayList<String>(); imageFile = new ArrayList<String>(); docFile = new ArrayList<String>(); archiveFile = new ArrayList<String>(); apkFile = new ArrayList<String>(); /*delete start*/ if(null == cthread){ // add 20140212 cthread = new CategoryUpdateThread(); cthread.start(); } /*delete end*/ //init sortType for Category, Favorite, Folder Common.setSortType(Common.KEY_SORT_TYPE_FOR_CATEGORY, Common.DEFAULT_SORT_TYPE_FOR_CATEGORY); Common.setSortType(Common.KEY_SORT_TYPE_FOR_FAVORITE, Common.DEFAULT_SORT_TYPE_FOR_FAVORITE); Common.setSortType(Common.KEY_SORT_TYPE_FOR_FOLDER, Common.DEFAULT_SORT_TYPE_FOR_FOLDER); }初始化一些变量,启动线程CategoryUpdateThread类。
class CategoryUpdateThread extends Thread { public void run() { clear(); Log.d(FileUtils.TAG, "start to find files"); findAllFiles(FileUtils.getSDPath(MainActivity.this)); findAllFiles(FileUtils.getInternalPath()); //sortList(); // Send response message to UI thread Message msg = Message.obtain(handler, UPDATE_DONE); handler.sendMessage(msg); } }先清除分类信息clear();再查找所有的文件。
private void clear() { synchronized (mLock) { musicFile.clear(); videoFile.clear(); imageFile.clear(); docFile.clear(); archiveFile.clear(); apkFile.clear(); } }根据分类来查找数据:
private void findAllFiles(String path) { // modify,press 'back' key cause FC. 20140224 synchronized (mLock) { File f = new File(path); if (f.exists()) { /* add for bug11091 start 20140402*/ File[] files = null; try { files = f.listFiles(); } catch (Exception e) { e.printStackTrace(); Log.e(FileUtils.TAG, "huazhang_file counts are too much-->"+ f.getPath()); return; } /* hanhao add for bug11091 end 20140402*/ if (files != null) { for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { findAllFiles(files[i].getPath()); } else { /* hanhao add,donot show hidden file in category folder. start 20140403*/ if(files[i].isHidden()) { continue; } /* hanhao add,donot show hidden file in category folder. end 20140403*/ switch (Common.getFileType(files[i])) { case CategoryFragment.MUSIC: musicFile.add(files[i].getPath()); break; case CategoryFragment.VIDEO: videoFile.add(files[i].getPath()); break; case CategoryFragment.IMAGE: imageFile.add(files[i].getPath()); break; case CategoryFragment.DOC: docFile.add(files[i].getPath()); break; case CategoryFragment.ARCHIVE: archiveFile.add(files[i].getPath()); break; case CategoryFragment.APK: apkFile.add(files[i].getPath()); break; default: break; } } } } } } }
获取文件分类Common.java 中的 getFileType():
public static int getFileType(File f) { int type = -1; String fileName = f.getName(); String ext = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()).toLowerCase(); if (ext.equals("mp3") || ext.equals("amr") || ext.equals("wma") || ext.equals("aac") || ext.equals("m4a") || ext.equals("mid") || ext.equals("xmf") || ext.equals("ogg") || ext.equals("wav") || ext.equals("qcp") || ext.equals("awb") || ext.equals("3gpp")) {// Add support "3gpp" 20140127 type = CategoryFragment.MUSIC; } else if (ext.equals("3gp") || ext.equals("avi") || ext.equals("mp4") || ext.equals("3g2") || ext.equals("wmv") || ext.equals("divx") || ext.equals("mkv") || ext.equals("webm") || ext.equals("ts") || ext.equals("asf") || ext.equals("mov")|| ext.equals("flv")) { type = CategoryFragment.VIDEO; } else if (ext.equals("jpg") || ext.equals("jpeg") || ext.equals("gif") || ext.equals("png") || ext.equals("bmp") || ext.equals("wbmp")) { // Add support 'wbmp' 20140822 type = CategoryFragment.IMAGE; } else if (ext.equals("doc") || ext.equals("docx") || ext.equals("xls") || ext.equals("xlsx") || ext.equals("ppt") || ext.equals("pptx") || ext.equals("txt") || ext.equals("text")) { type = CategoryFragment.DOC; } else if (ext.equals("rar") || ext.equals("zip") || ext.equals("tar") || ext.equals("gz") || ext.equals("iso") || ext.equals("jar") || ext.equals("cab") || ext.equals("7z") || ext.equals("ace")) { type = CategoryFragment.ARCHIVE; } else if (ext.equals("apk")) { type = CategoryFragment.APK; } else { type = CategoryFragment.TOTAL; } return type; }文件类型的定义CategoryFragment.java中:
public static final int MUSIC = 0; public static final int VIDEO = 1; public static final int IMAGE = 2; public static final int DOC = 3; public static final int ARCHIVE = 4; public static final int APK = 5; public static final int FAVORITE = 6; public static final int TOTAL = 7;
上面线程类CategoryUpdateThread 中还有两个获取文件路径的方法,FileUtils.java 中的:
public static String getSDPath(Context context) { String sd = null; StorageManager mStorageManager = (StorageManager) context .getSystemService(Context.STORAGE_SERVICE); StorageVolume[] volumes = mStorageManager.getVolumeList(); for (int i = 0; i < volumes.length; i++) { if (volumes[i].isRemovable() && volumes[i].allowMassStorage()) { sd = volumes[i].getPath(); } } return sd; } public static String getInternalPath() { File sd = null; sd = Environment.getExternalStorageDirectory(); if (sd != null) { return sd.toString(); } else return null; }至此,根据文件类型来获取数据,已完成。
相关文章推荐
- 在JS中,将text框中数据格式化,根据不同的小数位数,格式化成对应的XXX,XXX,XXX.XX(2位小数) 或者XXX,XXX,XXX(0位小数)
- 根据不同的实体及其ID来获取数据库中的数据
- 根据参数远程获取不同的数据
- 必须根据不同的数据内容来套用不同的编码或是译码函式,以便取得对应的字节或是字符串数据
- 前端获取到后端数据后,要根据数据类型传输不同的属性值到后端,后端完成特殊业务处理
- 根据分类id,获取该分类下的商品数据(商品名,价格,路径,缩略图)
- 同样指令bmp.LockBits不同平台(Windows/WinCE)获取位图的数据不同
- 加载数据后,根据列值设置不同的行颜色
- 同样指令bmp.LockBits不同平台(Windows/WinCE)获取位图的数据不同
- 游标使用——获取每个分类的前10条数据
- Oracle 和 DB2 数据类型分类对应说明
- 同样指令bmp.LockBits不同平台(Windows/WinCE)获取位图的数据不同
- VB.NET中根据DataGridView中显示的数据条件数据行显示不同的颜色
- 在Winform中,获取DataGrid当前选定行对应的数据
- Delphi中根据分类数据生成树形结构的最优方法
- Oracle与DB2数据类型分类对应说明
- 在Winform中,获取DataGrid当前选定行对应的数据
- 同样指令bmp.LockBits不同平台(Windows/WinCE)获取位图的数据不同
- 在Winform中,获取DataGrid当前选定行对应的数据 (转)
- Delphi中根据分类数据生成树形结构的最优方法