方法一、递归列出SD卡路径下的所有文件,若该文件是视频文件,则将其加入到结果列表中。最终,结果列表中即保存所有的视频文件。部分代码如下:
List<File> mFiles = new ArrayList<File>();
private void getAllVideoFiles(File root) {
File[] files = root.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
getAllVideoFiles(file);
} else {
if (isVideo(file)) {
mFiles.add(file);
}
}
}
}
}
private boolean isVideo(File file) {
String name = file.getName();
int pos = name.lastIndexOf(".");
if (pos != -1) {
String suffix = name.substring(pos+1).toLowerCase();
if (suffix.equals("mp4") ||
suffix.equals("3gp") ||
suffix.equals("avi")) {
return true;
}
}
return false;
}
由于该方法要遍历所有文件,所有比较低效。
方法二、使用操作系统的ContentProvider进行查询,代码如下:
public class MainActivity extends Activity {
private ListView mListView;
private List<String> mFileNames;
private List<String> mFilePaths;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!LibsChecker.checkVitamioLibs(this)) {
return;
}
setContentView(R.layout.activity_main);
this.mListView = (ListView) findViewById(R.id.lv);
getAllVideoFiles();
this.mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, this.mFileNames));
this.mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent(MainActivity.this, VideoActivity.class);
intent.putExtra("path", mFilePaths.get(position));
startActivity(intent);
}
});
}
private void getAllVideoFiles() {
this.mFileNames = new ArrayList<String>();
this.mFilePaths = new ArrayList<String>();
Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
// 文件名称
String name = cursor.getString(cursor.getColumnIndex(Media.DISPLAY_NAME));
this.mFileNames.add(name);
// 文件路径
byte[] data = cursor.getBlob(cursor.getColumnIndex(Media.DATA));
this.mFilePaths.add(new String(data, 0, data.length-1));
}
}
}
这种方法即简单又高效。