一个简单的本地音乐播放器案例

该文章描述了一个简单的Android音乐播放器的实现,包括请求读写外部存储权限,布局设计,使用ContentResolver获取音乐信息,创建音乐属性类,使用MediaPlayer播放音乐,以及ListView适配器的实现。此外,还涉及了按钮点击事件处理,如播放/暂停、快进、倒退等操作。
摘要由CSDN通过智能技术生成

首先添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

并在主方法中请求权限:

 requestPermissions(new String[]{
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE,
        },119);

开始布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="10"></ListView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/now_tv"
            android:text="当前进度"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"></TextView>
        <SeekBar
            android:id="@+id/seekbar"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"></SeekBar>
        <TextView
            android:id="@+id/all_tv"
            android:text="总进度"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"></TextView>
    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/artist_art"
            android:src="@mipmap/ic_launcher"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"></ImageView>

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/title_tv"
                android:text="歌曲"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"></TextView>

            <TextView
                android:layout_marginTop="20dp"
                android:id="@+id/artist_tv"
                android:text="演唱者"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"></TextView>

        </LinearLayout>

        <ImageView
            android:src="@drawable/pre"
            android:layout_width="0dp"
            android:layout_height="70dp"
            android:layout_weight="1"></ImageView>
        <ImageView
            android:id="@+id/rewind_iv"
            android:src="@drawable/rewind"
            android:layout_width="0dp"
            android:layout_height="70dp"
            android:layout_weight="1"></ImageView>
        <CheckBox
            android:id="@+id/play_iv"
            android:button="@null"
            android:background="@drawable/playorpause"
            android:layout_width="0dp"
            android:layout_height="70dp"
            android:layout_weight="1"></CheckBox>
        <ImageView
            android:id="@+id/forword_iv"
            android:src="@drawable/forward"
            android:layout_width="0dp"
            android:layout_height="70dp"
            android:layout_weight="1"></ImageView>
        <ImageView
            android:src="@drawable/last"
            android:layout_width="0dp"
            android:layout_height="70dp"
            android:layout_weight="1"></ImageView>
        <ImageView
            android:id="@+id/mode_iv"
            android:src="@drawable/pop"
            android:layout_width="0dp"
            android:layout_height="70dp"
            android:layout_weight="1"></ImageView>

    </LinearLayout>

</LinearLayout>

通过软件自带的图片查找

 

 

开始按钮的drawable选择xml文件

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/play" android:state_checked="false"></item>
    <item android:drawable="@drawable/pause" android:state_checked="true"></item>
</selector>

把音乐文件放在手机目录下

 在MainActivity类的onCreate方法中通过ContentResolver获取音乐的属性

ContentResolver contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
        if (cursor!=null){
            while (cursor.moveToNext()){
                String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
                String data = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
                String duration = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
                String size = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));
                String album_id = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
                String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
                }
            }

    }

创建音乐属性的封装类



public class Music {
    private String title,artist,size,album_art,data,duration;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getArtist() {
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public String getAlbum_art() {
        return album_art;
    }

    public void setAlbum_art(String album_art) {
        this.album_art = album_art;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getDuration() {
        return duration;
    }

    public void setDuration(String duration) {
        this.duration = duration;
    }

    public Music(String title, String artist, String size, String album_art, String data, String duration) {
        this.title = title;
        this.artist = artist;
        this.size = size;
        this.album_art = album_art;
        this.data = data;
        this.duration = duration;
    }
}

再创建一个管理类使用单例模式创建

import android.media.MediaPlayer;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class MusicManager {
    List<Music> musicList = new ArrayList<>();
    MediaPlayer mediaPlayer = new MediaPlayer();
    int index = 0;
    private MusicManager() {
    }

    private static MusicManager musicManager = null;
    public static MusicManager getInstance(){
        if (musicManager==null){
            musicManager=new MusicManager();
        }
        return musicManager;
    }
}

再通过album_id属性获取音乐的封面

if (Integer.parseInt(duration)>5000){
                    Uri uri = Uri.parse("content://media/external/audio/albums/"+album_id);
                    Cursor cursor1 = contentResolver.query(uri,  null, null, null,null);
                    while (cursor1.moveToNext()){
                        String album_art = cursor1.getString(cursor1.getColumnIndexOrThrow("album_art"));
                        int i = Integer.parseInt(duration);
                        String time = i/1000/60+":"+i/1000%60;
                        Music music = new Music(title, artist, size, album_art, data, time);
                        MusicManager.getInstance().musicList.add(music);
                    }
                }

为listView创建item布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/artist_ivv"
        android:src="@mipmap/ic_launcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"></ImageView>

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="70dp">

        <TextView
            android:text="歌曲"
            android:id="@+id/title_tvv"
            android:layout_alignParentTop="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"></TextView>

        <TextView
            android:text="演唱者"
            android:id="@+id/artist_tvv"
            android:layout_alignParentBottom="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"></TextView>

        <TextView
            android:text="时间"
            android:id="@+id/time_tvv"
            android:layout_alignParentRight="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"></TextView>

    </RelativeLayout>

</LinearLayout>

实例化listView后定义适配器并设置适配器


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class MyBaseAdapter extends BaseAdapter {
    Context context;
    List<Music> musicList;

    public MyBaseAdapter(Context context, List<Music> musicList) {
        this.context = context;
        this.musicList = musicList;
    }

    @Override
    public int getCount() {
        return musicList.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHoulder viewHoulder = new ViewHoulder();
        if (convertView==null){
            convertView= LayoutInflater.from(context).inflate(R.layout.item,null);
            viewHoulder.artist_ivv=convertView.findViewById(R.id.artist_ivv);
            viewHoulder.artist_tvv=convertView.findViewById(R.id.artist_tvv);
            viewHoulder.title_tvv=convertView.findViewById(R.id.title_tvv);
            viewHoulder.time_tvv=convertView.findViewById(R.id.time_tvv);
            convertView.setTag(viewHoulder);
        }else {
            viewHoulder = (ViewHoulder) convertView.getTag();
        }
        viewHoulder.title_tvv.setText(musicList.get(position).getTitle());
        viewHoulder.time_tvv.setText(musicList.get(position).getDuration());
        viewHoulder.artist_tvv.setText(musicList.get(position).getArtist());
        Bitmap bitmap = BitmapFactory.decodeFile(musicList.get(position).getAlbum_art());
        viewHoulder.artist_ivv.setImageBitmap(bitmap);
        return convertView;
    }

    public class ViewHoulder{
        TextView time_tvv,artist_tvv,title_tvv;
        ImageView artist_ivv;
    }
}

最后设置其他按钮的点击事件进度条的拖拽和快进按钮歌曲的点击播放

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                MusicManager.getInstance().play(position);
                title_tv.setText(MusicManager.getInstance().musicList.get(position).getTitle());
                artist_tv.setText(MusicManager.getInstance().musicList.get(position).getArtist());
                Toast.makeText(MainActivity.this,"开始播放",Toast.LENGTH_SHORT).show();
            }
        });
        play_iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MusicManager.getInstance().playorpause();
            }
        });

        forword_iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MusicManager.getInstance().forword();
            }
        });

        rewind_iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MusicManager.getInstance().rewind();
            }
        });

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser){
                    MusicManager.getInstance().seekto(progress);
                }

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        timer=new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        int now = MusicManager.getInstance().getnow();
                        int all = MusicManager.getInstance().getall();
                        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");
                        now_tv.setText(simpleDateFormat.format(now));
                        all_tv.setText(simpleDateFormat.format(all));
                    }
                });
            }
        },0,111);

        mode_iv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PopupWindow popupWindow = new PopupWindow();
                popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
                popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
                popupWindow.setOutsideTouchable(true);
                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.pop, null);
                popupWindow.setContentView(view);
                popupWindow.showAsDropDown(mode_iv,50,-300);
            }
        });


import android.media.MediaPlayer;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class MusicManager {
    List<Music> musicList = new ArrayList<>();
    MediaPlayer mediaPlayer = new MediaPlayer();
    int index = 0;
    private MusicManager() {
    }

    private static MusicManager musicManager = null;
    public static MusicManager getInstance(){
        if (musicManager==null){
            musicManager=new MusicManager();
        }
        return musicManager;
    }


    public void play(int i){
        index = i;
        mediaPlayer.reset();
        try {
            mediaPlayer.setDataSource(musicList.get(index).getData());
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void playorpause(){
        if (mediaPlayer.isPlaying()){
            mediaPlayer.pause();
        }else {
            mediaPlayer.start();
        }
    }

    public void forword(){
        if (mediaPlayer.isPlaying()){
            int currentPosition = mediaPlayer.getCurrentPosition();
            currentPosition+=5000;
            mediaPlayer.seekTo(currentPosition);
        }
    }

    public void rewind(){
        if (mediaPlayer.isPlaying()){
            int currentPosition = mediaPlayer.getCurrentPosition();
            currentPosition-=5000;
            if (currentPosition<0){
                currentPosition=0;
            }
            mediaPlayer.seekTo(currentPosition);
        }
    }

    public void seekto(int i){
        mediaPlayer.seekTo(i);
    }

    public int getnow(){
        if (mediaPlayer.isPlaying()){
            return mediaPlayer.getCurrentPosition();
        }
        return 0;
    }

    public int getall(){
        if (mediaPlayer.isPlaying()){
            return mediaPlayer.getDuration();
        }
        return 0;
    }

}

效果

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值