说一下萤石原生播放

先上代码

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 伤敌一千自损八百之萤石摄像头集成(三)的更多相关文章

  1. Android 伤敌一千自损八百之萤石摄像头集成(二)

    本章主要是结合webview展示直播 app负责配网展示设备 加载webview播放 不介绍别的只说集成,至于APP_KEY.accessToken怎么获取的不予解释,官网都有 获取WiFi名称 这里 ...

  2. Android 伤敌一千自损八百之萤石摄像头集成(一)

    最近忙着修改萤石摄像头C3型号开头的设备添加 本来不是很复杂的事情. , 现在我感觉我入魔了 总感觉这是个小人 螺丝口是眼睛 插入SD卡的事鼻子嘴 接信号的事手 怎么看怎么像愤怒的小人 总结,先看一下 ...

  3. 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成

    阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...

  4. Spring Boot(十八):使用Spring Boot集成FastDFS

    Spring Boot(十八):使用Spring Boot集成FastDFS 环境:Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0 功能:使用Spring Boot将文 ...

  5. Android开发教程 - 使用Data Binding(八)使用自定义Interface

    本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...

  6. 【Android开发学习笔记】【第八课】五大布局-下

    概念 五大布局上一篇文章已经介绍了 LinearLayout RelativeLayout 这一篇我们介绍剩下的三种布局 FrameLayout 五种布局中最佳单的一种布局.在这个布局在整个界面被当成 ...

  7. 从头学起android&lt;GridView网格视图.二十八.&gt;

    GridView基于组件的网络格所有的形式的组分的,例如:当制作专辑,所有的图片将在相同的尺寸在不同的显示格在孩子,是否能够依靠这个组件完成.此组件的继承结构参见例如下面: java.lang.Obj ...

  8. Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》

    之前本专栏文章中的小案例有写到:第三十九话<Chronometer实现倒计时> 以及使用异步实现倒计时:第三十三话< AsyncTask异步倒计时> 本篇文章 结合Timer. ...

  9. Fragment详解-android学习之旅(四十八)

    Fragment的设计哲学 Fragment的继承体系 Fragment的开发 大部分都会继承如下的三个方法 Fragment与Activity的通信 Fragment与Activity交互信息 Fr ...

随机推荐

  1. java实现第四届蓝桥杯猜灯谜

    猜灯谜 题目描述 A 村的元宵节灯会上有一迷题: 请猜谜 * 请猜谜 = 请边赏灯边猜 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的数字. 请你用计算机按小明的思路算一下,然后提交&quo ...

  2. 【CSS】电脑、移动端公用样式

    电脑端: /* Public */ @charset "utf-8"; html, body, div, p, ul, ol, li, dl, dt, dd, h1, h2, h3 ...

  3. java类的加载顺序和实例化顺序(Demo程序)

    一.main函数中实例化对象 父类 package com.learn; public class Father { //静态变量 public static int num_1 = 1; //静态代 ...

  4. nginx下如何l在网站目录的二级目录下url重写的方法

    以我新项目为例子,该项目要求用laravel来做,因此我把整个项目丢到一个叫laravel的文件夹里面了,目录就变成c:/nginx/html/laravel了,然后发现只能通过localhost/l ...

  5. [转] 浅谈C++中的那些内存泄露

    点击阅读原文 尽管学过C语言.可是C++里面的一些基础还是不太懂,还须要再掌握. 对于内存泄露,我的个人理解就是程序在执行过程中,自己开辟了空间,用完这块空间后却没有释放. 今晚上我就犯了这种低级错误 ...

  6. (二)log4j 配置详解

    原文链接:https://blog.csdn.net/liupeifeng3514/article/details/79625013 1.配置根logger log4j.rootLogger = de ...

  7. ZWave对COMAND CLASS的处理流程

    文章主题  在开发一个 ZWave Device 的过程中,对 COMAND CLASS(单词太长了,后面就简写为 CC 啦) 的处理是最基本.最重要的工作.这篇文章以最最简单的 CC:COMMNAD ...

  8. IntelliJ IDEA中项目import与open的区别

    场景: 从原来公司离职来到新的公司,接手公司项目,先将项目从git或svn项目版本管理上clone下来,如果项目原先是用Eclipse开发的,而你更习惯于使用IntelliJ IDEA,下面是针对使用 ...

  9. VS2017未安装MFC解决方法

    VS2017未安装MFC解决方法 https://blog.csdn.net/u010921682/article/details/89847395

  10. rest_framework django 简单使用(数据库创建数据, 覆盖数据, 其他的大同小异)

    事先说几个坑:数据库定义字段时候,不要定义name 要定义 username 首先, 定义model(简单定义) from django.db import models from django.co ...