0

Ainsi j'essaye de construire une application de joueur de musique dans android où la liste des chansons est montrée dans un listview fait sur commande. Cette listview personnalisée contient (custom_list_view.xml):MediaPlayer énumérant des chansons dans la liste personnalisée

  1. ImageView pour l'art de l'album
  2. TextView pour le titre de la chanson
  3. TextView pour la durée de la chanson

J'ai créé une classe java (SongDetails. java) qui définit et obtient ces attributs d'une chanson.

J'ai créé une classe d'adaptateur (CustomAdapter.java) en étendant la classe ArrayAdapter.

La MainActivity.java classe initialise le CustomAdapter et le fichier avtivity_main.xml a un ListView pour afficher les chansons

Dans la classe MainActivty.java, selon la méthode addSongs(), je l'ai demandé AlbumArt. Je voulais afficher des pochettes d'album pour chaque chanson de la liste. Mais cette ligne jette une exception. Je suppose que c'est parce que le nombre d'albums et le nombre de chansons sur l'appareil sont inégaux, ce qui provoque une exception. Comment puis-je ajouter des pochettes d'album pour chaque chanson dans le listview

Voici la classe MainActivity.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

Avez-vous ajouté l'autorisation dans le fichier manifeste? –

+0

C'était tout. Je vous remercie. Pourriez-vous également m'aider à ajouter des pochettes d'album pour chaque chanson de la liste de lecture. Si vous remarquez que j'ai demandé la pochette d'album dans la classe MainActivity.java dans la méthode addSongs(). Mais l'application jette une exception. Je suppose que c'est parce que le nombre de pochettes d'albums et le nombre de chansons sur l'appareil sont inégaux, provoquant des exceptions. S'il vous plaît dites-moi comment ajouter une pochette d'album pour chaque chanson –

Répondre

0

Le MediaStore.Media.Albums.ALBUM_ART a un type de retour de chaîne. Donc, remplacer les entiers par des chaînes dans tous les endroits requis a fait l'affaire. Et puis convertir cette chaîne à l'image bitmap

Bitmap bm = BitmapFactory.decodeFile(String args); 

Pour montrer les images sur l'utilisation ImageView

imageView.setBitmapImage(bm);