音频播放服务
最近写了个音频播放的服务,功能包括准备资源、播放、暂停、前进多少秒,后退多少秒
import android.content.Intent; import android.os.Binder; import android.os.IBinder; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import tv.danmaku.ijk.media.player.IMediaPlayer; import tv.danmaku.ijk.media.player.IjkMediaPlayer; /** * Created by Administrator on 2017/6/26. */ public class VoiceService extends BaseService { private IjkMediaPlayer mediaPlayer; private VoicePlayListener voicePlayListener; private long totalTime; private Timer timer; public static final int IDLE = 1; public static final int PREPARED = 2; public static final int PLAYING = 3; public static final int PAUSE = 4; public static final int FINISH = 5; private SimpleDateFormat dateFormat = new SimpleDateFormat("mm:ss"); public class VoiceBinder extends Binder { public VoiceService returnBinder() { return VoiceService.this; } } @Override public IBinder onBind(Intent intent) { VoiceBinder binder = new VoiceBinder(); return binder; } @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onCreate() { super.onCreate(); mediaPlayer = new IjkMediaPlayer(); totalTime = mediaPlayer.getDuration(); } @Override public void onDestroy() { super.onDestroy(); } public void setUrl(String url) { try { mediaPlayer.setDataSource(url); } catch (IOException e) { e.printStackTrace(); } } public void prepare(final VoicePlayListener voicePlayListener) { this.voicePlayListener = voicePlayListener; mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new IMediaPlayer.OnPreparedListener() { @Override public void onPrepared(IMediaPlayer iMediaPlayer) { setProgress(PREPARED); } }); } public void play() { if (!mediaPlayer.isPlaying()) { mediaPlayer.start(); setProgress(PLAYING); } else { mediaPlayer.pause(); setProgress(PAUSE); } } public void forward() { if (mediaPlayer.getCurrentPosition() + 15000 < totalTime) { mediaPlayer.seekTo(mediaPlayer.getCurrentPosition() + 15000); setProgress(PLAYING); } else { mediaPlayer.stop(); setProgress(FINISH); } } public void back() { if (mediaPlayer.getCurrentPosition() - 15000 > 0) { mediaPlayer.seekTo(mediaPlayer.getCurrentPosition() - 15000); } else { mediaPlayer.seekTo(0); } setProgress(PLAYING); } private void setProgress(final int state) { if (null != timer) { timer.cancel(); } timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { voicePlayListener.onPlay(state, (int) (mediaPlayer.getCurrentPosition() * 100 / mediaPlayer.getDuration()), dateFormat.format(new Date(mediaPlayer.getCurrentPosition())), dateFormat.format(new Date(mediaPlayer.getDuration()))); } }, 0, 1000); } public interface VoicePlayListener { void onPlay(int state, int progress, String currentTime, String totalTime); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现