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实现高效便捷还容易懂的排序算法
PS:我现在越来越认为排序大法是,很深的算法了,就是简单的几个步骤,网上的大佬们能给你玩出花来(ง •_•)ง public class zimuzhenlie2 { public static vo ...
- Java实现LeetCode_0028_ImplementStrStr
package javaLeetCode.primary; import java.util.Scanner; public class ImplementStrStr_28 { public sta ...
- Java实现第九届蓝桥杯第几天
第几天 题目描述 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容. import java.util.Cal ...
- set基本运用
/* set集合基本用法 */ #include<iostream> #include<set> using namespace std; //set<T>a; v ...
- 09 . Nginx配置LNMP和LNMT架构
安装LNMP架构 环境清单 list CentOS7.3 proxysql-2.0.12-1-centos7.x86_64.rpm mysql-5.7.23-1.el7.x86_64.rpm-bund ...
- Volley框架学习资料汇总
Android Volley完全解析(一),初识Volley的基本用法(http://blog.csdn.net/guolin_blog/article/details/17482095/)
- 【Spring注解驱动开发】使用@Lazy注解实现懒加载
写在前面 Spring在启动时,默认会将单实例bean进行实例化,并加载到Spring容器中.也就是说,单实例bean默认在Spring容器启动的时候创建对象,并将对象加载到Spring容器中.如果我 ...
- eurekaAutoServiceRegistration 异常
方案来自:https://github.com/spring-cloud/spring-cloud-netflix/issues/1952 解决办法: @Component public class ...
- [CF163E]e-Government
题目 点这里看题目. 分析 首先,我们不需要真的从 AC 自动机中把串删掉.由于我们计算贡献和,我们只需要在 AC 自动机上,把已经删除的串的贡献抹掉就可以了. 接着考虑询问.这是一个很基 ...
- 分析ThreadLocal的弱引用与内存泄漏问题
目录 一.介绍 二.问题提出 2.1内存原理图 2.2几个问题 三.回答问题 3.1为什么会出现内存泄漏 3.2若Entry使用弱引用 3.3弱引用配合自动回收 四.总结 一.介绍 之前使用Threa ...