package com.example.musicplayer;
import android.annotation.SuppressLint;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.google.android.exoplayer2.Player;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
ActionBar actionBar;
TextView tv_songName;
TextView tv_seekBarHint;
TextView tv_duration;
SeekBar seekBar;
ImageButton btn_play;
ImageButton btn_pre;
ImageButton btn_next;
ImageButton btn_playList;
ImageButton btn_playWay;
ListView listView;
ArrayAdapter<String> adpter;
List<String> music_list = new ArrayList<>();
ConstraintLayout layout;
MusicService musicService;
private boolean isServiceBound = false;
private Timer timer; //定时器
// 更新播放进度和歌曲总时长
private class ProgressUpdate extends TimerTask {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
long position = musicService.getContentPosition();
long duration = musicService.getDuration();
// 更新当前进度文本
tv_seekBarHint.setText(format(position));
// 更新歌曲总时长文本
tv_duration.setText(format(duration));
// 更新进度条进度
seekBar.setMax((int) duration);
seekBar.setProgress((int) position);
}
});
}
}
public String format(long position) {
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss"); // "分:秒"格式
String timeStr = sdf.format(position); //会自动将时长(毫秒数)转换为分秒格式
return timeStr;
}
// 绑定 MusicService
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MusicService.LocalBinder binder = (MusicService.LocalBinder) service;
musicService = binder.getService();
isServiceBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
musicService = null;
isServiceBound = false;
}
};
View.OnClickListener listener1 = new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, MusicService.class);
switch (v.getId()) {
case R.id.btn_playList:
showListView();
break;
case R.id.btn_play:
playOrPauseMusic();
break;
case R.id.btn_pre:
playPreviousTrack();
break;
case R.id.btn_next:
playNextTrack();
break;
case R.id.btn_playWay:
changePlayMode();
break;
}
}
};
// ListView 显示音乐列表 start
public void showListView() {
music_list = getMusic(); // 获取音乐列表
adpter = new ArrayAdapter<String>( // 创建适配器
MainActivity.this,
android.R.layout.simple_list_item_single_choice,
music_list
);
listView.setAdapter(adpter); // 设置适配器
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); // 设置选择模式
listView.setOnItemClickListener(listener2); // 设置监听器
listView.setVisibility(View.VISIBLE); // 设置可见
}
List<String> getMusic() {
List<String> mList = new ArrayList<>();
try {
String[] fNames = getAssets().list("music");
for (String fn : fNames) {
mList.add(fn);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
mList.add("返回");
return mList;
}
AdapterView.OnItemClickListener listener2 = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ListView lv = (ListView) parent;
lv.setSelector(R.color.purple_200); //设置高亮背景色 purple_200颜色值见原来项目
String musicName = parent.getItemAtPosition(position).toString(); //获得选中项图片名称,需要toString
if (musicName.equals("返回")) {
// 获取ListView的布局参数
listView.setVisibility(View.GONE);
} else {
playMusic(musicName);
}
}
};
public void playMusic(String musicName) {
updateSongName(musicName);
if (isServiceBound && musicService != null) {
timer = new Timer();
timer.schedule(new ProgressUpdate(), 0, 1000);
musicService.playMusic(musicName);
btn_play.setImageResource(R.drawable.pause);
}
}
// ListView 显示音乐列表 end
public void playOrPauseMusic() {
if (musicService.isPlaying()) {
btn_play.setImageResource(R.drawable.play);
musicService.pause();
} else {
// 创建一个 Timer 对象,用于定时更新进度条和文本
timer = new Timer();
// 将 ProgressUpdate 任务调度到 Timer 中,每隔一定时间执行一次
timer.schedule(new ProgressUpdate(), 0, 1000);
btn_play.setImageResource(R.drawable.pause);
musicService.play();
String songName = musicService.getCurrentSongName();
updateSongName(songName);
}
}
// 播放上一首音乐
public void playPreviousTrack() {
if (isServiceBound && musicService != null) {
timer = new Timer();
timer.schedule(new ProgressUpdate(), 0, 1000);
btn_play.setImageResource(R.drawable.pause);
musicService.playPreviousTrack();
String songName = musicService.getCurrentSongName();
updateSongName(songName);
}
}
// 播放下一首音乐
public void playNextTrack() {
if (isServiceBound && musicService != null) {
timer = new Timer();
timer.schedule(new ProgressUpdate(), 0, 1000);
btn_play.setImageResource(R.drawable.pause);
musicService.playNextTrack();
String songName = musicService.getCurrentSongName();
updateSongName(songName);
}
}
public void updateSongName(String songName) {
// 去掉文件名后缀
songName = songName.substring(0, songName.lastIndexOf("."));
tv_songName.setText(songName);
}
// 更换播放模式
private void changePlayMode() {
if (musicService != null) {
int currentMode = musicService.getPlayMode();
if (currentMode == Player.REPEAT_MODE_ALL) {
musicService.setPlayMode(Player.REPEAT_MODE_ONE);
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于安卓开发的音乐播放器项目源码+项目说明(学霸课程设计).zip 主要要求: 界面模仿上图 音乐文件:放在项目 assets/music 目录下 主窗口 Activity+播放列表 ListView+音乐进度 SeekBar+播放 ExoPlayer+后台 Service 完成的功能:播放/暂停、上一首、下一首(自动下一首)、单曲循环、播放列表选择 ActionBar Imageview表示歌曲图片 3个TextView表示歌名、歌手名和歌词,其中歌名会随着歌曲变化而变化 6个ImageButton(不实现功能),5个ImageButton(实现功能) Seekbar+TextView表示歌曲进度 经导师指导并认可通过的高分设计项目。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 <资源说明> 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传
资源推荐
资源详情
资源评论
收起资源包目录
基于安卓开发的音乐播放器项目源码+项目说明(学霸课程设计).zip (75个子文件)
gradle.properties 1KB
gradle
wrapper
gradle-wrapper.jar 58KB
gradle-wrapper.properties 230B
libs.versions.toml 1KB
项目说明.md 15KB
app
src
androidTest
java
com
example
musicplayer
ExampleInstrumentedTest.java 760B
test
java
com
example
musicplayer
ExampleUnitTest.java 384B
main
assets
music
ibelieve.mp3 6.56MB
beyond.mp3 4.56MB
test.mp3 248KB
delete.mp3 83KB
stars.mp3 3.85MB
she.mp3 3.52MB
success.mp3 95KB
start.mp3 120KB
java
com
example
musicplayer
MainActivity.java 13KB
MusicService.java 5KB
res
mipmap-xxhdpi
ic_launcher_round.webp 6KB
ic_launcher.webp 3KB
mipmap-hdpi
ic_launcher_round.webp 3KB
ic_launcher.webp 1KB
values-night
themes.xml 839B
mipmap-mdpi
ic_launcher_round.webp 2KB
ic_launcher.webp 982B
mipmap-xxxhdpi
ic_launcher_round.webp 8KB
ic_launcher.webp 4KB
mipmap-anydpi
ic_launcher.xml 343B
ic_launcher_round.xml 343B
mipmap-xhdpi
ic_launcher_round.webp 4KB
ic_launcher.webp 2KB
xml
data_extraction_rules.xml 551B
backup_rules.xml 478B
values
colors.xml 417B
strings.xml 73B
themes.xml 839B
layout
activity_main.xml 9KB
drawable
micphone.png 7KB
pre.png 4KB
ic_launcher_background.xml 5KB
play_in_order.png 5KB
single_cycle.png 43KB
download.png 5KB
sound.png 3KB
menu.png 2KB
next.png 4KB
ic_launcher_foreground.xml 2KB
play.png 17KB
like.png 5KB
pause.png 15KB
icon.png 196KB
point.png 2KB
playlist.png 3KB
comment.png 5KB
picture.png 186KB
AndroidManifest.xml 1KB
proguard-rules.pro 750B
release
output-metadata.json 711B
app-release.apk 34.16MB
baselineProfiles
0
app-release.dm 3KB
1
app-release.dm 3KB
.gitignore 6B
build.gradle.kts 1KB
gradlew.bat 3KB
.idea
migrations.xml 254B
.name 11B
deploymentTargetSelector.xml 670B
vcs.xml 167B
misc.xml 572B
compiler.xml 169B
gradle.xml 696B
.gitignore 47B
gradlew 6KB
.gitignore 225B
settings.gradle.kts 535B
build.gradle.kts 167B
共 75 条
- 1
资源评论
Scikit-learn
- 粉丝: 4816
- 资源: 3181
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 爱依克签批屏KY系列BS架构二次开发包,采用Websocket通信协议,内含驱动服务与开发文档,支持H5页面签名,PDF文件签名、指纹采集捺印以及摄像头拍摄和二代证身份身份信息读取
- Aspera高效文件传输产品技术解析与应用
- STM32DS3231硬件I2C读写,基于HAL库
- double数据做乘法保留两位小数的处理办法.txt
- 详细解读:毕业设计项目及写作技巧全程指南
- 学生成绩管理系统软件界面
- js判断时间多久之前.txt
- Temporal注解的作用.txt
- 五行与商业:古代智慧的探索与传承.docx
- 04747《Java语言程序设计(一)》真题试题 2019 -2021
- 处理苹果手机倒计时功能异常.txt
- HarmonyOS-ArkTS语言-购物商城的实现
- 导出表格报错net.sf.excelutils.ExcelException.txt
- 判断对象不为空的方法参考.txt
- Python爬虫技术入门与实战指南
- C++程序设计 课件PPT
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功