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);