影音app项目笔记

欢迎页splash launcher welcome

防止启动多次,①设置为单例模式启动 ②设置true  在destory中所有的消息都移除
@Override
protected void onDestroy() {
    handler.removeCallbacksAndMessages(null);
    super.onDestroy();
}

1. BasePager
a 构造方法的时候,视图创建,initView(),孩子强制实现该方法
b 在initData()初始化子页面的数据

2.实现四个页面
VideoPager
AudioPager
NetVideoPager
NetAudioPager

3.实例化四个页面并且放入集合汇总
4.当点击radiobutton的时候,监听radioGroup状态变化,
显示不同页面,fragment替换不同的页面

主页是fragment和radiobutton之间的切换软件框架的基本搭建

titlebar 里面的整设计,主要是文字按下的效果,设置圆角和按下的背景效果

public class TitleBar extends LinearLayout
实现三个方法,
public TitleBar(Context context) {
    this(context,null);
}

/**
 * 布局文件使用该类的时候,通过构造的
 * @param context
 * @param attrs
 */
public TitleBar(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs,0);
}

/**
 * 使用样式的时候实例化
 * @param context
 * @param attrs
 * @param defStyleAttr
 */
public TitleBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    this.mContext = context;
}

TitleBar替换布局的LinearLayout,得到不同的孩子。

本地视频

本地视频列表
1.写布局 相对布局:ListView 和TextView ProgressBar
2.加载本地视频,在线程中加载视频,加载的视频放入集合中
3.item点击事件,加载本地视频

MediaPlayer和VideoView
Android系统中提供开发者多媒体应用(音视频)
一、MedioPlayer 解码的是底层
MedioPlayer负责和底层打交道,封装了很多方法start,pause,stop,播放视频的类
这个MediaPlayer可以播放本地 网络
播放网络的时候需要权限

1.执行流程
2.视频支持的格式
mp4,3gp,m3u8
直接用pc的.mp4
底层是用handler和底层交互

二、VideoView
显示视频,继承SurfaceView类,实现MediaPlayerControl接口,封装了mediaplayer的
start stop pause的方法,本质上是调用MediaPlayer

SurfaceView
默认使用缓冲技术,支持在子线程中绘制图像,这样就不会阻塞主线程,所以更适合游戏和视频的开发
实现Media PlayerControl的接口,便于控制面板videoview的方法

Activity的生命周期和横竖屏切换的生命周期
一、生命周期
1.创建activity的时候执行的方法
onCreate() onStart() onPause()
2.销毁activity的时候执行的方法
onPause() onStop() onDestory()
二、A 跳转到 B,再点击返回,这个过程的生命周期
B页面完全覆盖页面的情况
A跳转B页面的生命周期方法
onPause()A onCreate()B onStart()B onResume()B onStop()A
B页面点击返回的生命周期方法
onPause()B onReStart()A onStart()A onResume()A onStop()B onDestory()B

B页面不完全覆盖A页面的请求
A跳转B页面的生命周期
onPause(A onCreate()B onStart()B onResume()B
B页面点击返回的生命周期
onPause()B onResume()A onStop()B onDestory()B

Activity的横竖屏生命周期
默认情况:onPause()  onstop()  onDestory()  onCreate() onStart() onDestory()
导致生命周期重新执行
android:configChanges="keyboardHidden|screenSize|orientation"
可以解决

Seekbar更新

1.视频的总时长和seekbar的setMax(总时长)
准备好的回调之后
2.实例化handler,得到每秒当前视频的进度,seekbar.setProgress(当前进度);
 

电量变化

电量变化是广播
1.静态注册,是在清单文件中
2.动态注册,是在代码中注册

IntentFilter filter = new IntentFilter ();

filter.addAction(Intent.ACTION_BATTERY_CHANGED);
class MyReceiver extends BroadcastReceiver {

       @Override
       public void onReceive(Context context, Intent intent) {
           int level = intent.getIntExtra("level", 0);//0~100;
           setBattery(level);//主线程
       }
   }

   private void setBattery(int level) {
       if (level <= 0) {
           ivBattery.setImageResource(R.drawable.ic_battery_0);
       } else if (level <= 10) {
           ivBattery.setImageResource(R.drawable.ic_battery_10);
       } else if (level <= 20) {
           ivBattery.setImageResource(R.drawable.ic_battery_20);
       } else if (level <= 40) {
           ivBattery.setImageResource(R.drawable.ic_battery_40);
       } else if (level <= 60) {
           ivBattery.setImageResource(R.drawable.ic_battery_60);
       } else if (level <= 80) {
           ivBattery.setImageResource(R.drawable.ic_battery_80);
       } else if (level <= 100) {
           ivBattery.setImageResource(R.drawable.ic_battery_100);
       } else {
           ivBattery.setImageResource(R.drawable.ic_battery_100);
       }
   }

 //注册电量广播
        receiver = new MyReceiver();
        IntentFilter intentFiler = new IntentFilter();
        //当电量变化的时候发这个广播
        intentFiler.addAction(Intent.ACTION_BATTERY_CHANGED);
        registerReceiver(receiver, intentFiler);

手势识别器

1.定义 GestureDetector  detector

2.实例化 new GestureDetector ()两个参数的 上下文和监听器

重写 实现监听器的三个方法

 

双击  onDoubleTop()

实现屏幕的放大和缩小

自定义VideoView 去继承 系统的,重写一些方法

onMeasure()测量的方法 setMeasuredDimension()

Viewgroup.LayoutParams params = getLayoutParams();

得到宽高进行赋值

DisplayMetrics  displayMetrics = new DisplayMetrics ();

getWindowsManager().getDefaultDisplay().getMetrics(displayMetrics );

width = displayMetrics .widthPixels()  高同理

视频本来的宽高 mediaPlayer可以得到

 

单击onSingleTapConfirmed()

点击隐藏和显示控制面板,显示的时候handler5秒之后自动隐藏

 

长按 onLongPress()

3.onTouchEvent(),方法中把手势传递给识别器

detector.onTouchEvent(event);事件的解析,不拦截

调节声音

1.实例化AudioManager  系统的服务

getSysytemService()

当前的音量

最大音量

2.SeekBar.setMax(最大音量)

SeekBar.setProgress(当前音量)

3.设置seekBar状态的变化

上滑和下滑改变声音

下滑

float    distanceY = startY - endY    < 0

上滑

float    distanceY = startY - endY    > 0

滑动屏幕的距离:总距离 =  改变声音  : 音量最大值

改变声音 = (滑动屏幕的距离: 总距离)* 音量的最大值

最终声音 = 原来的 + 改变声音

1.onTouchEvent方法里,在down的时候

startY

touchRang 总距离

移除消息

mVol

2.在move

float endY = event.getY();

float distanceY = endY - startY;

改变声音 = (滑动屏幕的距离: 总距离)* 音量的最大值

最终声音 = 原来的 + 改变声音

updateVoice()

3.在up的时候重新发消息

 

如何让其它软件能调起自己写的播放器

参照系统提供的

1.在清单文件中添加

<activity
            android:name=".activity.SystemVideoPlayer"

            android:configChanges="keyboardHidden|screenSize|orientation"
            android:label="@string/player_name"
            android:screenOrientation="landscape"
            android:theme="@style/noAnimation_Theme">

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="rtsp" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="video/*" />
                <data android:mimeType="application/sdp" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="http" />
                <data android:mimeType="video/mp4" />
                <data android:mimeType="video/3gp" />
                <data android:mimeType="video/3gpp" />
                <data android:mimeType="video/3gpp2" />
            </intent-filter>

2.文件或者图片浏览器

   1.调起系统所有的播放--隐式意图

                   Intent intent = new Intent()

                   intent.setDtaAndType(Uri.parse("视频播放地址"),"video/*");

                   context.startActivity(intent);

3.视频播放器就会被调起和播放

uri  = getIntent().getData();

4.设置播放地址

videoview.setVideoURL(uri);

网络资源设置缓冲

videoview.getBufferPercent()

视频卡住了

videoview.setOnInfoListener()监听事件 android4.2.2才放入videoview

拖动卡,拖动结束了

监听不同的状态

校验播放进度判断是否监听卡

原理:

当前播放进度 - 上一次播放进度 < 0   监听卡

显示网速

每隔一段时间去获取网速的大小,然后计算当前网速  百度搜索 学会阅读别人的代码,修改成自己的

vitamio万能播放器

1.官网下载

2.下载完成后解压,运行,

集成

   1.关联库 

   2.清单文件中的权限

   配置

3.把系统systemVideoPlayer复制一份,改名vitamioVideoPlayer

导入的包全部换成是vitamio的包,MedioPlayer  VideoView

4。布局文件activity_system_video_plater.xml复制一份

改名activity_vitamio_video_plater.xml  并且把里面的videoview换成vitamio

5.初始化vitamio库,在布局文件加载之前

vitamio.isInitalized(this)

6当系统播放器播放出错的时候跳转到VitamioVideoPlayer播放

注意 a 把数据传入vitamioVIdeoPlayer播放器

        b   关闭系统播放器

<category android:name="android.intent.category.LAUNCHER" />

launcher可以让app在桌面显示图标,可以有两个入口,在桌面显示两个app的入口

下拉刷新XListView

加载图片picasso  gilde  xutils3

xutils3

x.image().bind(viewHoder.iv_icon,mediaItem.getImageUrl());

picasso 

Picasso.with(context).load(mediaItem.getImageUrl())
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .placeholder(R.drawable.video_default)
                .error(R.drawable.video_default)
               .into(viewHoder.iv_icon);

gilde 

        Glide.with(context).load(mediaItem.getImageUrl())
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .placeholder(R.drawable.video_default)
                .error(R.drawable.video_default)
                .into(viewHoder.iv_icon);

两种直播方式

1.在服务器上获取流,一边下载一边播放,不是 实时的

2.把手机当前环境播出去

手机生成视频,上传服务器(声网第三方)

做视频播放器的两种方式

1.第一种方式:直接使用VideoView

2.第二种:在activity中封装MediaPlayer和surfaceView

 

知识回顾

1.启动页面延迟两秒进入主页

2.快速进入主页面,会实例化多个页面,设置单例模式,从源头控制,只能启动一次

3.实现主页面的布局

4.自定义radioButton  没有前面的小圈,背景设置为透明

5.标题栏  继承的自定义

6.自定义类继承线性布局,把标题栏布局包在里面

7.写一个公共的页面BasePager

8.实现各个页面

9.把页面初始化

10.设置radioGroup的监听

11.根据radioGroup切换不同的页面Fragment

12.软件的架构

13.软件分析

14.读取本地的视频,在6.0之后动态获取权限

15.简单的播放器

16.把所有的播放器调起来

17.MediaPlayer,和底层交互(c或者C++)

18.VideoView,封装了MedioPlayer继承SurfaceView

19.视频的播放完成的监听,播放出错,播放好的监听

20.自定义VideoView视频视频全屏和默认

21.手势识别器  双击   单击    长按   5s自动隐藏控制面板

22.控制面板

23.屏幕横竖屏切换,生命周期的屏蔽

24.Activity的生命周期

25.Activity和Service交互AIDL

26.EventBus

27.声音的调节

28.亮度的调节

29.滑动屏幕改变亮度和声音

30.用声网的sdk实现直播

31.两种实现播放器的方式

32.视频进度的更新

33.万能播放器和系统播放器的切换

34。万能解码框架简介  ffmpeg  ,VLC,Vitmaio

35.Vitmaio的集成

36.网络视频的缓存效果

37.监听卡,人为监听卡

38.拖动卡

39.显示网络速度

40.加载视频等待效果

41.把本地电脑共享wfi热点,让手机连接播放电脑的tomcat资源 ipconfig

42.读取本地音乐

43.播放音乐,service

44.ServiceConnection

45.Activity和服务交互-AIDL

46.帧动画

47.播放歌曲

48.上一首,下一首

49.设置播放模式

50.通过广播获取当前播放歌曲的事件和名称

51.播放歌曲的进度更新

52.歌词显示控件ShowLyricView,继承TextView

53.设置假歌词

54.绘制歌词

55.解析歌词-一行一行的读取,排序,计算每句显示的时间

56.歌词同步

57.解决歌词乱码问题

58.网络视频-xUtils3请求网络

59.使用系统的API解析json数据

60.使用xListVIew做下拉和上拉刷新

61.分类型的ListVIew

62.使用jcvideoPlayer-lib在Listview中播放视频

63.使用Glide加载图片

64.使用科大讯飞语音输入

65.Gson解析和GsonFormat

66.标题栏

67.软件退出

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值