【问题标题】:How to get songs and other media from an Album ID?如何从专辑 ID 中获取歌曲和其他媒体?
【发布时间】:2015-09-01 17:49:25
【问题描述】:

我想从专辑 ID 中获取歌曲和其他 MEDIA 详细信息。我只有专辑 ID,我尝试了很多解决方案,但都没有成功。

我的代码sn-p:

ContentResolver contentResolver = getContentResolver();
        Uri mediaUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, albumId);
        Log.wtf("SKJDBKJ", mediaUri.toString());
        Cursor mediaCursor = contentResolver.query(mediaUri, null, null, null, null);

        // if the cursor is null.
        if(mediaCursor != null && mediaCursor.moveToFirst())
        {
            Log.wtf("DSJK", "entered cursor");
            //get Columns
            int titleColumn = mediaCursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM);
            int idColumn = mediaCursor.getColumnIndex(MediaStore.Audio.Media._ID);
            int artistColumn = mediaCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);

            // Store the title, id and artist name in Song Array list.
            do
            {
                long thisId = mediaCursor.getLong(idColumn);
                String thisTitle = mediaCursor.getString(titleColumn);
                String thisArtist = mediaCursor.getString(artistColumn);
                Log.wtf("Title", thisTitle);

                // Add the info to our array.
                songArrayList.add(new Song(thisId, thisTitle, thisArtist));
            }
            while (mediaCursor.moveToNext());

            // For best practices, close the cursor after use.
            mediaCursor.close();
        }

mediaUri 的日志返回当前专辑的路径,例如:content://media/external/audio/media/41。 有人告诉我该怎么做吗?

【问题讨论】:

    标签: android android-mediaplayer


    【解决方案1】:

    我自己完成了。您可以在 contentResolver.query 上为“选择”字符串编写简单的 sqlite 查询。此示例可以向您展示如何按专辑 ID 获取歌曲。我认为这是最好的方法。

        ArrayList<Song> songs = new ArrayList<>();
        String selection = "is_music != 0";
    
        if (albumId > 0) {
            selection = selection + " and album_id = " + albumId;
        }
    
        String[] projection = {
                MediaStore.Audio.Media.TITLE,
                MediaStore.Audio.Media.ARTIST,
                MediaStore.Audio.Media.DATA,
                MediaStore.Audio.Media.DISPLAY_NAME,
                MediaStore.Audio.Media.DURATION,
                MediaStore.Audio.Media.ALBUM,
                MediaStore.Audio.Media.ALBUM_ID
        };
        final String sortOrder = MediaStore.Audio.AudioColumns.TITLE + " COLLATE LOCALIZED ASC";
    
        Cursor cursor = null;
        try {
            Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            cursor = getActivity().getContentResolver().query(uri, projection, selection, null, sortOrder);
            if (cursor != null) {
                cursor.moveToFirst();
                int position = 1;
                while (!cursor.isAfterLast()) {
                    Song song = new Song();
                    song.setTitle(cursor.getString(0));
                    song.setDuration(cursor.getLong(4));
                    song.setArtist(cursor.getString(1));
                    song.setPath(cursor.getString(2));
                    song.setPosition(position);
                    song.setAlbumId(cursor.getLong(6));
    
                    cursor.moveToNext();
                }
            }
    
        } catch (Exception e) {
            Log.e("Media", e.toString());
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    

    【讨论】:

      【解决方案2】:

      经过大量的试验和错误,我自己弄清楚了。我不知道这是否是最好和最安全的方法,但就它的工作而言,我很高兴。

      我稍微更改了代码并比较了专辑 ID。这是sn-p:

      ContentResolver contentResolver = getContentResolver();
              Uri mediaUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
              Log.wtf("SKJDBKJ", mediaUri.toString());
              Cursor mediaCursor = contentResolver.query(mediaUri, null, null, null, null);
      
              // if the cursor is null.
              if(mediaCursor != null && mediaCursor.moveToFirst())
              {
                  Log.wtf("DSJK", "entered cursor");
                  //get Columns
                  int titleColumn = mediaCursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
                  int idColumn = mediaCursor.getColumnIndex(MediaStore.Audio.Media._ID);
                  int artistColumn = mediaCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
                  int albumId = mediaCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID);
      
                  // Store the title, id and artist name in Song Array list.
                  do
                  {
                      long thisId = mediaCursor.getLong(idColumn);
                      long thisalbumId = mediaCursor.getLong(albumId);
                      String thisTitle = mediaCursor.getString(titleColumn);
                      String thisArtist = mediaCursor.getString(artistColumn);
      
                      // Add the info to our array.
                      if(this.albumId == thisalbumId)
                      {
                          Log.wtf("SAME2SAME", String.valueOf(thisalbumId));
                          Log.wtf("SAME2SAME", String.valueOf(this.albumId));
                          songArrayList.add(new Song(thisId, thisTitle, thisArtist));
                      }
                  }
                  while (mediaCursor.moveToNext());
      
                  // For best practices, close the cursor after use.
                  mediaCursor.close();
              }
      

      我变了:

      1. AlbumsMediaMediaStore.Audio.Audio.xxx
      2. 得到了Mediaalbum Id
      3. 与我从bundle extras 收到的album Id 相比。
      4. 仅在arrayList 中添加这些歌曲。 我想这也是Artists 的方式。

      【讨论】:

      • 如何从专辑 ID 中获取专辑封面
      【解决方案3】:

      当你将 cursor.movenext 函数放入 while 循环时,第一行 MediaStore 数据库将在不保存数据的情况下传递,因为该函数移动光标然后检查,因此最好生成一个值而不是将 movenext 函数放入 while。

        try {
                  Projection = new String[]{
                  MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ALBUM
                  , MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media.DATA,                                    MediaStore.Audio.Media.SIZE};
      
                  Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, Projection, null, null, null);
      
                  cursor.moveToFirst();
      
                  for (int i = 0; i < 5; i++) {
                      columns[i] = cursor.getColumnIndex(Projection[i]);
                  }
      
                  Music tempMusic = new Music();
      
                  while (next) {
                      tempMusic.setName(cursor.getString(columns[0]));
                      tempMusic.setAlbum(cursor.getString(columns[1]));
                      tempMusic.setArtist(cursor.getString(columns[2]));
                      tempMusic.setUri(cursor.getString(columns[3]));
                      tempMusic.setSize(cursor.getDouble(columns[4]));
                      if(!cursor.moveToNext())
                      {
                          next=false;
                      }
                      musicss.add(tempMusic);
      
                      tempMusic = new Music();
                  }
      

      【讨论】:

        【解决方案4】:
         public Bitmap getAlbumArt(Long albumId) {
                Bitmap albumArt = null;
                try {
                    final Uri AlbumArtUri = Uri.parse("content://media/external/audio/albumart");
                    Uri uri = ContentUris.withAppendedId(AlbumArtUri, albumId);
                    ParcelFileDescriptor pfd = GlobalSongList.getInstance().getContentResolver().openFileDescriptor(uri, "r");
        
                    if (pfd != null) {
                        FileDescriptor fd = pfd.getFileDescriptor();
                        albumArt = BitmapFactory.decodeFileDescriptor(fd);
                    }
                } catch (Exception e) {
                }
                return albumArt;
            }
        

        ALBUM_ID 是 MediaStore 中的一个字段,您可以像查询标题、艺术家等一样查询它。

            public Long getAlbumId(String id)
            {
                Cursor musicCursor;
                String[] mProjection = {MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ALBUM_ID};
                String[] mArgs = {id};
                musicCursor = musicResolver.query(musicUri, mProjection, MediaStore.Audio.Media._ID + " = ?", mArgs, null);
                musicCursor.moveToFirst();
                Long albumId=musicCursor.getLong(musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
                return albumId;
            }
        

        【讨论】:

          【解决方案5】:

          我就是这样做的。 完美运行。

          String selection= MediaStore.Audio.Media.IS_MUSIC+"!=0";
              String[] projection={
                      MediaStore.Audio.Media._ID,
                      MediaStore.Audio.Media.DATA,
                      MediaStore.Audio.Media.TITLE,
                      MediaStore.Audio.Media.ARTIST,
                      MediaStore.Audio.Media.ALBUM,
                      MediaStore.Audio.Albums.ALBUM_ID,
                      MediaStore.Audio.Media.DURATION
              };
          
              Cursor cursor=getActivity().managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,projection,selection,null,"title asc");
              List<String> data=new ArrayList<>();
              List<String> songs=new ArrayList<>();
              List<String> artists=new ArrayList<>();
              List<String> albums=new ArrayList<>();
              List<String> album_id=new ArrayList<>();
              List<String> durations=new ArrayList<>();
          
              cursor.moveToFirst();
              while (cursor.moveToNext()){
                  if(cursor.getString(5).equals(mAlbumId)) {
                      data.add(cursor.getString(1));
                      songs.add(cursor.getString(2));
                      artists.add(cursor.getString(3));
                      albums.add(cursor.getString(4));
                      album_id.add(mAlbumId);
                      durations.add(cursor.getString(6));
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多