【问题标题】:How can i query uri for the song from the internal memory我如何从内部存储器中查询歌曲的uri
【发布时间】:2013-12-11 15:44:49
【问题描述】:

我想访问歌曲详细信息,包括artistalbumdurationtitledisplay 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


【解决方案1】:

我认为是你的安卓版本造成的。

我写了和你一样的代码。它在 Android 5.0.1 上运行,但在 Android 2.3.6 上崩溃。如果您的 Android 版本太旧,我认为您应该尝试另一种方法在内部存储中查询。

【讨论】:

  • 我尝试了我的另一个 android 设备,它是 2.3.6。但该应用程序在它上面工作。也许只是设备的问题。或者操作系统已被修改,导致您无法在内部存储中打开数据库。顺便说一句,我可以从应用程序失败的手机中提取数据库。我可以通过 SQLite Expert 打开数据库。数据库存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多