千家信息网

在Android怎么快速完成简易的音乐播放器

发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,这篇文章将为大家详细讲解有关在Android怎么快速完成简易的音乐播放器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现过程导入项目所需的音乐文件、图标、背景等1
千家信息网最后更新 2024年11月18日在Android怎么快速完成简易的音乐播放器

这篇文章将为大家详细讲解有关在Android怎么快速完成简易的音乐播放器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

实现过程

导入项目所需的音乐文件、图标、背景等

1.创建一个raw文件夹,将音乐文件导入到这个文件夹中,方便我们在项目中使用

2.在drawable中导入所需的图片、图标

设计UI界面

1.设计5个button控件,分别对应上一曲,下一曲,暂停,播放,退出

2.设计3个TextView,分别对应歌曲的介绍信息、歌曲的进度(歌曲的总时间和歌曲当前播放的时间)、歌曲的名字

service服务的编写
创建一个MusicService对象继承Service

MusicService所需要的成员变量

MyReceiver serviceReceiver;Thread processThread;AssetManager am;//是附件管理器,用于根据文件名找到文件所在并打开文件String[] musics = new String[]{"legendsneverdie.mp3", "promise.mp3",        "beautiful.mp3"};//默认显示的歌曲信息MediaPlayer mPlayer;// 当前的状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停int status = 0x11;// 记录当前正在播放的音乐int current = 0;

实现循环播放

public void onCreate() {        super.onCreate();        am = getAssets();        // 创建BroadcastReceiver        serviceReceiver = new MyReceiver();        // 创建IntentFilter        IntentFilter filter = new IntentFilter();        filter.addAction(MainActivity.CTL_ACTION);        registerReceiver(serviceReceiver, filter);        // 创建MediaPlayer        mPlayer = new MediaPlayer();        // 为MediaPlayer播放完成事件绑定监听器        mPlayer.setOnCompletionListener(new OnCompletionListener()        {            @Override            public void onCompletion(MediaPlayer mp) {                Log.d("musicService", "播放完成");                current++;                if (current >= 3) {                    current = 0;                }                // 准备并播放音乐                prepareAndPlay(musics[current]);                //发送广播通知Activity更改文本框                Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);                sendIntent.putExtra("current", current);                sendIntent.putExtra("currentTime", mPlayer.getCurrentPosition());                sendIntent.putExtra("totalTime", mPlayer.getDuration());                // 发送广播,将被Activity组件中的BroadcastReceiver接收到                sendBroadcast(sendIntent);            }        });    private void prepareAndPlay(String music) {        try {            // 打开指定音乐文件            AssetFileDescriptor afd = am.openFd(music);            mPlayer.reset();            // 使用MediaPlayer加载指定的声音文件。            mPlayer.setDataSource(afd.getFileDescriptor(),                    afd.getStartOffset(), afd.getLength());            // 准备声音            mPlayer.prepare();            // 播放            mPlayer.start();        } catch (IOException e) {            e.printStackTrace();        }    }

实现刷新进度条

processThread = new Thread(new Runnable() {        @Override        public void run() {            while (true) {                if (status == 0x12) {                    try {                        Thread.sleep(1000);                        Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);                        sendIntent.putExtra("current", current);                        sendIntent.putExtra("currentTime", mPlayer.getCurrentPosition());                        sendIntent.putExtra("totalTime", mPlayer.getDuration());                        // 发送广播,将被Activity组件中的BroadcastReceiver接收到                        sendBroadcast(sendIntent);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }    });    processThread.start();}

广播通信接收器的实现(用于实现和activity的通信)

public class MyReceiver extends BroadcastReceiver {    @Override    public void onReceive(final Context context, Intent intent) {        int control = intent.getIntExtra("control", -1);        Log.d("musicReceiver", "收到广播, control=" + control);        switch (control) {            // 播放或暂停            case 1:                // 原来处于没有播放状态                if (status == 0x11) {                    // 准备并播放音乐                    prepareAndPlay(musics[current]);                    status = 0x12;                }                // 原来处于播放状态                else if (status == 0x12) {                    // 暂停                    mPlayer.pause();                    // 改变为暂停状态                    status = 0x13;                }                // 原来处于暂停状态                else if (status == 0x13) {                    // 播放                    mPlayer.start();                    // 改变状态                    status = 0x12;                }                break;                // 下一首            case 2:                if (status == 0x12 || status == 0x13) {                    mPlayer.stop();                    if (current + 1 >= musics.length) {                        current = 0;                    } else {                        current++;                    }                    prepareAndPlay(musics[current]);                    status = 0x12;                    break;                }                // 上一首            case 3:                if (status == 0x12 || status == 0x13) {                    mPlayer.stop();                    if (current - 1 < 0) {                        current = musics.length - 1;                    } else {                        current--;                    }                    prepareAndPlay(musics[current]);                    status = 0x12;                }        }        // 广播通知Activity更改图标、文本框        Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);        sendIntent.putExtra("update", status);        sendIntent.putExtra("current", current);        // 发送广播,将被Activity组件中的BroadcastReceiver接收到        sendBroadcast(sendIntent);    }}

activity的实现

初始化和动态绑定接收器

// 获取界面中显示歌曲标题、作者文本框TextView title, author, currentTime, totalTime;// 播放/暂停、停止按钮ImageButton play;ImageView lastMusic, nextMusic;// 进度条ProgressBar progressBar;ActivityReceiver activityReceiver;public static final String CTL_ACTION =        "org.xr.action.CTL_ACTION";public static final String UPDATE_ACTION =        "org.xr.action.UPDATE_ACTION";// 定义音乐的播放状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停int status = 0x11;String[] titleStrs = new String[]{"Legends Never Die", "约定", "美丽新世界"};String[] authorStrs = new String[]{"英雄联盟", "周蕙", "伍佰"};@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    // 获取程序界面界面中的两个按钮    play = (ImageButton) this.findViewById(R.id.play);    lastMusic = this.findViewById(R.id.lastMusic);    nextMusic = this.findViewById(R.id.nextMusic);    title = (TextView) findViewById(R.id.title);    author = (TextView) findViewById(R.id.author);    currentTime = findViewById(R.id.currentTime);    totalTime = findViewById(R.id.totalTime);    progressBar = findViewById(R.id.progressBar);    // 为两个按钮的单击事件添加监听器    play.setOnClickListener(this);    lastMusic.setOnClickListener(this);    nextMusic.setOnClickListener(this);    activityReceiver = new ActivityReceiver();    // 创建IntentFilter    IntentFilter filter = new IntentFilter();    // 指定BroadcastReceiver监听的Action    filter.addAction(UPDATE_ACTION);    // 注册BroadcastReceiver    registerReceiver(activityReceiver, filter);    Intent intent = new Intent(this, MusicService.class);    // 启动后台Service    startService(intent);}

设置activity的广播接收器(接收service发送过来的广播)

public void onReceive(Context context, Intent intent) {    // 获取Intent中的update消息,update代表播放状态    int update = intent.getIntExtra("update", -1);    // 获取Intent中的current消息,current代表当前正在播放的歌曲    int current = intent.getIntExtra("current", -1);    int totalPosition = intent.getIntExtra("totalTime", -1);    int currentPosition = intent.getIntExtra("currentTime", -1);    Log.d("activityReceiver", "收到广播");    Log.d("activityReceiver", "current:" + current + " totalPosition:" + totalPosition + " currentPosition:" + currentPosition + " update:" + update);    if (current >= 0) {        title.setText(titleStrs[current]);        author.setText(authorStrs[current]);    }    if (totalPosition >= 0) {        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss", Locale.CHINA);        Date date = new Date(totalPosition);        String formatTime = simpleDateFormat.format(date);        totalTime.setText(formatTime);    }    if (currentPosition >= 0) {        double process = ((double)currentPosition / totalPosition)*100;        Log.d("activityReceiver", "当前进度:" + (double)currentPosition/totalPosition);        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss", Locale.CHINA);        Date date = new Date(currentPosition);        String formatTime = simpleDateFormat.format(date);        progressBar.setProgress((int) process);        currentTime.setText(formatTime);    }    switch (update) {        case 0x11:            play.setImageResource(R.drawable.play);            status = 0x11;            break;        // 控制系统进入播放状态        case 0x12:            // 播放状态下设置使用暂停图标            play.setImageResource(R.drawable.pause);            // 设置当前状态            status = 0x12;            break;        // 控制系统进入暂停状态        case 0x13:            // 暂停状态下设置使用播放图标            play.setImageResource(R.drawable.play);            // 设置当前状态            status = 0x13;            break;    }}

实现图标的点击功能

// 创建Intent    Intent intent = new Intent("org.xr.action.CTL_ACTION");    switch (source.getId()) {        // 按下播放/暂停按钮        case R.id.play:            intent.putExtra("control", 1);            break;        case R.id.lastMusic:            intent.putExtra("control", 3);        case R.id.nextMusic:            intent.putExtra("control", 2);    }    // 发送广播,将被Service组件中的BroadcastReceiver接收到    sendBroadcast(intent);}

关于"在Android怎么快速完成简易的音乐播放器"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

0