0

所以我想在android中创建一个音乐播放器应用程序,其中的歌曲列表显示在自定义列表视图中。 此自定义列表视图包含(custom_list_view.xml):MediaPlayer在自定义列表视图中列出歌曲

  1. ImageView的专辑封面
  2. TextView的歌曲标题
  3. TextView的歌曲时长

我创建了一个Java类(SongDetails。 java),它设置并获取歌曲的这些属性。

我已经通过扩展ArrayAdapter类创建了一个适配器类(CustomAdapter.java)。

类MainActivity.java初始化CustomAdapter和avtivity_main.xml文件具有一个列表视图显示的歌曲

在MainActivty.java类中,addSongs下()方法,我已要求albumart。我想在列表视图中显示每首歌曲的专辑封面。但是这行会引发异常。我想这是因为设备上的专辑数量和歌曲数量不相等导致它抛出异常。我怎么能在ListView

这里添加专辑封面,每首歌曲是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

你在清单文件添加权限的图片? –

+0

就是这样。谢谢。您还可以帮助我如何为播放列表中的每首歌曲添加专辑封面。如果您注意到我在addSongs()方法中请求了MainActivity.java类中的专辑封面。但该应用程序会引发异常。我想这是因为专辑封面的数量和设备上的歌曲数量不相等导致它抛出异常。请告诉我如何为每首歌添加专辑封面 –

回答

0

的MediaStore.Media.Albums.ALBUM_ART具有字符串返回类型。所以在所有需要的地方用字符串替换整数都有诀窍。然后这个字符串转换为位图图像

Bitmap bm = BitmapFactory.decodeFile(String args); 

对于显示在ImageView的使用

imageView.setBitmapImage(bm);