android做一个音乐播放器,制作一个简单的Android版的音乐播放器
音乐播放器是一个非常常见的应用,这篇博客就是介绍如何制作一个简单的音乐播放器,这款音乐播放器具有以下的功能:播放歌曲、暂停播放歌曲、、显示歌曲的总时长、显示歌曲的当前播放时长、调节滑块可以将歌曲调节到任何时间播放、退出音乐播放器
实现效果如下
实现方式:
第一步:使用Android Studio创建一个Android工程,并且修改activity_main.xml文件
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.fyt.musicplayer.MainActivity"
android:orientation="vertical">
android:id="@+id/sb"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:id="@+id/tv_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00"/>
android:id="@+id/tv_total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="00:00"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放音乐"
android:onClick="play"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="暂停播放"
android:onClick="pausePlay"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="继续播放"
android:onClick="continuePlay"/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="退出"
android:onClick="exit"/>
第二步:新建一个MusicService.java文件,用于处理音乐播放的逻辑
package com.fyt.musicplayer;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.support.annotation.Nullable;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
//创建一个继承自服务的音乐服务类
public class MusicService extends Service {
private MediaPlayer player;
private Timer timer;
//绑定服务时,调用此方法
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new MusicControl();
}
//创建播放音乐的服务
@Override
public void onCreate() {
super.onCreate();
//创建音乐播放器对象
player = new MediaPlayer();
}
//销毁播放音乐服务
@Override
public void onDestroy() {
super.onDestroy();
//停止播放音乐
player.stop();
//释放占用的资源
player.release();
//将player置为空
player = null;
}
//播放音乐
public void play() {
try {
if(player == null)
{
player = new MediaPlayer();
}
//重置
player.reset();
//加载多媒体文件
player.setDataSource("sdcard/zxmzf.mp3");
//准备播放音乐
player.prepare();
//播放音乐
player.start();
//添加计时器
addTimer();
} catch (IOException e) {
e.printStackTrace();
}
}
//暂停播放音乐
public void pausePlay() {
player.pause();
}
//继续播放音乐
public void continuePlay() {
player.start();
}
//创建一个实现音乐接口的音乐控制类
class MusicControl extends Binder implements MusicInterface {
@Override
public void play() {
MusicService.this.play();
}
@Override
public void pausePlay() {
MusicService.this.pausePlay();
}
@Override
public void continuePlay() {
MusicService.this.continuePlay();
}
@Override
public void seekTo(int progress) {
MusicService.this.seekTo(progress);
}
}
//设置音乐的播放位置
public void seekTo(int progress) {
player.seekTo(progress);
}
//添加计时器用于设置音乐播放器中的播放进度
public void addTimer() {
//如果没有创建计时器对象
if(timer == null) {
//创建计时器对象
timer = new Timer();
timer.schedule(new TimerTask() {
//执行计时任务
@Override
public void run() {
//获得歌曲总时长
int duration = player.getDuration();
//获得歌曲的当前播放进度
int currentPosition = player.getCurrentPosition();
//创建消息对象
Message msg = MainActivity.handler.obtainMessage();
//将音乐的播放进度封装至消息对象中
Bundle bundle = new Bundle();
bundle.putInt("duration", duration);
bundle.putInt("currentPosition", currentPosition);
msg.setData(bundle);
//将消息发送到主线程的消息队列
MainActivity.handler.sendMessage(msg);
}
},
//开始计时任务后的5毫秒,第一次执行run方法,以后每500毫秒执行一次
5, 500);
}
}
}
第三步:创建一个MusicInterface.java文件创建用于操作音乐播放的接口
package com.fyt.musicplayer;
//创建一个音乐播放接口
public interface MusicInterface {
//播放音乐
void play();
//暂停播放音乐
void pausePlay();
//继续播放音乐
void continuePlay();
//修改音乐的播放位置
void seekTo(int progress);
}
第四步:修改MainActivity.java文件
package com.fyt.musicplayer;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
public class MainActivity extends Activity {
MyServiceConn conn;
Intent intent;
MusicInterface mi;
//用于设置音乐播放器的播放进度
private static SeekBar sb;
private static TextView tv_progress;
private static TextView tv_total;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_progress = (TextView) findViewById(R.id.tv_progress);
tv_total = (TextView) findViewById(R.id.tv_total);
//创建意图对象
intent = new Intent(this, MusicService.class);
//启动服务
startService(intent);
//创建服务连接对象
conn = new MyServiceConn();
//绑定服务
bindService(intent, conn, BIND_AUTO_CREATE);
//获得布局文件上的滑动条
sb = (SeekBar) findViewById(R.id.sb);
//为滑动条添加事件监听
sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
//当滑动条中的进度改变后,此方法被调用
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
//滑动条刚开始滑动,此方法被调用
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
//当滑动条停止滑动,此方法被调用
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//根据拖动的进度改变音乐播放进度
int progress = seekBar.getProgress();
//改变播放进度
mi.seekTo(progress);
}
});
}
//创建消息处理器对象
public static Handler handler = new Handler(){
//在主线程中处理从子线程发送过来的消息
@Override
public void handleMessage(Message msg) {
//获取从子线程发送过来的音乐播放的进度
Bundle bundle = msg.getData();
//歌曲的总时长(毫秒)
int duration = bundle.getInt("duration");
//歌曲的当前进度(毫秒)
int currentPostition = bundle.getInt("currentPosition");
//刷新滑块的进度
sb.setMax(duration);
sb.setProgress(currentPostition);
//歌曲的总时长
int minute = duration / 1000 / 60;
int second = duration / 1000 % 60;
String strMinute = null;
String strSecond = null;
//如果歌曲的时间中的分钟小于10
if(minute < 10) {
//在分钟的前面加一个0
strMinute = "0" + minute;
} else {
strMinute = minute + "";
}
//如果歌曲的时间中的秒钟小于10
if(second < 10)
{
//在秒钟前面加一个0
strSecond = "0" + second;
} else {
strSecond = second + "";
}
tv_total.setText(strMinute + ":" + strSecond);
//歌曲当前播放时长
minute = currentPostition / 1000 / 60;
second = currentPostition / 1000 % 60;
//如果歌曲的时间中的分钟小于10
if(minute < 10) {
//在分钟的前面加一个0
strMinute = "0" + minute;
} else {
strMinute = minute + "";
}
//如果歌曲的时间中的秒钟小于10
if(second < 10) {
//在秒钟前面加一个0
strSecond = "0" + second;
} else {
strSecond = second + "";
}
tv_progress.setText(strMinute + ":" + strSecond);
}
};
//播放音乐按钮响应函数
public void play(View view) {
//播放音乐
mi.play();
}
//暂停播放音乐按钮响应函数
public void pausePlay(View view) {
//暂停播放音乐
mi.pausePlay();
}
//继续播放音乐按钮响应函数
public void continuePlay (View view) {
//继续播放音乐
mi.continuePlay();
}
//退出音乐播放按钮响应函数
public void exit(View view) {
//解绑服务
unbindService(conn);
//停止服务
stopService(intent);
//结束这个activity
finish();
}
//实现服务器连接接口
class MyServiceConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//获得中间人对象
mi = (MusicInterface) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
}
第五步:在配置文件中的Application节点下添加服务组件
最后一步:添加读取SD卡的权限
android做一个音乐播放器,制作一个简单的Android版的音乐播放器相关推荐
- Android音乐播放器制作(二 )点击歌曲实现播放
上次我们实现了把手机里的音频扫描到,然后放在list集合里面,用ListView展示在手机界面上,如果没有看过的可以去看看本人的博客:Android音乐播放器制作(一)扫描本地音乐显示在手机上 这次是 ...
- ios静态库和代码同名_使用一个代码库开始制作NativeScript iOS和Android应用程序
ios静态库和代码同名 Users can choose whatever operating system they prefer, but every operating system use d ...
- excel切片器_Excel数据透视表,结合切片器制作一个动态的图表!
简单制作效果如下所示: 通过右边切片器的筛选地区,或者时间,左边的图表会自动更新各种商品的销售图表情况.可以在这个图表基础上再加工,变得高大上.今天就分享上述的效果是如何制作的. 下面的数据是原始销售 ...
- 用计算机怎么做成绩表,利用Excel制作一个简单的学生成绩表.doc
利用Excel制作一个简单的学生成绩表 教学设计表 学科 信息技术 授课年级 八年级 学校 教师姓名 章节名称初中信息技术八年级上册第7课(第1节)计划学时1学时学习内容分析学习Excel的基础知识, ...
- php做万年历思路,使用PHP制作一个简单的万年历
使用PHP制作一个简单的万年历 1.使用PHP制作日历的思路 制作一个选择下拉列表框,实现对选择年月的判断: 显示当前时间,并制作日历的头部: new一个Calendar类,实现获取日历的边界值.计算 ...
- 播放器制作初体验:FFMPEG + QT,只播放视频(持续更新,功能逐渐添加)(1)
刚了解FFMPEG,也看过了雷神的博客,以及云天之巅大佬的<从零开始学习音视频编程技术>系列,深受启迪,感概万千,遂打算自己从零开始,制作一个播放器,其中部分思路来自云天之巅大佬的博客,制 ...
- python编写一个软件-使用python制作一个解压缩软件
python实现解压缩的重要模块就是――zipfile,其次是os 安装zipfile模块 首先得安装zipfile模块,打开cmd输入一下命令即可安装 pip install zipfile os是 ...
- jar包导出无法显示图片或者音乐_如何制作图片视频短片,配上音乐闪耀朋友圈!...
把图片制作成视频短片,再配上一首好听的音乐,发到朋友圈,不仅可以更具创意的分享自己的生活点滴,更能因您的创意获得一大票的赞哦!看到别人分享自己制作的图片视频短片,是不是心痒痒也想做一个呢?今天就教你使 ...
- Android笔记(十九)制作一个简易的指南针
一.获取方向的方法 Android 获取手机旋转的方向和角度是通过加速度传感器和地磁传感器共同计算得出的,这是 Android 目前推荐使用的方式.正常情况下,手机的头部如果是正北方向,那么它围绕Z轴 ...
最新文章
- 关于编码、unicode、utf-8的讨论
- SetupDiGetClassDevs函数详解
- 网络嗅探混杂模式与非混杂模式的区别
- 《敏捷个人-认识自我、管理自我.pdf》更新至 v0.7
- 【SpringMVC】从Fastjson迁移到Jackson,以及对技术选型的反思
- python生成器用法_理解python中生成器用法
- Exp3 免杀原理与实践 20164314
- 【Redis】Redis Bitmaps
- 69. Php部分常见问题总结
- SFB 项目经验-35-分配公网证书 For Exchange Server 2016(图解)
- c语言图灵机算法,图灵机的时间化简概述(3/4)
- element-ui的pagination分页 增加首页和末页
- DirectX修复工具出现0xc000007b错误——分析与解决
- 企业如何选择短信平台
- 优动漫PAINT新建文件
- ssh关闭linux的网卡,linux操作系统修改网卡mac地址 ssh -X
- 腾讯抖音搬运视频如何消重
- 第四届国际步态识别竞赛HID2023已经启动,欢迎报名
- c语言如何框出视频或图像中的车辆,[转载]视频图像中的车辆检测跟踪和分类
- 【GPS授时系列】一,写在正式开始前
热门文章
- 奇安信VS启明星辰 欲上市“新人”与上市“老手”的全面对比
- typedef的用法简介
- 基于机器学习的心脏病预测方法(1)——心脏病及Heart Disease UCI数据集介绍
- 日语五十音图表 日语学习
- 频谱细化matlab程序,分享FFT频谱细化程序(处理单频点信号)
- 暴强 西游记人物介绍(转载)!!!!
- xmapp启动mysql出现Error: MySQL shutdown unexpectedly.
- 互联网日报 | 6月24日 星期四 | 快手全球月活已达10亿;HarmonyOS 2首批正式版升级;微软市值突破2万亿美元...
- sim卡在苹果手机显示无服务器,iPhone手机没有信号怎么办 手机提示无服务怎么解决...
- ERROR: Cannot uninstall 'pywin32'.