关键词:
在Android中实现多媒体播放功能主要是通过MediaPlayer实现的。为了方便用户检测MediaPlayer的动作状态,Andorid为我们提供了一下接口
Nested Classes | |||||||||||
interface | MediaPlayer.OnBufferingUpdateListener | Interface definition of a callback to be invoked indicating buffering status of a media resource being streamed over the network. | |||||||||
interface | MediaPlayer.OnCompletionListener | Interface definition for a callback to be invoked when playback of a media source has completed. | |||||||||
interface | MediaPlayer.OnErrorListener | Interface definition of a callback to be invoked when there has been an error during an asynchronous operation (other errors will throw exceptions at method call time). | |||||||||
interface | MediaPlayer.OnInfoListener | Interface definition of a callback to be invoked to communicate some info and/or warning about the media or its playback. | |||||||||
interface | MediaPlayer.OnPreparedListener | Interface definition for a callback to be invoked when the media source is ready for playback. | |||||||||
interface | MediaPlayer.OnSeekCompleteListener | Interface definition of a callback to be invoked indicating the completion of a seek operation. | |||||||||
interface | MediaPlayer.OnVideoSizeChangedListener | Interface definition of a callback to be invoked when the video size is first known or updated |
通过这些接口可以检测
1.流媒体缓冲的状态
2.播放结束
4.信息交换(不好意思,是什么信息没有确认过。)
5.媒体准备好
6.定位结束
7.视频尺寸变化
但是无论谁做播放器都想知道的现在的播放位置却没有监测手段。为了解决这个问题,有一个很自然得想法就是做一个定时器。
关于Android定时器的使用,网上有很多例子。一般来讲是这样的。
- public class TestTimerextends
- new
- new
- public void
- switch
- case 1:
- setTitle("hear me?"); //这里才是要做的事情。
- break;
- super.handleMessage(msg);
- ;
- new
- public void
- new
- 1;
- handler.sendMessage(message);
- ;
- public void
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- timer.schedule(task,10000); //启动定时器
- 看起来挺累的吧,但是又不得不看。有没有办法把这件事弄的漂亮一点呢,有。
首先,我们想要什么呢。比如下面这样 - public class TestTimerextends
- Timer t = new Timer(10000, new OnTimeListener()
- public void OnTimer()
- setTitle("hear me?"); //要做的事情。
- );
- public void
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- timer.start(); //启动定时器
- 是不是好多了。这样的代码在Android里到处都是,关键是我们自己做的代码会不会做成这样的。
总结一下,其实我们想要的是:
直说了吧,这就是Observer的简化版。不难吧,但是实际工作中会这么做的恐怕还真就不多。
其实这看似不大的一步,会从根本上改变我们的程序结构的。
下面是实际的代码,供参考。也可以到以下地址下载:javascript:void(0)
package LyricPlayer.xwg;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class SafetyTimer
Timer mTimer = null;
Handler mHandler = null;
TimerTask mTask = null;
OnTimeListener mListener = null;
long mInterval = 0; //in milliseconds
boolean mRepeate = false; //是否为重复Timer,指定为false时只动作一次(未经测试)
private static final String TAG = new String("SafetyTimer");
//Observer接口定义
public interface OnTimeListener
public void OnTimer();
//创建定时器并指定Observer
public SafetyTimer(long interval, OnTimeListener listener)
mInterval = interval;
mListener = listener;
//启动定时器
public void startTimer(boolean repeate)
mHandler = new Handler()
public void handleMessage(Message msg)
if(mListener != null)
mListener.OnTimer();
Log.i(TAG, "mListener.OnTimer()");
super.handleMessage(msg);
;
mTask = new TimerTask()
public void run()
Message message = new Message();
message.what = 0; //anything is ok.
mHandler.sendMessage(message);
;
mTimer = new Timer();
if(repeate)
mTimer.schedule(mTask, 0, mInterval);
else
mTimer.schedule(mTask, mInterval);
mRepeate = repeate;
Log.i(TAG, "startTimer(" + repeate + ")");
//停止Timer动作
//释放获得的资源。
public void stopTimer()
mTimer.cancel();
mTimer.purge();
mTimer = null;
mHandler = null;
mTask = null;
Log.i(TAG, "stopTimer()");
//Timer是否处于工作状态。
public boolean isRunging()
return (mTimer != null);
《andorid群英传》---读书笔记10.1(代码片段)
《Andorid群英传》—读书笔记10.1标签(空格分隔):android中级读书笔记Android5.X新特性详解知识点:Android5.XUI设计初步Android5.X新增特性分析12.1Android5.XUI设计初步12.1.1设计特点:1材料的形态模拟2更加真实的动画... 查看详情
测试与发布(alpha版本)
...004615一、需求&原型改进?需求的修改:?问题1.缺少显示歌词功能。?修改1.增加歌词显示功能,增大音乐播放界面以显示歌词,该功能使用歌词文件实现,能随音乐播放滚动歌词。?问题2.播放器主要设计为播放本地音乐,所以原... 查看详情
如何成功打造灯光秀设计项目
...,新起典文旅科技认为,选择一家适合的灯光秀设计公司是项目成功的关键。但是目前的夜游项目也存在很多问题,比如质量不高、设计雷同、缺乏创意等,这 查看详情
文旅灯光秀应该怎样进行设计
近几年全国各地灯光秀井喷式的发展,许多文旅灯节的灯光秀同化严重,相差无几,观光者们看了几眼后,就失去了新鲜感,再也不能再有新鲜感了。因此,我们要不断追求创新、创新,在灯光效果、... 查看详情
老司机双十一厚礼之玩转3dswiper性感秀之思路分析总结(代码片段)
前言 继一次的3D魔方之后,这次带你一起玩转性感美女秀,正常套路,请先一堵为快,有兴趣继续,没兴趣也可以看看美女养眼哦!想直接在线预览双十一快乐,这里是@IT·平头哥联盟,我是首席填坑官?苏南,用心分享做有... 查看详情
❤️ctfshowweb1-7❤️——ctf秀web模块解题思路,东半球第二细的通关教程!!!(代码片段)
...-7关,第二部分为8-14关,本篇博客为1-7关的通关教程,从解题思路和原理剖析两个方面进行讲解CTFShowweb1-7关详细教程解题思路CTFShowweb签到题CTFShowweb2CTFShowweb3CTFShowweb4CTFShowweb5CTFShowweb6CTFShowweb7原理剖析php: 查看详情
景区灯光秀夜游设计要如何突出主题
随着旅游项目的风潮和消费者对精神层面的追求越来越高,为了延长夜间消费、丰富体验,国内许多景点、主题公园、城镇都开展了许多夜游项目。 灯光技术的不断发展,逐渐成为丰富表演效果的一种手段,广... 查看详情
如何让歌词与歌曲同步显示
...然后在上面的歌曲出处右键另存为,然后在页面的下面的歌词出处也右键另存为下载歌词即可,然后直接复制到P4上,歌曲歌词文件名要相同,放在同一文件夹下即可实现歌词同步希望我的回答对你有所帮助.参考技术A1.一定要名... 查看详情
浅谈动感歌词-歌词解析篇
1引言要解析动感歌词文件,首先就要清楚动感歌词的文件内容,当然歌词的文件内容,我们已经在分析篇的文章里面介绍过了,这里将不再做详细的介绍,当我们可以把歌词成功解析出来后,再结合歌词生成篇,一个简单的歌... 查看详情
wpf制作歌词动画
最近再做一个UWP的音乐播放器,今天实现了歌词动画,不是滚动的,滚动的慢慢研究思路:在右边放了三个textBlock,设置textBlock的effect属性<TextBlock.Effect>  ... 查看详情
andorid实现皮皮蟹app的核心功能-语音播放
今天在跑一家面试的时候被问到能不能实现皮皮蟹的录音播放功能:概括起来就是在皮皮蟹里面选择需要播放的音频,保存到本地,然后跳转到微信点击录音的时候播放该音频,乍看一下感觉这个问题其实挺简单... 查看详情
玩转3dswiper性感秀之思路分析总结(代码片段)
前言 继一次的3D魔方之后,这次带你一起玩转性感美女秀,正常套路,请先一堵为快,有兴趣继续,没兴趣也可以看看美女养眼哦??!想直接在线预览??各位大佬早安,这里是@IT·平头哥联盟,我是首席填坑官?苏南,用心分享... 查看详情
microsoft为microbit.org设计的课程
...https://www.microbit.co.uk/blocks/lessons,是由microsoft为microbit.org设计的课程MicrobitShop 入门课程BeautifulImage,用LEDs,秀美丽的图样Lucky7,秀数字在LED屏幕上AnsweringMachine,使用字符串秀文字讯息GameofChance,学习用按键做字符串控制Smiley, 查看详情
go练习题—动态打印歌词(代码片段)
...时候,写的第一个练习题就是Python练习题—动态打印歌词。现在开始学习Golang,也沿用原来的学习路线,实现一下打印歌词实现思路代码实现起来基本上是非常简单的,由以下几步组成:读取文件逐行解析出... 查看详情
网页设计,怎么做歌词与音乐同步?
怎么在以下这段播放器代码修改可以显示歌词并与音乐同步?Ctrl+C请自重!<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="... 查看详情
andorid學習筆記
如何编程显示lrc歌词?
...络>>程序设计>>其他编程语言问题描述:我知道LRC歌词的原理,就是根据歌词文件里面的标签来显示的嘛但是编程的时候到底该怎么办?先把全部文件读出、排序,还是等到要显示的时候再去找歌词?怎样才能使得效率最... 查看详情
https设计思路,看不懂打死我
HTTPS设计思路,看不懂打死我写这篇文章的初衷是让大家彻底了解https的设计思路 查看详情