您的位置:首页 > 其它

【FileExplorer】文件管理器--------根据不同分类来获取对应的数据

2014-12-19 14:27 471 查看
闲来无事,看了下文件管理器的代码。本文先说一下根据不同的文件分类来获取对应的数据。分类有:音乐、视频、图片、文档、压缩包、安装包、收藏夹。

首先来看一下文件管理的入口类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;
}
至此,根据文件类型来获取数据,已完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐