第十八单元 使用MediaPlayer完成音乐播放器(内容提供者获得本地所有音频)

使用MediaPlayer完成音乐播放器

项目需求:

1.播放本地音乐:
2.播放网络音乐:
3.完成音乐列表,

MediaPlayer常用的方法:

void setDataSource(String path) :通过一个具体的路径来设置MediaPlayer的数据源,path可以是本地的一个路径,也可以是一个网络路径
int getCurrentPosition() 获取当前播放的位置
int getAudioSessionId() 返回音频的session ID
int getDuration() 得到文件的时间
boolean isLooping () 是否循环播放
boolean isPlaying() 是否正在播放
void pause () 暂停
void start () 开始
void stop () 停止
void prepare() 同步的方式装载流媒体文件。
void prepareAsync() 异步的方式装载流媒体文件。
void reset() 重置MediaPlayer至未初始化状态。
void release () 回收流媒体资源。
void seekTo(int msec) 指定播放的位置(以毫秒为单位的时间)
void setLooping(boolean looping) 设置是否单曲循环
setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 网络流媒体播放结束时回调
setOnErrorListener(MediaPlayer.OnErrorListener listener) 发生错误时回调 **
setOnPreparedListener(MediaPlayer.OnPreparedListener listener):当装载流媒体完毕的时候回调。

reset方法是将数据清空。 release方法是将媒体对象回收掉

MediaPlayer使用注意的地方:

尽量保证在一个App中只有MediaPalyer对象(单例模式)
在使用start()播放流媒体之前,需要装载流媒体资源。这里最好使用prepareAsync()用异步的方式装载流媒体资源。因为流媒体资源的装载是会消耗系统资源的,在一些硬件不理想的设备上,如果使用prepare()同步的方式装载资源,可能会造成UI界面的卡顿,这是非常影响用于体验的。因为推荐使用异步装载的方式,为了避免还没有装载完成就调用start()而报错的问题,需要绑定MediaPlayer.setOnPreparedListener()事件,它将在异步装载完成之后回调。异步装载还有一个好处就是避免装载超时引发ANR((Application Not Responding)错误。

详细代码:

public class MainActivity extends AppCompatActivity {
    private ListView list;
    private List<Sing> lists=new ArrayList<>();
    private ImageView imageView1;
    private ImageView imageView3;
    private ImageView imageView4;
    private MediaPlayer mediaPlayer;
    private Uri uri;
    private SeekBar seekBar;
    private MyAdapter myAdapter;
    private int a=-1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list = findViewById(R.id.list);
        imageView1 = findViewById(R.id.imageView1);
        imageView3 = findViewById(R.id.imageView3);
        imageView4 = findViewById(R.id.imageView4);
        mediaPlayer=new MediaPlayer();
        seekBar=findViewById(R.id.seek);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
        }else{
            videoMethod();
        }
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               a=position;
               sb(a);
            }
        });
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mediaPlayer.start();
            }
        });
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if(fromUser){
                    mediaPlayer.seekTo(progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
        list = findViewById(R.id.list);
        myAdapter=new MyAdapter(MainActivity.this,lists);
        list.setAdapter(myAdapter);
    }

    private void videoMethod() {
        ContentResolver contentResolver=getContentResolver();
        uri= MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        Cursor cursor=contentResolver.query(uri,null,null,null,null);
        while (cursor.moveToNext()){
            String name = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.TITLE));
            String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.ARTIST));
            String time = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DURATION));
            String address = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));
            lists.add(new Sing(name,singer,time,address));

        }
        myAdapter.notifyDataSetChanged();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode == 100 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            Log.i("TAG", "onRequestPermissionsResult: 读取成功");
            videoMethod();
        }
    }

    public void privices(View view) {
        a--;
        if(a>=0){
            sb(a);
        }
    }

    public void next(View view) {
        a++;
        if(a<lists.size()){
            sb(a);
        }
    }
    public void stop(View view) {
        mediaPlayer.pause();
    }


    public void sb(int i){
        try {
            mediaPlayer.reset();
            seekBar.setProgress(0);
            mediaPlayer.setDataSource(lists.get(i).getAddress());
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
                    seekBar.setMax(mediaPlayer.getDuration());
                    final Timer timer=new Timer();
                    timer.schedule(new TimerTask() {
                        @Override
                        public void run() {
                            int currentPosition = mediaPlayer.getCurrentPosition();
                            seekBar.setProgress(currentPosition);
                            if(currentPosition==mediaPlayer.getDuration()){
                                timer.cancel();
                                Log.i("TAG", "哈哈哈哈哈哈");
                            }
                        }
                    },0,1000);
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

    }
}

Music实体类:

public class Sing {
    private String name;
    private String singer;
    private String time;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSinger() {
        return singer;
    }

    public void setSinger(String singer) {
        this.singer = singer;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Sing() {
    }

    public Sing(String name, String singer, String time, String address) {
        this.name = name;
        this.singer = singer;
        this.time = time;
        this.address = address;
    }
}

适配器

public class MyAdapter extends BaseAdapter  {
    private Context context;
    private List<Sing> list;
    private LayoutInflater layoutInflater;

    public MyAdapter(Context context, List<Sing> list) {
        this.context = context;
        this.list = list;
        layoutInflater=LayoutInflater.from(context);
    }

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

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder=null;
        if(convertView==null){
            holder=new ViewHolder();
            convertView=layoutInflater.inflate(R.layout.list,parent,false);
            holder.text1=convertView.findViewById(R.id.text1);
            holder.text2=convertView.findViewById(R.id.text2);
            holder.text3=convertView.findViewById(R.id.text3);
            convertView.setTag(holder);
    }else{
            holder=(ViewHolder)convertView.getTag();
        }
        holder.text1.setText(list.get(position).getName());
        holder.text2.setText(list.get(position).getSinger());
        holder.text3.setText(list.get(position).getTime());

        return convertView;
    }
    class ViewHolder{
        private TextView text1;
        private TextView text2;
        private TextView text3;
    }
}

加入依赖

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值