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实现 蓝桥杯VIP 算法训练 P1101
有一份提货单,其数据项目有:商品名(MC).单价(DJ).数量(SL).定义一个结构体prut,其成员是上面的三项数据.在主函数中定义一个prut类型的结构体数组,输入每个元素的值,计算并输出提货单的 ...
- Java实现 蓝桥杯VIP 算法训练 确定元音字母位置
算法训练 确定元音字母位置 时间限制:1.0s 内存限制:512.0MB 输入一个字符串,编写程序输出该字符串中元音字母的首次出现位置,如果没有元音字母输出0.英语元音字母只有'a'.'e'.'i'. ...
- Java实现 蓝桥杯VIP 算法训练 数对
算法训练 数对 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,该程序从用户读入一个整数,然后列出所有的数对,每个数对的乘积即为该数. 输入格式:输入只有一行,即一个整数. 输出 ...
- Java实现第八届蓝桥杯图形排版
标题:图形排版 小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi. 假设纸张的宽度是 M,小明使用的文档编辑工具会用以下方式对图片进行自动排版: 1. 该工具会按照 ...
- Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数
算法提高 3-2字符串输入输出函数 时间限制:1.0s 内存限制:512.0MB 描述 编写函数GetReal和GetString,在main函数中分别调用这两个函数.在读入一个实数和一个字符串后,将 ...
- SQL Server账号密码(sa)登录失败 错误原因:233
(其实以前经常用的时候,都很简单,最近一段时间不用了,再一看发现都忘记的差不多了,还是写一篇博客吧,防止下一次再在这种问题上面浪费时间) 右键此电脑,点击管理 如果没有此电脑打开文件夹 在这里右键也是 ...
- Java实现荷兰国旗问题
问题描述 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后 ...
- java实现最大连续和问题
/* 10 5 -3 12 -31 15 22 -7 6 -8 -9 10 .... 暴力:O(n^3) 分治:[ mid ) 三种情况求最大 基线法: O(n) 2个数组: 从左到本位:出现的最大累 ...
- springMVC 异常
springMVC 异常 0.依赖(不只是本次案例所需) <?xml version="1.0" encoding="UTF-8"?> <p ...
- 面试官突然问我MySQL存储过程,我竟然连基础都不会!(详细)
所有知识体系文章,GitHub已收录,欢迎Star!再次感谢,愿你早日进入大厂! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual ...