[android] surfaceview的生命周期
界面布局和上一节的mp3基本一样,播放视频需要一个控件SurfaceView
SurfaceView控件在内部维护了一个双缓冲的技术,使用两个线程进行解析帧和显示到界面上
在Activity的onCreate()方法里面,找到控件对象
其他代码和上一节的音频播放一致
找到MediaPlayer对象调用setDataSource()方法,之前
调用MediaPlayer对象的setDisplay()方法,设置影片以SurfaceHolder的方式播放,参数:SurfaceHolder对象,调用SurfaceView对象的getHolder()方法来得到
调用MediaPlayer对象的prepareAsync()方法,进行异步准备
调用MediaPlayer对象的setOnPreparedListener()方法,设置准备完成的监听器,在重写方法里,调用MediaPlayer对象的start()方法
在低版本的手机上,加上下面的代码,指定自己不维护缓冲区,等待MediaPlayer将数据推送出来
调用SurfaceView对象的getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS)
当界面最小化不可见后,重新打开SurfaceHolder会被销毁,这是系统设计为了节省内存
当界面不可见的时候,应该记录播放位置并且停止掉,当重新可见的时候,重新打开
获取SurfaceHolder对象,调用SurfaceView对象的getHolder()方法
调用SurfaceHolder对象的addCallback()方法,添加回调,参数:Callback的接口类型,使用匿名内部类来实现接口,重写以下方法
surfaceDestroyed(),销毁的时候
判断MediaPlayer不为空并且MediaPlayer.isPlaying()为真
把进度保存在Activity的成员变量currentPosition里面,调用MediaPlayer对象的getPosition()
停止掉播放
surfaceCreated(),创建的时候
调用播放代码,通过传参把currentPosition传递过去,在准备完成的回调中play后面,调用MediaPlayer对象的seekTo()把位置设置上次位置
貌似是因为不支持很多格式,代码没测试成功,不贴了
相关文章
- iOS小技能:敏感逻辑的保护方案
- iOS小技能:【intercept the HTTP/HTTPS requests 】利用NSURLProtocol 拦截请求
- iOS小技能:UIWebView 被拒的解决方案(用更安全的WKWebView替代UIWebView)
- iOS小技能:打包注意事项(私有API检测)
- iOS抽奖转盘上篇:概率抽奖算法 & 转盘算法 &轮盘边框动画丨(内含完整Demo)
- Android平台GB28181接入模块技术接入说明
- iOS 离线发表博客的 APP MWeb
- Android平台GB28181设备接入模块分辨率发生变化怎么办?
- Android Camera2 Focus Distance
- 小程序化正在成为大势所趋?
- 小程序化正在成为线上教育服务的最佳方式
- 技术干货|如何借助FinClip实现小程序在硬件设备上的运行
- Jitpack发布Android库出现Direct local .aar file dependencies are not supported when building an AAR
- 关于Android12安装apk出现-108异常INSTALL_PARSE_FAILED_MANIFEST_MALFORMED的解决方法
- Android 多module情况下module依赖aar问题处理
- Android7.0以上的分享图片文件错误及解决方法
- Android开发 对接微信分享SDK总结
- Android RecyclerView使用ListAdapter高效刷新数据
- Android自动化测试工具调研
- Android 自动取色并设置沉浸式状态栏