Проверьте, существует ли обложка альбома? - PullRequest
0 голосов
/ 19 мая 2018

Я создаю приложение для музыкального плеера.Я пытаюсь заполнить recyclerView обложками альбомов песен.Я успешно сделал это с кодом, который приведен ниже.Но некоторые из песен не имеют встроенных обложек альбомов и обложек альбомов в папке.Итак, я пытаюсь проверить, является ли обложка альбома нулевой или нет, прежде чем добавить его в recyclerView.Если обложка альбома пуста, приложение автоматически загрузит ее из Интернета.Я пытался проверить, является ли обложка альбома нулевой или нет, но каждый раз он дает мне uri независимо от того, доступна обложка альбома или нет.

Код для извлечения обложки альбома из mediastore:

 String[] projection = {MediaStore.Audio.Media._ID,
            MediaStore.Audio.Media.TITLE,
            MediaStore.Audio.Media.ARTIST,
            MediaStore.Audio.Media.ALBUM,
            MediaStore.Audio.Media.DURATION,
            MediaStore.Audio.Media.DATA,
            MediaStore.Audio.Media.ALBUM_ID};
    Cursor cursor = getActivity().getContentResolver().query(uri, projection, selection, whereVal, null);
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID));
                String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
                Long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
                String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                Long albumId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));

                String albumArtUri = String.valueOf(ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"),albumId));


 SongInfoModel s = new SongInfoModel(id, name, artist, null, album, null, duration, data, albumId,albumArtUri);
                SongList.add(s);



            } while (cursor.moveToNext());
        }

Значение для albumArtUri никогда не равно нулю.

Оно всегда дает следующие значения uri:

content://media/external/audio/albumart/12
content://media/external/audio/albumart/5
content://media/external/audio/albumart/6
content://media/external/audio/albumart/3
content://media/external/audio/albumart/8
content://media/external/audio/albumart/9

Но среди этих uri content://media/external/audio/albumart/9 не имеет альбомаИзобразительное искусство.Он всегда отображает заполнитель, который я сказал, используя Glide

Итак, мой вопрос, как проверить, доступна ли обложка альбома (в виде встроенной обложки или в папке с песней) перед заполнением recyclerView?Я знаю, что могу использовать Glide заполнитель, и я использую его.Но я также хочу получить обложки альбомов из Интернета, если обложки альбомов недоступны в автономном режиме, поэтому мне нужно проверить, чтобы я мог добавить интернет-ссылки в массив.Надеюсь, вы, ребята, поняли, что я пытаюсь сказать.

Спасибо!

РЕДАКТИРОВАТЬ :

Я обнаружил, что приведенный ниже фрагмент кода возвращается, если обложка альбома существует или нет, но она потребляет многовремя.

  public String fetchAlbumArt(long albumID){

    String art;
    Cursor cur = getActivity().getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, new String[]
            {MediaStore.Audio.Albums.ALBUM_ART}, MediaStore.Audio.Albums._ID + "=?", new String[] {String.valueOf(albumID)}, null);

    cur.moveToFirst();
    art = cur.getString(cur.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));

    cur.close();

    return art;
}

Ответы [ 2 ]

0 голосов
/ 26 июля 2019

вы можете проверить обложку альбома, используя MediaMetadataRetriever, попробуйте код ниже, а также прочитайте документацию MediaMetadataRetriever

MediaMetadataRetriever retriver = new MediaMetadataRetriever();
retriver.setDataSource(musicFile.getAbsolutePath());
byte[] cover = retriver.getEmbeddedPicture();
if(cover == null){
  // get cover from the internet 
}else{
  // use glide to load the album art
}
0 голосов
/ 19 мая 2018

Самый простой способ:

                //  loading album cover using Glide library
            String stralbumId = c.getString(c
                    .getColumnIndex(BaseColumns._ID));

            Uri ImageUrl = getAlbumUri(mContext, stralbumId);
            if (ImageUrl != null) {
                Glide.with(mContext)
                        .asBitmap()
                        .load(ImageUrl)
                        .into(image);
            }

и

  public Uri getAlbumUri(Context mContext,String album_id){
if(mContext!=null) {
    Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
    Uri imageUri = Uri.withAppendedPath(sArtworkUri, String.valueOf(album_id));
    return imageUri;
}
return null;

}

...