AndroidStudio音乐媒体库示例ContentResolver

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; //音乐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); // 获取当前项的Music实例
//获取行布局及其各个元素
        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()); //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(); // 初始化ListView
        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); //按标题升序排序
//遍历cursor
        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);
//创建音乐对象,并添加到list中
                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");
    /**
     * 将MP3里图片读取出来
     *
     * @param context
     * @param id
     * @param albumid
     * @return
     */
    public static Bitmap getMusicBitemp(Context context, long id, long albumid) {
        Bitmap bm = null;
// 专辑id和歌曲id小于0说明没有专辑、歌曲,并抛出异常
        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();
        }
    }
}

六、运行结果

在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值