美文网首页
音乐播放器

音乐播放器

作者: HOLLE_karry | 来源:发表于2020-03-31 18:10 被阅读0次

    1.MediaPlayer创建对象的两种方式

    •可以使用直接new的方式
    MediaPlayer mp = new MediaPlayer();
    •使用create的方式
    MediaPlayer mp = MediaPlayer.create(this, R.raw.test);

    2.MediaPlayer资源加载的方式

    •存储在SD卡
    •网络上的媒体文件
    •使用assets资源播放音乐
    •使用raw资源播放音乐

    3.MediaPlayer的常见api(Start、Stop、Prepare、Pause)

    •播放 start
    •暂停 pause
    •停止 stop
    •准备 prepare
    •重置 reset

    4.实现音乐播放,暂停,停止,继续

    @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_start:
                    player.reset();
                    String s = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Misc/rabbit.mp3";//获取音乐路径
                    try {
                        player.setDataSource(s);//设置
                        player.prepare();//准备
                        player.start();//播放
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case R.id.btn_stop:
                    player.stop();//停止
                    break;
                case R.id.btn_pause:
                    player.pause();//暂停
                    break;
                case R.id.btn_goon:
                    player.start();//继续
                    break;
            }
        }
    

    5.MediaPlayer使用assets资源播放音乐

    //打开Asset目录
    assetManager = getAssets();
    mediaPlayer = new MediaPlayer();
         try {
         //打开音乐文件shot.mp3
          AssetFileDescriptor assetFileDescriptor = assetManager.openFd("shot.mp3");
          mediaPlayer.reset();
          //设置媒体播放器的数据资源
          mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());
          mediaPlayer.prepare();
          mediaPlayer.start();
    

    6.MediaPlayer使用raw资源播放音乐

    MediaPlayer mediaPlayer=mediaPlayer.create(this, R.raw.music);
    

    7.assets和raw资源文件夹区别

    ①两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制文件---dex---apk
    ②res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID,即
    R.id.filename
    ③assets文件夹下的文件不会被映射到到R.java文件中,访问的时候需要AssetManager类
    ④res/raw不可以有目录,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
    ⑤InputStream is =getResources().openRawResource(R.id.filename);
    ⑥AssetManager am = getAssets();
    InputStream is = am.open("filename");

    8.结合SeekBar实现拖动播放音乐功能

    ①创建seekbar布局
    ②seekbar设置监听,在停止拖动中player.seekTo(seekBar.getProgress());
    ③更新seekbar

    private void updataProgress() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (player.isPlaying()) {
                        try {
                            Thread.sleep(1000);
                            seekbar_mp.setMax(player.getDuration());
                            seekbar_mp.setProgress(player.getCurrentPosition());
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
    }
    

    9.结合RecyclerView实现音乐播放上一首,下一首功能

    上一首:

    if (p > 0) {
        p--;
          } else {
              p = list.size() - 1;
         }
         try {
                player.reset();
                player.setDataSource(list.get(p).getPath());
                player.prepare();
                player.start();
                updataProgress();
            } catch (IOException e) {
                e.printStackTrace();
            }
    

    下一首:

    if (p < list.size() - 1) {
        p++;
           } else {
            p = 0;
        }
         try {
                player.reset();
                player.setDataSource(list.get(p).getPath());
                player.prepare();
                player.start();
                updataProgress();
            } catch (IOException e) {
                e.printStackTrace();
         }
    

    10.结合Service实现后台音乐播放功能

    ①创建一个服务AudioService
    ②服务中创建内部类AudioBinder,类中有一个方法返回服务类
    ③在onCreate()初始化MediaPlayer对象
    ④创建一系列关于mp的方法:播放、暂停、继续、停止、拖动
    ⑤在AudioActivity中绑定服务,返回服务类的对象
    ⑥按钮点击事件:通过服务类对象调用其方法实现音频播放
    ⑦seekbar进度改变监听,把进度传给mp

    //通过内容提供者获取音乐
    Cursor query = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
            while (query.moveToNext()) {
                String name = query.getString(query.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
                String path = query.getString(query.getColumnIndex(MediaStore.Audio.Media.DATA));
                list.add(new MusicBean(name, path));
            }
            adapter = new MusicAdapter(this, list);//创建适配器
            rv.setAdapter(adapter);//设置适配器
    //通过适配器点击事件来播放音乐
            adapter.setOnItemClickListener(new MusicAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(int position) {
                    p = position;
                    player.reset();
                    try {
                        player.setDataSource(list.get(p).getPath());
                        player.prepare();
                        player.start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
    

    相关文章

      网友评论

          本文标题:音乐播放器

          本文链接:https://www.haomeiwen.com/subject/ynwiuhtx.html