MediaStore音乐媒体库
一、权限申请
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application android:requestLegacyExternalStorage="true"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
二、界面设计
ListView行布局
<ImageView
android:id="@+id/music_image"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:src="@mipmap/ic_launcher"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/music_title"
android:layout_width="197dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="音乐标题"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@+id/music_image"
app:layout_constraintTop_toTopOf="@+id/music_image" />
<TextView
android:id="@+id/music_artist"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="歌手名"
android:textSize="14sp"
app:layout_constraintStart_toStartOf="@+id/music_title"
app:layout_constraintTop_toBottomOf="@+id/music_title" />
<TextView
android:id="@+id/music_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:layout_marginEnd="32dp"
android:text="音乐时长"
android:textAlignment="textEnd"
android:textSize="14sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/music_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="4dp"
android:text="音乐id"
android:visibility="invisible"
app:layout_constraintStart_toEndOf="@+id/music_artist"
app:layout_constraintTop_toBottomOf="@+id/music_title" />
<TextView
android:id="@+id/music_url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="4dp"
android:text="音乐路径"
android:visibility="invisible"
app:layout_constraintStart_toEndOf="@+id/music_id"
app:layout_constraintTop_toBottomOf="@+id/music_title" />
主界面
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="音乐列表"
android:textSize="24sp" />
<ListView
android:id="@+id/music_list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
三、业务模型:Music类
public class Music {
int id;
String title;
String artist;
String url;
Bitmap picture;
int duration;
public Music(int id,Bitmap picture, String title, String artist, String url, int duration) {
this.id = id;
this.title = title;
this.artist = artist;
this.url = url;
this.picture=picture;
this.duration = duration;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Bitmap getPicture() {
return picture;
}
public void setPicture(Bitmap picture) {
this.picture = picture;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getDuration() {
return duration;
}
public void setDuration(int duration) {
this.duration = duration;
}
}
四、自定义Adapter:MusicAdapter
public class MusicAdapter extends ArrayAdapter<Music> {
private int resourceId;
public MusicAdapter(Context context, int resource, List<Music> objects) {
super(context, resource, objects);
resourceId=resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Music m = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
TextView music_id = (TextView) view.findViewById(R.id.music_id);
TextView music_title = (TextView) view.findViewById(R.id.music_title);
TextView music_artist = (TextView) view.findViewById(R.id.music_artist);
TextView music_url = (TextView) view.findViewById(R.id.music_url);
TextView music_duration = (TextView) view.findViewById(R.id.music_duration);
ImageView music_picture = (ImageView)view.findViewById(R.id.music_image);
music_id.setText(""+m.getId());
music_title.setText(m.getTitle());
music_artist.setText(m.getArtist());
music_url.setText(m.getUrl());
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
String time=sdf.format(m.getDuration());
music_duration.setText(time);
if(m.getPicture()!=null){
music_picture.setImageBitmap(m.getPicture());
}
return view;
}
}
五、MainActivity主要代码
public class MainActivity extends AppCompatActivity {
ListView listView;
List<Music> musicList = new ArrayList<Music>();
MediaPlayer mp=new MediaPlayer();
public void requirePermission() {
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED ) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, 100);
return;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requirePermission();
init_list();
playMusic();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if(requestCode==100){
if( grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED ) {
init_list();
playMusic();
}else{
}
}
}
public void init_list() {
listView = (ListView)findViewById(R.id.music_list);
musicList = getMusic_List();
MusicAdapter adapter = new MusicAdapter( MainActivity.this, R.layout.list_row, musicList );
listView.setAdapter(adapter);
}
public void playMusic() {
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView music_url=(TextView)view.findViewById(R.id.music_url);
try{
mp.reset();
mp.setDataSource(music_url.getText().toString());
mp.prepare();
mp.start();
}catch (Exception e){ }
}
});
}
public List<Music> getMusic_List() {
List<Music> tmp = new ArrayList<Music>();
Cursor cursor = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
MediaStore.Audio.Media.TITLE);
if ( cursor.moveToFirst() ){
while ( !cursor.isAfterLast() ) {
int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
String tilte =cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
String artist =cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
String url = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
long album_id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
Bitmap bitmap=getMusicBitemp(getApplicationContext(),id,album_id);
Music m=new Music(id,bitmap,tilte,artist,url,duration);
tmp.add(m);
cursor.moveToNext();
}
cursor.close();
}
return tmp;
}
private static final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
public static Bitmap getMusicBitemp(Context context, long id, long albumid) {
Bitmap bm = null;
if (albumid < 0 && id < 0) {
throw new IllegalArgumentException(
"Must specify an album or a song id");
}
try {
if (albumid < 0) {
Uri uri = Uri.parse("content://media/external/audio/media/"
+ id + "/albumart");
ParcelFileDescriptor pfd = context.getContentResolver()
.openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfd.getFileDescriptor();
bm = BitmapFactory.decodeFileDescriptor(fd);
}
} else {
Uri uri = ContentUris.withAppendedId(sArtworkUri, albumid);
ParcelFileDescriptor pfd = context.getContentResolver()
.openFileDescriptor(uri, "r");
if (pfd != null) {
FileDescriptor fd = pfd.getFileDescriptor();
bm = BitmapFactory.decodeFileDescriptor(fd);
} else {
return null;
}
}
} catch (FileNotFoundException ex) {
}
return bm;
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mp!=null ){
mp.stop();
mp.release();
}
}
}
六、运行结果