Android程序设计之音乐播放器实现

时间:2025-01-28 08:23:07
/** * 音乐播放界面 */ public class PlayMusicActivity extends BaseActivity<ActivityPlayMusicBinding> implements OnPlayerEventListener { private static final String TAG = "============"; private MusicInfo musicInfo; private int mLastProgress; @Override protected ActivityPlayMusicBinding getViewBinding() { return ActivityPlayMusicBinding.inflate(getLayoutInflater()); } @Override protected void setListener() { Aria.download(this).register(); mBinding.sbProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean b) { if (Math.abs(progress - mLastProgress) >= DateUtils.SECOND_IN_MILLIS) { mBinding.tvCurrentTime.setText(formatTime("mm:ss", progress)); mLastProgress = progress; } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { if (AudioPlayer.get().isPlaying() || AudioPlayer.get().isPausing()) { int progress = seekBar.getProgress(); AudioPlayer.get().seekTo(progress); } else { seekBar.setProgress(0); } } }); mBinding.ivMusicPlay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { AudioPlayer.get().playPause(); } }); mBinding.ivMusicPrevious.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { AudioPlayer.get().prev(); } }); mBinding.ivMusicNext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { AudioPlayer.get().next(); } }); //下载 mBinding.download.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (XXPermissions.isGranted(mContext, Permission.Group.STORAGE)) { download(); } else { checkPermission(); } } }); } @Override protected void initData() { initSystemBar(); musicInfo = (MusicInfo) getIntent().getSerializableExtra("musicInfo"); //监听 AudioPlayer.get().addOnPlayEventListener(this); if (null != musicInfo) { AudioPlayer.get().addAndPlay(musicInfo); //添加到浏览记录 addRecord(musicInfo); //获取单个任务实体 DownloadEntity entity = Aria.download(this).getFirstDownloadEntity(musicInfo.getMusic_url()); if (null != entity) { mBinding.download.setClickable(false); mBinding.download.setImageResource(R.mipmap.ic_download_complete); } else { mBinding.download.setClickable(true); mBinding.download.setImageResource(R.mipmap.iv_download); } } } /** * 沉浸式状态栏 */ private void initSystemBar() { ImmersionBar.with(this).init(); } public String formatTime(String pattern, long milli) { int m = (int) (milli / DateUtils.MINUTE_IN_MILLIS); int s = (int) ((milli / DateUtils.SECOND_IN_MILLIS) % 60); String mm = String.format(Locale.getDefault(), "%02d", m); String ss = String.format(Locale.getDefault(), "%02d", s); return pattern.replace("mm", mm).replace("ss", ss); } @SuppressLint("SetTextI18n") private void onChangeImpl(MusicInfo music) { if (music == null) { return; } mBinding.sbProgress.setProgress((int) AudioPlayer.get().getAudioPosition()); mBinding.sbProgress.setSecondaryProgress(0); mLastProgress = 0; mBinding.tvCurrentTime.setText("00:00"); if (AudioPlayer.get().isPlaying() || AudioPlayer.get().isPreparing()) { mBinding.ivMusicPlay.setSelected(true); } else { mBinding.ivMusicPlay.setSelected(false); } mBinding.toolbar.setTitle(music.getMusic_title()); mBinding.tvMusicTitle.setText(music.getMusic_title()); mBinding.tvMusicSongType.setText(music.getMusic_type()); startAnim(); } @Override public void onChange(MusicInfo music) { onChangeImpl(music); } @Override public void onPlayerStart(long duration) { //一定要设置最大值 mBinding.sbProgress.setMax((int) duration); mBinding.tvTotalTime.setText(formatTime("mm:ss", duration)); mBinding.ivMusicPlay.setSelected(true); startAnim(); } @Override public void onPlayerPause() { mBinding.ivMusicPlay.setSelected(false); stopAnim(); } @Override public void onPublish(int progress) { mBinding.sbProgress.setProgress(progress); } @Override public void onBufferingUpdate(int percent) { mBinding.sbProgress.setSecondaryProgress(mBinding.sbProgress.getMax() * 100 / percent); } private Animation animation; private void startAnim() { animation = AnimationUtils.loadAnimation(this, R.anim.rotation_animation); LinearInterpolator lin = new LinearInterpolator();//设置动画匀速运动 animation.setInterpolator(lin); mBinding.imgCd.startAnimation(animation); } private void stopAnim() { if (mBinding.imgCd.getAnimation() != null) { mBinding.imgCd.clearAnimation(); } } private void addRecord(MusicInfo musicInfo) { OkGo.<String>get(ApiConstants.ADD_RECORD_MUSIC_URL) .params("username", ApiConstants.getUserInfo().getUsername()) .params("music_title", musicInfo.getMusic_title()) .params("music_url", musicInfo.getMusic_url()) .params("music_type", musicInfo.getMusic_type()) .execute(new HttpStringCallback(null) { @Override protected void onSuccess(String msg, String response) { } @Override protected void onError(String response) { } }); } private void checkPermission() { XXPermissions.with(this) // 申请单个权限 // 申请多个权限 .permission(Permission.Group.STORAGE) // 设置权限请求拦截器(局部设置) //.interceptor(new PermissionInterceptor()) // 设置不触发错误检测机制(局部设置) //.unchecked() .request(new OnPermissionCallback() { @Override public void onGranted(List<String> permissions, boolean all) { if (!all) { showToast("获取部分权限成功,但部分权限未正常授予"); return; } //这里做操作 } @Override public void onDenied(List<String> permissions, boolean never) { if (never) { showToast("被永久拒绝授权,请手动授予录音和日历权限"); // 如果是被永久拒绝就跳转到应用权限系统设置页面 XXPermissions.startPermissionActivity(mContext, permissions); } else { showToast("获取录音和日历权限失败"); } } }); } @ public void onWait(DownloadTask task) { Log.d(TAG, "onWait: "); } @ public void onPre(DownloadTask task) { Log.d(TAG, "onPre: "); } @ public void onTaskStart(DownloadTask task) { Log.d(TAG, "onTaskStart: "); showToast("开始下载~~~~~"); } @ public void onTaskRunning(DownloadTask task) { Log.d(TAG, "onTaskRunning: "); } @ public void onTaskResume(DownloadTask task) { Log.d(TAG, "onTaskResume: "); } @ public void onTaskStop(DownloadTask task) { Log.d(TAG, "onTaskStop: "); } @ public void onTaskCancel(DownloadTask task) { Log.d(TAG, "onTaskCancel: "); } @ public void onTaskFail(DownloadTask task, Exception e) { Log.d(TAG, "onTaskFail: "); } @ public void onTaskComplete(DownloadTask task) { Log.d(TAG, "onTaskComplete: "); mBinding.download.setClickable(false); mBinding.download.setImageResource(R.mipmap.ic_download_complete); showToast("下载完成~~~~~"); } private void download() { if (null != musicInfo) { Aria.download(PlayMusicActivity.this) .load(musicInfo.getMusic_url()) // 下载地址 .setFilePath(getExternalCacheDir().getPath() + musicInfo.getMusic_title() + ".mp3") // 设置文件保存路径 .setExtendField(GsonUtils.toJson(musicInfo)) .create(); } } }