Android之项目-手机播放器的流程笔记及注意事项

项目名称:手机播放器

欢迎界面通过HandlerpostDelay延迟进入主页面,onTouch,removeMsg,单例启动模式,并用boolean值控制单例;

FrameLayout+ViewPager+RadioGroup的页面框架,基类抽象类BasePager,抽象方法initView强制子类实现,视图和数据分别加载,同时也用boolean值控制避免数据多次加载。

本地视频,在分线程使用contentResolver和MediaStore常量获取sd卡中的视频,并封装为MediaItem序列化对象;自己实现播放器,主要是通过VideoView实现,避免横竖屏切换的生命周期变化以及主题换成全屏模式,自定义部件如文件名电量时间音量进度时长以及播放的控制按钮,seekbar的外观,进度条的高度、thumb和progress背景,设置进度变化的监听,是fromUser,执行seekTo方法。

监听电池电量变化,动态注册广播接收器,intentFilter.addAction(Intent.ACTION_battery_changed),根据intent.getIntExtra("level",0)得到电量,设置不同电池图片。

Listitem点击时bundle传递列表和position,监听播放完成播放下一个上一个的按钮,回退按钮,实现手势探测器长按暂停播放,单击显示隐藏控制器,并通过handler发消息和remove消息实现没有操作之后3s隐藏面板,在seekbar和onclick后面统一remove消息并重发保证操作时面板存在。

重写VideoView类,集成系统的VideoView,3个构造器,重写onMeasure方法中setMeasuredDimension(宽高),写自定义方法setVideoSize(宽,高),得到ViewGroup的LayoutParams参数,把传入的宽高给参数赋值,setLayoutParams(params),然后根据屏幕宽高和视频宽高设置播放视频的宽高。

使用AudioManager(getSystemService(AUDIO_SERVICE)),得到并设置音量,设置音量seekbar监听和静音监听,同时在onTouchEvent方法中监听down、move、up方法,根据右侧竖直方向的位置变化改变音量大小,重写onKeyEvent方法,绑定音量物理键的监听。

实现其他软件调起自己写的播放器,找到系统源码packages/apps/Gallery图片App的清单配置文件,找到MovieView Activity,原样复制它的IntentFilter到自己写的播放器页面,可以设置个性化label,这时候在别的地方要打开视频文件时可以在列表中看到自己写的播放器了。这时候要在工具类中写判断是否网络视频的方法,在videoview.setVideoURi|Path之后判断一下,如果是网络视频,则要根据缓冲进度在handler里面每秒更新设置播放进度条secondprogress。

监听播放卡顿,videoview.setOnInfoListener,这是17之后集成的版本,如果低于这个版本的话,在播放时如果一秒前后进度<500毫秒,则是为卡顿,显示一下网速优化用户体验。

利用TrafficStats.getUidRxBytes(getApplicationInfo().uid)==TrafficStats.UNSUPPORTED ? 0 :(TrafficStats.getTotalRxBytes()/1024)等方法得到网速,在初始化页面时发消息显示网速,每2秒更新;

播放出错监听:出错原因有三种①播放的视频格式不支持,解决方法是跳转到万能播放器播放;②播放网络视频时网络中断,解决方法是判断网络如果是确实断了,提示用户;如果网络断断续续,则重新播放;③播放的时候本地文件中间有空白,解决方法是下载做完成;

集成万能播放器Vitamio,下载之后import Module,compile project,按照sample和指导文件配置清单文件里权限和initActivity,把之前自己写的播放器类copy一份,把里面的videoview和mediaplayer的包改为vitamio的,复制自定义videoview类为vitamio的,把布局文件复制改自定义videoview为vitamio的,并且在setcontentview之前调用Vitamio.isInitialized(this),在系统播放器中监听error播放错误时跳转到Vitamio万能播放器上,如果万能播放器也不能播放,则finish页面,屏蔽页面切换动画。

网络视频页面,使用xUtils3工具inject布局控件,首先下载并导入compile,按照指导文件在application中调用x.Ext.init(this);方法,注册应用名称,调用x.View().intect(当前pager,布局);之后可以注入控件,调用x.http().get(param,commomcallback)方法在success中得到数据,SharedPreference缓存,因为Xutil3已经集成了分线程网络,这里不需要再起线程,解析json数据之后同样根据数据给列表设置适配器,glide加载和缓存图片。

使用xListView实现下拉刷新和加载更多,首先下载了源码importModule,修改build.gradle和app一致,把XListView,header,footer以及对应的布局图片文件都copy过去重导入R包,把网络视频pager的listview换成copy的XlistView,setPull和XListView监听,下拉重新加载initview的下载配置方法,onload,同时Item监听传递的position-1,因为header占了list的0位置。

同样利用contentResolver得到sd卡中的音乐列表,利用Animationlist或者第三方监听频谱实现动画效果;

服务器方面先创建服务器的子类,实现onbind和create方法,得到音乐列表,注册并写一些音乐播放常用方法的方法体,如seekto, isPlaying, getset各种方法,同样在aidl接口文件中注册rebuild生成,在service中实例化子类返回给onbind方法值,然后在player页面中绑定服务,在连接成功方法中得到service代理类,调用服务的openAudio方法,设置监听,mediaPlayer.prepareAsync()实现音乐播放,实现播放暂停,在准备监听方法中发广播给player以方便页面接受音乐的名时长进度等信息并显示,同时用handler实现进度更新,seekbar的拖动监听。

在音乐播放的时候设置手机状态栏信息,intent传递时任务栏跳转信息,凭此值不需要重新得到position和服务重连之后的openAudio,但需要重新载入广播来的音乐信息,并且player页面启动模式是单例的。

最后实现listview分类加载,做成类似于朋友圈和微博那样同页加载广告视频动图图片等。在adapter中多重写getViewTypeCount和getItemViewType方法,集成JCVideoPlayer和GifImageView,其中节操播放器需要初始化ImageLoader。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值