package com.animee.localmusic;
import android.content.ContentResolver;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
ImageView nextIv,playIv,lastIv,albumIv;
TextView singerTv,songTv;
RecyclerView musicRv;
// 数据源
List<LocalMusicBean>mDatas;
private LocalMusicAdapter adapter;
// 记录当前正在播放的音乐的位置
int currnetPlayPosition = -1;
// 记录暂停音乐时进度条的位置
int currentPausePositionInSong = 0;
MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
mediaPlayer = new MediaPlayer();
mDatas = new ArrayList<>();
// 创建适配器对象
adapter = new LocalMusicAdapter(this, mDatas);
musicRv.setAdapter(adapter);
// 设置布局管理器
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
musicRv.setLayoutManager(layoutManager);
// 加载本地数据源
loadLocalMusicData();
// 设置每一项的点击事件
setEventListener();
}
private void setEventListener() {
/* 设置每一项的点击事件*/
adapter.setOnItemClickListener(new LocalMusicAdapter.OnItemClickListener() {
@Override
public void OnItemClick(View view, int position) {
currnetPlayPosition = position;
LocalMusicBean musicBean = mDatas.get(position);
playMusicInMusicBean(musicBean);
}
});
}
public void playMusicInMusicBean(LocalMusicBean musicBean) {
/*根据传入对象播放音乐*/
//设置底部显示的歌手名称和歌曲名
singerTv.setText(musicBean.getSinger());
songTv.setText(musicBean.getSong());
stopMusic();
// 重置多媒体播放器
mediaPlayer.reset();
// 设置新的播放路径
try {
mediaPlayer.setDataSource(musicBean.getPath());
String albumArt = musicBean.getAlbumArt();
Log.i("lsh123", "playMusicInMusicBean: albumpath=="+albumArt);
Bitmap bm = BitmapFactory.decodeFile(albumArt);
Log.i("lsh123", "playMusicInMusicBean: bm=="+bm);
albumIv.setImageBitmap(bm);
playMusic();
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* 点击播放按钮播放音乐,或者暂停从新播放
* 播放音乐有两种情况:
* 1.从暂停到播放
* 2.从停止到播放
* */
private void playMusic() {
/* 播放音乐的函数*/
if (mediaPlayer!=null&&!mediaPlayer.isPlaying()) {
if (currentPausePositionInSong == 0) {
try {
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}else{
// 从暂停到播放
mediaPlayer.seekTo(currentPausePositionInSong);
mediaPlayer.start();
}
playIv.setImageResource(R.mipmap.icon_pause);
}
}
private void pauseMusic() {
/* 暂停音乐的函数*/
if (mediaPlayer!=null&&mediaPlayer.isPlaying()) {
currentPausePositionInSong = mediaPlayer.getCurrentPosition();
mediaPlayer.pause();
playIv.setImageResource(R.mipmap.icon_play);
}
}
private void stopMusic() {
/* 停止音乐的函数*/
if (mediaPlayer!=null) {
currentPausePositionInSong = 0;
mediaPlayer.pause();
mediaPlayer.seekTo(0);
mediaPlayer.stop();
playIv.setImageResource(R.mipmap.icon_play);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
stopMusic();
}
private void loadLocalMusicData() {
/* 加载本地存储当中的音乐mp3文件到集合当中*/
// 1.获取ContentResolver对象
ContentResolver resolver = getContentResolver();
// 2.获取本地音乐存储的Uri地址
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
// 3 开始查询地址
Cursor cursor = resolver.query(uri, null, null, null, null);
// 4.遍历Cursor
int id = 0;
while (cursor.moveToNext()) {
String song = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
id++;
String sid = String.valueOf(id);
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");
String time = sdf.format(new Date(duration));
// 获取专辑图片主要是通过album_id进行查询
String album_id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
String albumArt = getAlbumArt(album_id);
// 将一行当中的数据封装到对象当中
LocalMusicBean bean = new LocalMusicBean(sid, song, singer, album, time, path,albumArt);
mDatas.add(bean);
}
// 数据源变化,提示适配器更新
adapter.notifyDataSetChanged();
}
private String getAlbumArt(String album_id) {
String mUriAlbums = "content://media/external/audio/albums";
String[] projection = new String[]{"album_art"};
Cursor cur = this.getContentResolver().query(
Uri.parse(mUriAlbums + "/" + album_id),
projection, null, null, null);
String album_art = null;
if (cur.getCount() > 0 && cur.getColumnCount() > 0) {
cur.moveToNext();
album_art = cur.getString(0);
}
cur.close();
cur = null;
return album_art;
}
private void initView() {
/* 初始化控件的函数*/
nextIv = findViewById(R.id.local_music_bottom_iv_next);
playIv = findViewById(R.id.local_music_bottom_iv_play);
lastIv = findViewById(R.id.local_music_bottom_iv_last);
albumIv = findViewById(R.id.local_music_bottom_iv_icon);
singerTv = findViewById(R.id.local_music_bottom_tv_singer);
songTv = findViewById(R.id.local_music_bottom_tv_song);
musicRv = findViewById(R.id.local_music_rv);
nextIv.setOnClickListener(this);
lastIv.setOnClickListener(this);
playIv.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.local_music_bottom_iv_last:
if (currnetPlayPosition ==0) {
Toast.makeText(this,"已经是第一首了,没有上一曲!",Toast.LENGTH_SHORT).show();
return;
没有合适的资源?快使用搜索试试~ 我知道了~
Android简易本地音乐播放器源码,基于Android的简易本地音乐播放器源码
共48个文件
png:17个
xml:15个
java:5个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 2 下载量 92 浏览量
2023-01-12
10:38:49
上传
评论 4
收藏 216KB ZIP 举报
温馨提示
Android简易本地音乐播放器源码,基于Android的简易本地音乐播放器源码
资源推荐
资源详情
资源评论
收起资源包目录
localmusic-master.zip (48个子文件)
localmusic-master
gradle.properties 726B
gradle
wrapper
gradle-wrapper.jar 53KB
gradle-wrapper.properties 230B
app
src
androidTest
java
com
animee
localmusic
ExampleInstrumentedTest.java 726B
test
java
com
animee
localmusic
ExampleUnitTest.java 382B
main
java
com
animee
localmusic
LocalMusicBean.java 2KB
MainActivity.java 9KB
LocalMusicAdapter.java 2KB
res
mipmap-xxhdpi
ic_launcher_round.png 10KB
ic_launcher.png 6KB
mipmap-hdpi
bg2.png 54KB
icon_next.png 16KB
icon_song.png 2KB
ic_launcher_round.png 5KB
a1.png 21KB
icon_pause.png 16KB
icon_last.png 16KB
icon_play.png 16KB
ic_launcher.png 3KB
drawable-v24
ic_launcher_foreground.xml 2KB
mipmap-anydpi-v26
ic_launcher.xml 272B
ic_launcher_round.xml 272B
mipmap-mdpi
ic_launcher_round.png 3KB
ic_launcher.png 2KB
mipmap-xxxhdpi
ic_launcher_round.png 15KB
ic_launcher.png 9KB
mipmap-xhdpi
ic_launcher_round.png 7KB
ic_launcher.png 4KB
values
colors.xml 254B
strings.xml 73B
styles.xml 383B
layout
activity_main.xml 3KB
item_local_music.xml 3KB
drawable
ic_launcher_background.xml 5KB
AndroidManifest.xml 794B
proguard-rules.pro 751B
build.gradle 1KB
.gitignore 7B
gradlew.bat 2KB
build.gradle 546B
.idea
codeStyles
Project.xml 2KB
runConfigurations.xml 564B
vcs.xml 180B
caches
build_file_checksums.ser 545B
misc.xml 2KB
gradle.xml 626B
settings.gradle 15B
gradlew 5KB
共 48 条
- 1
资源评论
- 爱西红柿炒鸡蛋2023-04-16超赞的资源,感谢资源主分享,大家一起进步!
- m0_646862392023-12-26资源很不错,内容和描述一致,值得借鉴,赶紧学起来!
Python代码大全
- 粉丝: 2726
- 资源: 689
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功