MediaPlayer список песен в пользовательском listview

Таким образом, я пытаюсь построить музыкальный плеер приложение в android, где список песен отображается в пользовательском listview.
Этот пользовательский listview содержит (custom_list_view.XML):

  1. ImageView для искусства альбома
  2. TextView для названия песни
  3. TextView для продолжительности песни

Я создал класс java (SongDetails.java), который устанавливает и получает эти атрибуты песни.

Я создал класс адаптера (CustomAdapter.java) путем расширения класса ArrayAdapter.

Класс MainActivity.java инициализирует CustomAdapter и avtivity_main.xml-файл имеет listview для отображения песен

В Главном.java class, под addSongs () метод, я запросил albumart. Я хотел показать обложку альбома для каждой песни в listview. Но эта строка создает исключение. Я думаю, это связано с тем, что количество альбомов и количество песен на устройстве неравны, что вызывает исключение. Как добавить обложку альбома для каждой песни в listview

Вот главное.класс Java

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{

private ListView songsList;
private ArrayList<String> myList = new ArrayList<String>();
private final int MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE = 1;
private ArrayAdapter<String> arrayAdpt;
private ArrayList<String> filepath = new ArrayList<String>();
private ArrayList<String> filename = new ArrayList<String>();
private ArrayList<SongDetails> songDetailsArrayList = new ArrayList<SongDetails>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    songsList = (ListView)findViewById(R.id.songs_list_view);

    seekPermissions();
}

public void seekPermissions() {
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE);
        return;
    }
    addSongs();
}


public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch(requestCode) {
        case MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE:
        {
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                addSongs();
            }
            else {
                seekPermissions();
            }
            return;
        }
    }
}


public void addSongs() {
    String[] requestColumns = {MediaStore.Audio.Media.TITLE,
            MediaStore.Audio.Media.DURATION,
            MediaStore.Audio.Media.DATA,
            MediaStore.Audio.Albums.ALBUM_ART,};
    Cursor cur = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, requestColumns, null, null, null);

    int name = cur.getColumnIndex(MediaStore.Audio.Media.TITLE);
    int length = cur.getColumnIndex(MediaStore.Audio.Media.DURATION);
    int path = cur.getColumnIndex(MediaStore.Audio.Media.DATA);
    int albart = cur.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART);
    SongDetails mySongDetails;
    cur.moveToFirst();

    while(!cur.isAfterLast()) {

        mySongDetails = new SongDetails(cur.getString(name), cur.getInt(albart), cur.getInt(length));
        mySongDetails.setSongDuration(cur.getInt(length));
        myList.add(cur.getString(name)+"t"+cur.getInt(length));
        filepath.add(cur.getString(path));
        mySongDetails.setSongTitle(cur.getString(name));
        filename.add(cur.getString(name));
        mySongDetails.setAlbumArt(cur.getInt(albart));
        songDetailsArrayList.add(mySongDetails);
        cur.moveToNext();
    }
    songsList.setAdapter(new CustomAdapter(this, songDetailsArrayList));
}
}

1 ответ

  1. MediaStore.Медиафайлы.Альбомы.ALBUM_ART имеет возвращаемый тип String. Таким образом, замена целых чисел строками во всех необходимых местах сделала трюк. А затем преобразовать эту строку в растровое изображение

    Bitmap bm = BitmapFactory.decodeFile(String args);
    

    Для показа изображений на ImageView используйте

    imageView.setBitmapImage(bm);