Android 伤敌一千自损八百之萤石摄像头集成(三)
说一下萤石原生播放
先上代码
private MyOrientationDetector mOrientationDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (TextUtils.isEmpty(appkey)
|| TextUtils.isEmpty(accesstoken)
|| TextUtils.isEmpty(playUrl)){
Toast.makeText(this,"appkey,accesstoken or playUrl is null",Toast.LENGTH_LONG).show();
finish();
return;
}
mOrientationDetector = new MyOrientationDetector(this);
new WindowSizeChangeNotifier(this, this);
mBtnPlay = (Button) findViewById(R.id.btn_play); //获取EZUIPlayer实例
mEZUIPlayer = (EZUIPlayer) findViewById(R.id.player_ui);
//设置加载需要显示的view
mEZUIPlayer.setLoadingView(initProgressBar());
mEZUIPlayer.setRatio(16*1.0f/9); mBtnPlay.setOnClickListener(this);
mBtnPlay.setText(R.string.string_stop_play);
preparePlay();
setSurfaceSize();
}
/**
* 创建加载view
* @return
*/
private View initProgressBar() {
RelativeLayout relativeLayout = new RelativeLayout(this);
relativeLayout.setBackgroundColor(Color.parseColor("#000000"));
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
relativeLayout.setLayoutParams(lp);
RelativeLayout.LayoutParams rlp=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
rlp.addRule(RelativeLayout.CENTER_IN_PARENT);//addRule参数对应RelativeLayout XML布局的属性
ProgressBar mProgressBar = new ProgressBar(this);
mProgressBar.setIndeterminateDrawable(getResources().getDrawable(R.drawable.progress));
relativeLayout.addView(mProgressBar,rlp);
return relativeLayout;
} /**
* 准备播放资源参数
*/
private void preparePlay(){
//设置debug模式,输出log信息
EZUIKit.setDebug(true);
if (TextUtils.isEmpty(mGlobalAreaDomain)) {
//appkey初始化
EZUIKit.initWithAppKey(this.getApplication(), appkey); }else{
//appkey初始化 海外版本
EZUIKit.initWithAppKeyGlobal(this.getApplication(), appkey,mGlobalAreaDomain);
} if (!TextUtils.isEmpty(API_URL)){
EzvizAPI.getInstance().setServerUrl(API_URL, null);
} //设置授权accesstoken
EZUIKit.setAccessToken(accesstoken); // EZPlayer player = EZOpenSDK.getInstance().createPlayer(String deviceSerial,int cameraNo);
//
// EZOpenSDK.getInstance().createPlayer("D95658258",1).setPlayVerifyCode("PNXFPY"); //设置播放资源参数
mEZUIPlayer.setCallBack(this);
mEZUIPlayer.setUrl(playUrl); //try {
// EZOpenSDK.getInstance().openCloudPage("504242549");
//} catch (BaseException e) {
// e.printStackTrace();
//}
}
@Override
protected void onResume() {
super.onResume();
mOrientationDetector.enable();
Log.d(TAG,"onResume");
//界面stop时,如果在播放,那isResumePlay标志位置为true,resume时恢复播放
if (isResumePlay) {
isResumePlay = false;
mBtnPlay.setText(R.string.string_stop_play);
mEZUIPlayer.startPlay();
}
} @Override
protected void onPause() {
super.onPause();
mOrientationDetector.disable();
} @Override
protected void onStop() {
super.onStop();
Log.d(TAG,"onStop + "+mEZUIPlayer.getStatus());
//界面stop时,如果在播放,那isResumePlay标志位置为true,以便resume时恢复播放
if (mEZUIPlayer.getStatus() != EZUIPlayer.STATUS_STOP) {
isResumePlay = true;
}
//停止播放
mEZUIPlayer.stopPlay();
} @Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy"); //释放资源
mEZUIPlayer.releasePlayer();
} @Override
public void onPlaySuccess() {
Log.d(TAG,"onPlaySuccess");
// TODO: 2017/2/7 播放成功处理
mBtnPlay.setText(R.string.string_pause_play);
} @Override
public void onPlayFail(EZUIError error) {
Log.d(TAG,"onPlayFail");
// TODO: 2017/2/21 播放失败处理
if (error.getErrorString().equals(EZUIError.UE_ERROR_INNER_VERIFYCODE_ERROR)){ }else if(error.getErrorString().equalsIgnoreCase(EZUIError.UE_ERROR_NOT_FOUND_RECORD_FILES)){
// TODO: 2017/5/12
//未发现录像文件
Toast.makeText(this,getString(R.string.string_not_found_recordfile),Toast.LENGTH_LONG).show();
}
} private int width;
private int height; @Override
public void onVideoSizeChange(int width, int height) {
// TODO: 2017/2/16 播放视频分辨率回调
Log.d(TAG,"onVideoSizeChange width = "+width+" height = "+height);
} @Override
public void onPrepared() {
Log.d(TAG,"onPrepared");
//播放
mEZUIPlayer.startPlay();
} @Override
public void onPlayTime(Calendar calendar) {
//Log.d(TAG,"onPlayTime");
if (calendar != null) {
// TODO: 2017/2/16 当前播放时间
//Log.d(TAG,"onPlayTime calendar = "+calendar.getTime().toString());
}
} @Override
public void onPlayFinish() {
// TODO: 2017/2/16 播放结束
Log.d(TAG,"onPlayFinish");
} /**
* 屏幕旋转时调用此方法
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d(TAG,"onConfigurationChanged");
setSurfaceSize();
} private void setSurfaceSize(){
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
boolean isWideScrren = mOrientationDetector.isWideScrren();
Log.d(TAG,"isWideScrren = "+isWideScrren +" dm.widthPixels = "+dm.widthPixels+" dm.heightPixels = "+dm.heightPixels);
//竖屏
if (!isWideScrren) {
//竖屏调整播放区域大小,宽全屏,高根据视频分辨率自适应
if (width == 0 ){
mEZUIPlayer.setSurfaceSize(dm.widthPixels, 0);
}else{
mEZUIPlayer.setSurfaceSize(dm.widthPixels, height*dm.widthPixels/width);
}
} else {
//横屏屏调整播放区域大小,宽、高均全屏,播放区域根据视频分辨率自适应
mEZUIPlayer.setSurfaceSize(dm.widthPixels,dm.heightPixels);
}
} @Override
public void onWindowSizeChanged(int w, int h, int oldW, int oldH) {
if (mEZUIPlayer != null) {
setSurfaceSize();
}
} public class MyOrientationDetector extends OrientationEventListener { private WindowManager mWindowManager;
private int mLastOrientation = 0; public MyOrientationDetector(Context context) {
super(context);
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
} public boolean isWideScrren() {
Display display = mWindowManager.getDefaultDisplay();
Point pt = new Point();
display.getSize(pt);
return pt.x > pt.y;
}
@Override
public void onOrientationChanged(int orientation) {
int value = getCurentOrientationEx(orientation);
if (value != mLastOrientation) {
mLastOrientation = value;
int current = getRequestedOrientation();
if (current == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
|| current == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
} private int getCurentOrientationEx(int orientation) {
int value = 0;
if (orientation >= 315 || orientation < 45) {
// 0度
value = 0;
return value;
}
if (orientation >= 45 && orientation < 135) {
// 90度
value = 90;
return value;
}
if (orientation >= 135 && orientation < 225) {
// 180度
value = 180;
return value;
}
if (orientation >= 225 && orientation < 315) {
// 270度
value = 270;
return value;
}
return value;
}
}
public static final String APPKEY = "";
public static final String AccessToekn = "";
public static final String PLAY_URL = ""; 这里
APPKEY 、
AccessToekn 是萤石平台申请的
PLAY_URL 是拼接的//萤石平台拼接方法链接 https://open.ys7.com/doc/zh/readme/ezopen.html萤石到此为止,特此记录,
免得下次忘了还得看sdk
日常许愿5星曹大爷刘大爷+毒奶粉《神话equipment》
Android 伤敌一千自损八百之萤石摄像头集成(三)的更多相关文章
- Android 伤敌一千自损八百之萤石摄像头集成(二)
本章主要是结合webview展示直播 app负责配网展示设备 加载webview播放 不介绍别的只说集成,至于APP_KEY.accessToken怎么获取的不予解释,官网都有 获取WiFi名称 这里 ...
- Android 伤敌一千自损八百之萤石摄像头集成(一)
最近忙着修改萤石摄像头C3型号开头的设备添加 本来不是很复杂的事情. , 现在我感觉我入魔了 总感觉这是个小人 螺丝口是眼睛 插入SD卡的事鼻子嘴 接信号的事手 怎么看怎么像愤怒的小人 总结,先看一下 ...
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...
- Spring Boot(十八):使用Spring Boot集成FastDFS
Spring Boot(十八):使用Spring Boot集成FastDFS 环境:Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0 功能:使用Spring Boot将文 ...
- Android开发教程 - 使用Data Binding(八)使用自定义Interface
本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...
- 【Android开发学习笔记】【第八课】五大布局-下
概念 五大布局上一篇文章已经介绍了 LinearLayout RelativeLayout 这一篇我们介绍剩下的三种布局 FrameLayout 五种布局中最佳单的一种布局.在这个布局在整个界面被当成 ...
- 从头学起android<GridView网格视图.二十八.>
GridView基于组件的网络格所有的形式的组分的,例如:当制作专辑,所有的图片将在相同的尺寸在不同的显示格在孩子,是否能够依靠这个组件完成.此组件的继承结构参见例如下面: java.lang.Obj ...
- Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》
之前本专栏文章中的小案例有写到:第三十九话<Chronometer实现倒计时> 以及使用异步实现倒计时:第三十三话< AsyncTask异步倒计时> 本篇文章 结合Timer. ...
- Fragment详解-android学习之旅(四十八)
Fragment的设计哲学 Fragment的继承体系 Fragment的开发 大部分都会继承如下的三个方法 Fragment与Activity的通信 Fragment与Activity交互信息 Fr ...
随机推荐
- Java实现 LeetCode 213 打家劫舍 II(二)
213. 打家劫舍 II 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗 ...
- java实现第七届蓝桥杯取球博弈
题目9.取球博弈 取球博弈 两个人玩取球的游戏. 一共有N个球,每人轮流取球,每次可取集合{n1,n2,n3}中的任何一个数目. 如果无法继续取球,则游戏结束. 此时,持有奇数个球的一方获胜. 如果两 ...
- ESXI多网卡网络配置
1.两台路由器接入不同网络: 2.一台4网口服务器,网口分别为:vmnic0.vmnic1.vmnic2.vmnic3 3.ESXI6.5服务器虚拟机系统 测试环境模拟: 路由1:192.168.0. ...
- mysql导入超大sql文件
mysql导入超大sql文件 在网上找了个2017年行政区划的sql文件,需要导入到本地mysql库中,同事使用navicat导入的时候直接卡死了,该SQL文件差不多112MB大小.通过百度.goog ...
- ffmpeg m3u8生成 剪辑及格式转换
使用 ffmpeg 工具, 生成 m3u8 文件 ffmpeg -re -i 03.ts -c copy -f hls -hls_base_url /Users/admin/Downloads/dow ...
- RocketMQ系列(五)广播与延迟消息
今天要给大家介绍RocketMQ中的两个功能,一个是"广播",这个功能是比较基础的,几乎所有的mq产品都是支持这个功能的:另外一个是"延迟消费",这个应该算是R ...
- 学习nginx从入门到实践(四) 基础知识之nginx基本配置语法
nginx基本配置语法 1.http相关 展示每次请求的请求头: curl -v http://www.baidu.com 2.nginx日志类型 error.log. access.log log_ ...
- [AGC034F]RNG and XOR
题目 点这里看题目. 分析 第一步可以将\(A\)数组转化成概率\(P(j)\):每一步操作异或\(j\)的概率. 接着发现,\(x\)从\(0\)变成\(i\)的期望等于\(x\)从\( ...
- Stylus 之 网教通直播间整修
暗色模式 效果 Mozilla 格式源代码 @-moz-document domain("fj.101.com") { * { transition: all .3s; } #wj ...
- 检查*.ldf为何这么大
testdb,只是个测试用文件,备份时突然发现*.ldf怎么这么大,当硬盘不要花银子买啊......--可随意删除...,有空再检查,累了休息... 如批量生成数据.或导入那个来自MySQL的Empl ...