【发布时间】:2013-12-11 15:44:49
【问题描述】:
我想访问歌曲详细信息,包括artist、album、duration、title、display name 等。
这可以通过在EXTERNAL_CONTENT_URI 查询外部存储中的文件来完成,但我无法使用INTERNAL_CONTENT_URI 从内部存储中查询文件。
过去两天我一直坚持这一点。这是我的代码:
void loadPlayList(){
ArrayList<Song> list = null;
try{
list = new ArrayList<Song>();
Uri uri;
//if(SplashScreen.getDirPrefs())
uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
//else
//Uri uri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI;
String[] m_data = {MediaStore.Audio.Media.ALBUM_ID,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DURATION,MediaStore.Audio.Media.TRACK,MediaStore.Audio.Media.DISPLAY_NAME};
Cursor c = getApplicationContext().getContentResolver().query(uri, m_data, MediaStore.Audio.Media.IS_MUSIC+"=1", null, null);
PlayerManager pm = new PlayerManager();
//Log.e("vmplayer loadPlayList ", "cursor : "+c.getCount());
for(c.moveToFirst();!c.isAfterLast();c.moveToNext())//while(c.moveToNext())
{
String str = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));
str = str.substring(0, (str.length() - 4));
for(int i = 0; i < GlobalClass.songList.size(); i++)
{
Song sn = GlobalClass.songList.get(i);
//Log.e("vmplayer loadPlayList ", "str : "+str);
if(sn.name.equalsIgnoreCase(str))
{
sn.title = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
sn.album = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
sn.albumId = c.getLong(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
sn.artist = c.getString(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
sn.duration = pm.milliSecondsToTimer((long)(c.getInt(c.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION))));
//Log.e("vmplayer loadPlayList ", "dur : "+sn.duration);
Bitmap art = null;
try{
Uri contentUri = Uri.parse("content://media/external/audio/albumart");
Uri albumUri = ContentUris.withAppendedId(contentUri,c.getLong(c.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID)));
ContentResolver res = getApplicationContext().getContentResolver();
InputStream in = res.openInputStream(albumUri);
art = BitmapFactory.decodeStream(in);
//art = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(),albumUri);
//art = Bitmap.createScaledBitmap(art, 100, 100, true);
}
catch(FileNotFoundException e){
Log.e("vmplayer loadPlayList ", "err1 :"+e);
art = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.artwork);
}
catch(Exception e){
Log.e("vmplayer loadPlayList err2", ""+e);
art = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.artwork);
}
//Log.e("vmplayer loadPlayList art", "bit map : "+art);
sn.coverImg = art;
list.add(sn);
}
}
}
GlobalClass.songList.clear();
GlobalClass.songList = list;
Log.e("loadPlayList", "cont : "+GlobalClass.songList.size());
c.close();
}
catch(Exception e){
Log.e("vmplayer loadPlayList err", ""+e);
}
}
提前谢谢..
【问题讨论】:
-
它应该可以工作我个人尝试过它可以工作 INTERNAL_CONTENT_URI 请再次检查代码
-
如果它不起作用,请提供 WRITE 和 READ 权限。我从未使用过许可。它在没有提供的情况下对我有用。但请尝试一下。
标签: android android-mediaplayer android-file