Android 酷炫来袭:制作属于你自己的音频播放器(综合运用MediaPlayer、Service、Broadcast、ListView、SeekBar)

  这里写图片描述
  今天制作了一个属于自己的音乐播放器感觉还不错,分享出来,希望能够帮助大家。感觉知识点挺多的,也挺使用的,大大提高了个人兴趣,哈哈,我是程序员啊程序员。
为了有所侧重,我将注意点和学习点放在文章的最开篇。

一、学习重点与注意点

1、Mediaplayer的生命周期、相关方法及其使用
2、如何自定义SeekBar
3、接收广播的动态注册与注销
4、获取文件路径
5、获取歌曲的名称、作者名、图片
6、Service服务的使用

二、Mediaplayer介绍

  想要制作一个属于自己的风格样式的音乐播放器,首先我们要学会使用音乐播放器。

Mediaplayer的生命周期

具体的查看API,这里附一张生命周期图。
这里写图片描述
  Mediaplayer的证明周期中我们可以看出,Mediaplayer开始的时候需要调用reset()方法,然后是setDataResource()-prepare()-start()在MediaPlayer开启之后,我们可以让它暂停和停止等操作。
reset():将Mediaplayer对象重置到刚刚创建的状态。
setDataResource():设置要播放的音频文件的位置。
prepare():在开始播放之前调用这个方法完成准备工作(使用之前需要设置prepare监听)。
start():开始或继续播放音频文件
seekTo():从指定位置开始播放
stop():停止播放音频。
getDuration():获取载入的音频文件的时长
getCurrentPosition():获取音频文件的当前播放位置

简单的使用方法

点击按钮设置音频播放

public class MainActivity extends Activity implements OnClickListener{
   
    private Button mbtn_start;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mbtn_start=(Button) findViewById(R.id.bt_start);
        mbtn_start.setOnClickListener(this);
        //获取文件路径,如果我们不知道文件具体放在那里可以通过log打印出来

        File musicDir=Environment.getExternalStorageDirectory();
        Log.d("音乐", Environment.getExternalStorageDirectory().getAbsolutePath());

        musicDir = new File(musicDir, "/musics");

        Toast.makeText(getApplicationContext(), Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getAbsolutePath(),
                Toast.LENGTH_LONG).show();
        File[] files=musicDir.listFiles();//获取所有的文件
        for(File file:files){
            Log.d("路径", file.getAbsolutePath());
            }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bt_start:
        //new 一个新Mediaplayer对象,按照生命周期顺序操作
            MediaPlayer mediaplayer=new MediaPlayer();
            mediaplayer.reset();
            File musicDir=Environment.getExternalStorageDirectory();        

            File[] files=musicDir.listFiles();//获取所有的文件
            for(File file:files){
                Log.d("路径", file.getAbsolutePath());
            }
            try {

                mediaplayer.setDataSource(files[23].getAbsolutePath());
                mediaplayer.prepare();
                //设置prepare监听器,查看是否准备好,可以开始?
                mediaplayer.setOnPreparedListener(new OnPreparedListener() {

                    @Override
                    public void onPrepared(MediaPlayer mp) {              //准备好了之后开始播放
                        mp.start();

                    }
                });
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }               
            break;

        default:
            break;
        }
    }   
}

注意:我们还需要在manifest中获取读sdcard的权限。

三、制作音频播放器

Ⅰ 开启音乐并使音乐能够在后台运行

1、制作布局,ListView(+子布局+Adapter)+SeekBar+TextView+ToggleButton
2、循序渐进:书写MusicService类继承Service (这里别忘记在manifest中注册),为了保证音乐能够在后台运行,在之后的步骤中我们将在MusicService中创建线程,开启音乐。
3、开启MusicService:在MainActivity中获得文件路径,通过Intent的putStringArrayListExtra的方法传递给MusicService,并监听listview的item点击事件找到要播放的文件的position传递给Service。
4、在MusicService中创建线程,开启音乐

①布局+ListView+子布局+Adapter

在布局中我们顺便学习一下自定义SeekBar样式
新建xml文件,设置点击图片

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:drawable="@drawable/list_btn_radio_check_on" android:state_focused="true" android:state_window_focused="true"></item>
 <item android:drawable="@drawable/list_btn_radio_check_on" android:state_selected="true" android:state_window_focused="true"></item>
  <item android:drawable="@drawable/list_btn_radio_check_on" android:state_pressed="true" android:state_window_focused="true"></item>
   <item android:drawable="@drawable/list_btn_radio_check_off" ></item>
</selector>

SeekBar引用(通过设置Thumb)

  <SeekBar
        android:id="@+id/seekbar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:progress="20"
        android:thumb="@drawable/seekbarimg" 
        android:layout_weight="1"/>

Adapter


public class MusicAdapter extends BaseAdapter {
   
    private LayoutInflater minflate;
    //传递所有文件路径
    private File[] musicDirs;

    public MusicAdapter(LayoutInflater minflate, File[] musicDirs) {
        super();
        this.minflate = minflate;
        this.musicDirs = musicDirs;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return musicDirs.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder vh = null;
        if (convertView == null) {
            vh = new ViewHolder();
            convertView = minflate.inflate(R.layout.item_music_name, null);
            vh.mtextview = (TextView) convertView
                    .findViewById(R.id.textview_music_name);
            vh.mtextview_author = (TextView) convertView
                    .findViewById(R.id.textview_author_name);
            vh.img = (ImageView) convertView.findViewById(R.id.img);
            convertView.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
        }
        vh.mtextview.setText(musicDirs[position].getName());
        //通过MediaMetadataRetriever的对象来获取音频文件的
        //歌名、歌手、自带的图片
        Me
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值