【发布时间】:2017-01-14 09:12:39
【问题描述】:
所以我正在尝试在 android 中构建一个音乐播放器应用程序,其中歌曲列表显示在自定义列表视图中。 此自定义列表视图包含 (custom_list_view.xml):
- 专辑封面的 ImageView
- 歌曲标题的TextView
- 歌曲时长的TextView
我创建了一个 java 类 (SongDetails.java) 来设置和获取歌曲的这些属性。
我通过扩展 ArrayAdapter 类创建了一个适配器类 (CustomAdapter.java)。
MainActivity.java 类初始化 CustomAdapter,avtivity_main.xml 文件有一个列表视图来显示歌曲
在 MainActivty.java 类的 addSongs() 方法下,我请求了专辑封面。我想在列表视图中显示每首歌曲的专辑封面。但是这一行抛出了一个异常。我猜这是因为设备上的专辑封面数量和歌曲数量不相等导致它抛出异常。如何为列表视图中的每首歌曲添加专辑封面
这是 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));
}
}
【问题讨论】:
-
您是否在清单文件中添加了权限?
-
就是这样。谢谢你。您还可以帮我如何为播放列表中的每首歌曲添加专辑封面。如果您注意到我在 addSongs() 方法中的 MainActivity.java 类中请求了专辑封面。但是该应用程序会引发异常。我想这是因为专辑封面的数量和设备上的歌曲数量不相等导致它抛出异常。请告诉我如何为每首歌曲添加专辑封面
-
你能放你的自定义适配器代码吗?
标签: android listview media-player mediastore android-music-player