我真的需要一些帮助!
我想在Android上制作MP3播放器,因此我需要在存储中找到所有MP3文件。
所以我用我的get MP3方法递归搜索它们:
private void getMP3Files(Context context, String directory,ArrayList<MusicListArray> mp3_list){
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
Uri uri;
byte[] album_art;
Bitmap bitmap;
/*File[] files = Directory.listFiles(new MP3FileNameFilter());
files = Directory.listFiles();*/
File folder = new File(directory);
for (File file : folder.listFiles()) {
if (file.isFile()) {
if (file.getName().endsWith(".mp3") || file.getName().endsWith(".MP3")) {
uri = Uri.fromFile(file);
mediaMetadataRetriever.setDataSource(context,uri);
String artist = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
String title = file.getName();
album_art = mediaMetadataRetriever.getEmbeddedPicture();
if(album_art != null){
bitmap = BitmapFactory.decodeByteArray(album_art, 0, album_art.length);
}else{
bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher);
}
if(bitmap == null){
bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher);
}
if (title.indexOf(".") > 0)
title = title.substring(0, title.lastIndexOf("."));
if(artist == null){
artist = getString(R.string.unknown_artist);
}
mp3_list.add(new MusicListArray(title,artist,file,bitmap));
}
}else if(file.isDirectory()){
getMP3Files(context, file.getPath(), mp3_list);
}
}
Collections.sort(mp3_list);
/*for(int i=0;i<files.length;i++){
mp3_list.add(new MusicListArray(files[i].getName(),"Test",files[i]));
}*/
//return mp3_list;
}
这非常慢,每次启动我的应用程序时都需要3秒钟。
第一个问题:如何减少花费的时间? 第二个问题:如何将列表保存在文件中并加载它?
提前致谢!
答案 0 :(得分:1)
我建议您使用SQL数据库来存储mp3的元数据(包括文件位置)。我应该警告你,我在Android上没有媒体经验。基本理念:
1)首次使用(或在设置中手动同步)进行完整的3秒同步 - &gt;查看SharedPreferences
以存储指示首次使用您的应用的密钥
2)将此元信息存储在SQL数据库中。
3)从数据库中读取应用程序,因为这要快得多,特别是如果表格设计正确的话。存储封面艺术,文件位置,艺术家,标题等内容。您还可以添加诸如收听次数和内容等内容。此外,如果将SQL层包装到内容提供程序中,则可以对所有音乐执行自定义搜索。
4)当应用程序运行时,运行后台索引服务,找到新音乐,更正更改/删除等。查看android Service
这样做的好处是,您的应用程序对用户来说要快得多,只需要在前台加载一次所有数据,并在搜索,歌曲选择,自定义数据等方面为您提供更多灵活性。