首页 > 其他分享 >移动技术开发:音乐播放器

移动技术开发:音乐播放器

时间:2024-10-01 09:49:32浏览次数:7  
标签:播放器 音乐 广播 private 技术开发 new import android 播放

1 实验名称

       音乐播放器

2 实验目的

       掌握使用Service启动服务的方法,掌握BroadcastReceiver广播传递机制的实现,利用Activity、Service和BroadcastReceiver实现一个音乐播放器APP。

3 实验源代码

布局文件代码:

<?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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="@drawable/bg"
    tools:context=".MainActivity">

    <ImageButton
        android:id="@+id/stopImageBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/stop"
        />

    <ImageButton
        android:id="@+id/playImageBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/play"
        />

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

        <TextView
            android:id="@+id/songNameTV"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffffff"
            android:textSize="24sp"
            android:text="歌曲名"
            android:layout_weight="2"
            />

        <TextView
            android:id="@+id/singerNameTV"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffffff"
            android:textSize="20sp"
            android:text="歌手名"
            android:layout_weight="1"
            />

    </LinearLayout>

</LinearLayout>

java代码:

(1)MainActivity

package com.example.musicplayertest;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {
    private ImageButton stopImageBtn = null;
    private ImageButton playImageBtn = null;
    private TextView songNameTV = null;
    private TextView singerNameTV = null;

    private ServiceReceiver serviceReceiver = null;
    private IntentFilter intentFilter= null;

    private boolean isPlaying = false;//定义一个反映MusicService播放状态的变量

    //定义存放歌曲名的数组
    private String []songNames = new String[]{"若思念便思念","就在江湖之上","山外"};

    //定义存放歌手名的数组
    private String []singerNames = new String[]{"周深","刘宇宁","张远"};


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        stopImageBtn = findViewById(R.id.stopImageBtn);
        playImageBtn = findViewById(R.id.playImageBtn);
        songNameTV = findViewById(R.id.songNameTV);
        singerNameTV = findViewById(R.id.singerNameTV);

        init();

        playImageBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("cn.edu.nuc.mainactivity");
                //控制指令:1表示播放指令,2表示暂停指令,3表示停止指令
                if (isPlaying){//如果isPlaying为真,说明后台正在播放音乐
                    intent.putExtra("control",2);//封装暂停指令
                    playImageBtn.setImageResource(R.drawable.play);//更新为播放按钮图片
                    isPlaying = false;
                }else {//后台播放状态是暂停或停止状态
                    intent.putExtra("control",1);//封装播放指令
                    playImageBtn.setImageResource(R.drawable.pause);
                    isPlaying = true;
                }
                sendBroadcast(intent);//发送带有过滤条件和控制指令的广播
            }
        });

        stopImageBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("cn.edu.nuc.mainactivity");
                intent.putExtra("control",3);//封装停止指令
                playImageBtn.setImageResource(R.drawable.play);//更新为播放按钮图片
                isPlaying = false;
                sendBroadcast(intent);
            }
        });

    }

    private void init(){
        //启动MusicService
        Intent intent = new Intent(MainActivity.this, MusicService.class);
        startService(intent);//启动MusicService
        //创建广播接收器对象
        serviceReceiver = new ServiceReceiver();
        intentFilter = new IntentFilter("cn.edu.nuc.musicservice");
        //动态注册广播接收器
        registerReceiver(serviceReceiver,intentFilter);
    }

    //定义用于接受MusicService发送的广播接收器类
    private class ServiceReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            int status = intent.getIntExtra("status",-1);
            int current = intent.getIntExtra("current",-1);
            //根据后台播放状态更新播放按钮的图片
            switch (status){
                //定义当前音乐播放状态的变量,0x11表示停止状态,0x12表示正在播放状态,0x13表示暂停状态
                case 0x11:
                    playImageBtn.setImageResource(R.drawable.play);
                    break;
                case 0x12:
                    playImageBtn.setImageResource(R.drawable.pause);
                    break;
                case 0x13:
                    playImageBtn.setImageResource(R.drawable.play);
                    break;
                default:break;
            }

            //在播放器界面对应的文本框中更新当前正在播放的歌曲信息
            if (current>=0){
                songNameTV.setText(songNames[current]);
                singerNameTV.setText(singerNames[current]);
            }
        }
    }
}

(2)MusicService

package com.example.musicplayertest;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.MediaPlayer;
import android.os.IBinder;

import java.io.IOException;

public class MusicService extends Service {

    //定义一个媒体播放器
    private MediaPlayer mediaPlayer = null;

    //定义一个广播接收器
    private ActivityReceiver activityReceiver = null;
    //定义广播过滤器
    private IntentFilter intentFilter = null;

    //定义资源管理器
    private AssetManager assetManager = null;

    //将歌曲文件信息存放到数组中
    String []musics = new String[]{"life.mp3","road.mp3","star.mp3"};

    //定义一个存放当前正在播放的音乐的索引值变量
    int current = 0;
    //定义当前音乐播放状态的变量,0x11表示停止状态,0x12表示正在播放状态,0x13表示暂停状态
    int status = 0x11;

    public MusicService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        activityReceiver =new ActivityReceiver();//创建广播接收器对象
        intentFilter = new IntentFilter("cn.edu.nuc.mainactivity");
        registerReceiver(activityReceiver,intentFilter);//动态注册广播接收器
        mediaPlayer = new MediaPlayer();
        //给mediaPlayer添加播放完一首歌后的事件监听处理,实现自动播放下一首
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                current++;
                if (current>=3){
                    current = 0;
                }
                Intent sendIntent = new Intent("cn.edu.nuc.musicservice");
                sendIntent.putExtra("current",current);
                sendBroadcast(sendIntent);
                prepareAndPlay(musics[current]);
            }
        });
        assetManager = getAssets();//创建资源管理器对象
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    //定义用于接受MainActivity发送的广播的广播接收器类
    private class ActivityReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            //从MainActivity发送过来的广播中解析出控制指令
            int control = intent.getIntExtra("control",-1);
            //控制指令:1表示播放指令,2表示暂停指令,3表示停止指令
            //定义当前音乐播放状态的变量,0x11表示停止状态,0x12表示正在播放状态,0x13表示暂停状态
            switch (control){
                case 1:
                    if (status == 0x11){
                        prepareAndPlay(musics[current]);
                        status = 0x12;
                    } else if (status == 0x12) {
                        mediaPlayer.pause();
                        status = 0x13;
                    } else if (status == 0x13) {
                        mediaPlayer.start();
                        status = 0x12;
                    }
                    break;
                case 2:
                    //暂停音乐播放
                    mediaPlayer.pause();
                    status = 0x13;
                    break;
                case 3:
                    //停止音乐播放
                    mediaPlayer.stop();
                    status = 0x11;
                    break;
                default:break;
            }

            //向MainActivity发送含有当前播放状态和歌曲索引值的广播
            Intent sendIntent = new Intent("cn.edu.nuc.musicservice");
            sendIntent.putExtra("status",status);
            sendIntent.putExtra("current",current);
            sendBroadcast(sendIntent);
        }
    }

    //定义初始化音乐播放的方法
    private void prepareAndPlay(String music){
        try {
            //创建音乐文件的一个资源文件描述符
            AssetFileDescriptor assetFileDescriptor = assetManager.openFd(music);
            mediaPlayer.reset();//重置媒体播放器
            mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(),
                    assetFileDescriptor.getStartOffset(),
                    assetFileDescriptor.getLength());//将要播放的音乐文件设置为媒体播放器的播放资源
            mediaPlayer.prepare();//准备声音
            mediaPlayer.start();//播放音乐
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

4 实验运行结果图

5 实验总结

       第一步,写布局文件。主要是两个图片按钮和两个文本框,图像按钮分别是暂停和播放;文本框分别是歌曲名和歌手名。

       写完布局文件开始写Java代码。设置控制指令,1表示播放指令,2表示暂停指令,3表示停止指令;再定义当前音乐播放状态的变量,0x11表示停止状态,0x12表示正在播放状态,0x13表示暂停状态;再分别定义存放歌曲名和歌手名的数组,将歌曲文件信息存放到数组中。

       分别定义一个媒体播放器、广播接收器、广播过滤器、资源管理器和一个存放当前正在播放的音乐的索引值变量。关于广播接收器,先创建广播接收器对象,动态注册广播接收器,给媒体播放器添加播放完一首歌后的事件监听处理,实现自动播放下一首。关于广播接收器,定义用于接收发送过来的广播的广播接收器类,从发送过来的广播中解析出指令,向其发送含有当前播放状态和歌曲索引值的广播。关于音乐播放,定义一个初始化音乐播放的方法,创建音乐文件的一个资源文件描述符,重置媒体播放器,将要播放的音乐文件设置位媒体播放器的播放资源,准备声音播放音乐。

标签:播放器,音乐,广播,private,技术开发,new,import,android,播放
From: https://blog.csdn.net/cxx0316/article/details/142668066

相关文章

  • springboot+vue在线音乐系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和数字娱乐产业的崛起,音乐已成为人们日常生活中不可或缺的一部分。在线音乐系统作为数字音乐传播的重要平台,不仅改变了传统音乐产业的格局,也为广大音乐爱好者提供了更加便捷、丰富的音乐体验。近年来,随着智能......
  • 828华为云征文|部署音乐流媒体服务器 mStream
    828华为云征文|部署音乐流媒体服务器mStream一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1重置密码2.2服务器连接2.3安全组配置2.4Docker环境搭建三、Flexus云服务器X实例部署mStream3.1mStream介绍3.2mStream部署3.3mStream使用四、总结......
  • 木偶人在线音乐播放器PHP网站源码
    源码介绍木偶人音乐播放器是一款开源的基于Meting的在线音乐播放器。具有音乐搜索、播放、下载、歌词同步显示、个人网易云音乐播放列表同步等功能。前端界面参照QQ音乐网页版进行布局,同时采用了流行的响应式设计,无论是在PC端还是在手机端,均能给您带来原生app般的使......
  • 听见未来:AI音乐生成,个性化音乐新体验!
    音乐一直是人类文化的重要组成部分,它不仅能表达深刻的情感,还有着极高的艺术价值。随着科技的进步,尤其是人工智能技术的快速发展,AI现在已经能够参与到音乐创作中,甚至可以根据用户的需求来创作个性化的配乐。这一技术的应用非常广泛,涵盖了广告、电影、游戏等多个行业。今天我们就来......
  • 基于nodejs+vue协同过滤音乐网站[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着数字音乐产业的蓬勃发展,音乐网站已成为人们日常生活中不可或缺的一部分。然而,面对海量的音乐资源,如何高效、精准地为用户推荐符合其个人喜好的音乐成为......
  • (nice!!!)LeetCode 2286. 以组为单位订音乐会的门票(线段树)
    题目:2286.以组为单位订音乐会的门票思路:线段树做法。(线段树)acwing1265.数星星classBookMyShow{public: //结构体typedefstructNode{intmn=0;//最小空位编号longlongsum=0;//非空位置之和}node; //n,mintN,M;......
  • BLE Audio显示连接成功,但没有音乐播放问题解决方案
    背景最近一直在搞这个问题,和原厂一起分析,背景可以参考前面的文章https://blog.csdn.net/Jzj1234555/article/details/142518444?spm=1001.2014.3001.5501https://blog.csdn.net/Jzj1234555/article/details/142595444?spm=1001.2014.3001.5501解决方案今天原厂承认了他......
  • python基于Django音乐交流分享平台的设计-音乐播放网站(源码+vue+部署文档+讲解等)
    收藏关注不迷路!!......
  • 为什么越来越多的开发者选择了EasyPlayer播放器?
    在当今快速发展的多媒体和数字化时代,视频和音频的播放与处理已成为众多应用的核心功能之一。随着物联网(IoT)、嵌入式系统、智能硬件以及移动应用的普及,寻找一个高效、灵活且易于集成的多媒体播放解决方案成为了开发者们的重要需求。而EasyPlayer播放器凭借其卓越的性能和广泛的......
  • PYTHON钢琴简谱播放器代码QZQ
    importtkinterastkimportpygame.midiimporttimeimportthreadingimportrandom初始化pygame.midipygame.midi.init()获取MIDI输出设备midi_out=pygame.midi.Output(0)乐器名称映射instrument_names={0:“大钢琴(声学钢琴)”,1:“明亮的钢琴”,2:......