Android应用开发--MP3音乐播放器代码实现(一)

mp3list.add(map);

}

mAdapter = new SimpleAdapter(this, mp3list,

R.layout.music_list_item_layout, new String[] { “title”, “Artist”, “duration” },

new int[] { R.id.music_title, R.id.music_Artist, R.id.music_duration });

mMusiclist.setAdapter(mAdapter);

}

实现效果如图:

需求2:点击列表的每一项,启动一个服务来播放音乐

1.   注册条目点击监听器OnItemClickListener

2.   定义一个实现OnItemClickListener接口的内部类

3.   定义一个继承Service的服务类PlayerServie

1.   注册条目点击监听器OnItemClickListener

mMusiclist = (ListView) findViewById(R.id.music_list);

mMusiclist.setOnItemClickListener(new MusicListItemClickListener());

mp3Infos = getMp3Infos();

setListAdpter(getMp3Infos());

2.   定义一个实现OnItemClickListener接口的内部类

private class MusicListItemClickListener implements OnItemClickListener {

@Override

public void onItemClick(AdapterView<?> parent, View view, int position,

long id) {

if(mp3Infos != null) {

Mp3Info mp3Info = mp3Infos.get(position);

Log.d(“mp3Info–>”, mp3Info.toString());

Intent intent = new Intent();

intent.putExtra(“url”, mp3Info.getUrl());

intent.putExtra(“MSG”, AppConstant.PlayerMsg.PLAY_MSG);

intent.setClass(MainActivity.this, PlayerService.class);

startService(intent); //启动服务

}

}

}

3.   定义一个继承Service的服务类PlayerServie(未完善的Service类)

package com.wwj.sb.service;

import android.annotation.SuppressLint;

import android.app.Service;

import android.content.Intent;

import android.media.MediaPlayer;

import android.media.MediaPlayer.OnPreparedListener;

import android.os.IBinder;

import com.wwj.sb.domain.AppConstant;

@SuppressLint(“NewApi”)

public class PlayerService extends Service {

private MediaPlayer mediaPlayer = new MediaPlayer(); //媒体播放器对象

private String path; //音乐文件路径

private boolean isPause; //暂停状态

@Override

public IBinder onBind(Intent arg0) {

return null;

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

if(mediaPlayer.isPlaying()) {

stop();

}

path = intent.getStringExtra(“url”);

int msg = intent.getIntExtra(“MSG”, 0);

if(msg == AppConstant.PlayerMsg.PLAY_MSG) {

play(0);

} else if(msg == AppConstant.PlayerMsg.PAUSE_MSG) {

pause();

} else if(msg == AppConstant.PlayerMsg.STOP_MSG) {

stop();

}

return super.onStartCommand(intent, flags, startId);

}

/**

  • 播放音乐

  • @param position

*/

private void play(int position) {

try {

mediaPlayer.reset();//把各项参数恢复到初始状态

mediaPlayer.setDataSource(path);

mediaPlayer.prepare(); //进行缓冲

mediaPlayer.setOnPreparedListener(new PreparedListener(position));//注册一个监听器

}

catch (Exception e) {

e.printStackTrace();

}

}

/**

  • 暂停音乐

*/

private void pause() {

if (mediaPlayer != null && mediaPlayer.isPlaying()) {

mediaPlayer.pause();

isPause = true;

}

}

/**

  • 停止音乐

*/

private void stop(){

if(mediaPlayer != null) {

mediaPlayer.stop();

try {

mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数

} catch (Exception e) {

e.printStackTrace();

}

}

}

@Override

public void onDestroy() {

if(mediaPlayer != null){

mediaPlayer.stop();

mediaPlayer.release();

}

}

/**

  • 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放

*/

private final class PreparedListener implements OnPreparedListener {

private int positon;

public PreparedListener(int positon) {

this.positon = positon;

}

@Override

public void onPrepared(MediaPlayer mp) {

mediaPlayer.start(); //开始播放

if(positon > 0) { //如果音乐不是从头播放

mediaPlayer.seekTo(positon);

}

}

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
第一,学习知识比较碎片化,没有合理的学习路线与进阶方向。
第二,开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
片转存中…(img-SEURPlyL-1712830440448)]

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
第一,学习知识比较碎片化,没有合理的学习路线与进阶方向。
第二,开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-d7Ej3unI-1712830440449)]

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值