集成:
dependencies { compile 'com.hikvision.ezviz:ezviz-sdk:4.5.1' }添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>配置 build.gradle:
defaultConfig {
...
targetSdkVersion 22//小于23
...
ndk {
abiFilters "armeabi-v7a"//只支持32位
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}注意:
目前提供所有so均为32位,只能在armeabi-v7a引用。
当时碰到一个其他的sdk支持62位的,只能加上ndk { abiFilters "armeabi"},最后跟其他的sdk厂家要了一个32位的so文件,在app—>src->main下创建了一个armeabi-v7a文件夹,如下图:

targetSdkVersion设置为23及以上,在android6.0系统的手机上会出现没有权限崩溃的情况,因为android6.0牵扯到Dangerous Permissions问题,如果需要使用高版本,需要自己处理Dangerous Permissions。
AndroidManifest.xml:
<activity
android:name="com.videogo.main.EzvizWebViewActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|keyboardHidden"
</activity>
<!-- receive 登录时使用,如果用web断登录则不需要,登录流程web端已经写好,只需拿到AccessToken设置一下就好,调用setAccessToken()方法。-->
<receiver
android:name="you_BroadcastReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.videogo.action.OAUTH_SUCCESS_ACTION" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>Application初始化:
/**
* APP_KEY请替换成自己申请的
*/
EZOpenSDK.initLib(this, APP_KEY, "");
1.初始化EZPlayer调用EZOpenSDK的createPlayer,详见api;
2.预览播放成功后可以进行以下操作:录像、拍照、画面翻转、对讲、云台控制、声音开关、视频画面缩放、拖动进度播放,详见api的EZPlayer,其中设备控制该接口的如云台控制和镜头显示功能、对讲,属于限制级接口,要优选通过判断设备的能力集来调用,设备能力集请查看EZDeviceInfo对象的属性值来判断具体方法;
3.关于对讲功能,如果预览播放有声音输出,则在开启对讲前需要关闭预览播放的声音closeSound,关闭对讲后开启预览播放的声音openSound,详见demo;
4.EZOpenSDK中的setVideoLevel设置视频清晰度(videoLevel),此调节可以在视频播放前设置也可以在视频播放成功后设置,视频播放成功后设置了清晰度需要先停止播放stopRealPlay然后重新开启播放startRealPlay才能生效;
5.开始播放之后在消息回调中会收到a、成功消息:EZRealPlayConstants.MSG_REALPLAY_PLAY_SUCCESS,b、失败消息:EZRealPlayConstants.MSG_REALPLAY_PLAY_FAIL,失败回调时查看errorCode,如果为400035(需要输入验证码)和400036(验证码错误),则需要开发者自己处理让用户重新输入验证密码,并调用setPlayVerifyCode设置密码,然后重新启动播放。
播放视频类的代码:
package com.everyoo.smarthome.ui;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.os.Parcelable;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.andbase.library.http.AbHttpUtil;
import com.andbase.library.http.listener.AbStringHttpResponseListener;
import com.andbase.library.http.model.AbRequestParams;
import com.everyoo.smarthome.R;
import com.everyoo.smarthome.ui.scan.main.CaptureActivity;
import com.everyoo.smarthome.util.DataManager;
import com.everyoo.smarthome.util.EZUtils;
import com.everyoo.smarthome.util.HttpConfig;
import com.everyoo.smarthome.util.SharePreferenceUtil;
import com.everyoo.smarthome.util.ToastUtil;
import com.videogo.errorlayer.ErrorInfo;
import com.videogo.exception.BaseException;
import com.videogo.exception.ErrorCode;
import com.videogo.exception.InnerException;
import com.videogo.openapi.EZConstants;
import com.videogo.openapi.EZPlayer;
import com.videogo.openapi.bean.EZCameraInfo;
import com.videogo.openapi.bean.EZDeviceInfo;
import com.videogo.realplay.RealPlayStatus;
import com.videogo.util.ConnectionDetector;
import com.videogo.util.LogUtil;
import com.videogo.util.MediaScanner;
import com.videogo.util.SDCardUtil;
import com.videogo.util.Utils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.Serializable;
import java.util.Calendar;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import static .Activity.RESULT_OK;
import static com.everyoo.smarthome.HomeApplication.getOpenSDK;
import static com.videogo.openapi.EZConstants.EZRealPlayConstants.MSG_SET_VEDIOMODE_FAIL;
import static com.videogo.realplay.RealPlayMsg.MSG_SET_VEDIOMODE_SUCCESS;
/**
* Created by tom on 2017/11/15.
*/
public class HomeTopCameraFragment extends Fragment implements SurfaceHolder.Callback, View.OnClickListener, Handler.Callback {
private static final String TAG = "HomeTopCameraFragment";
public static final int MSG_PLAY_UI_UPDATE = 200;
public static final int CAMERA_LIST = 2020;
private String deviceSerial;
private SurfaceView mRealPlaySv;
private SurfaceHolder mRealPlaySh;
private Button mRealPlayBtn;
private Button mRealPlaySoundBtn;
private Button mRealPlayQualityBtn;
private Button mRealPlayPreviouslyBtn;
private Button mRealPlayTalkBtn;
private Button mRealPlayVideoBtn;
private Button add_device;
private LinearLayout ll_no_camera;
private PopupWindow mQualityPopupWindow = null;
private EZConstants.EZVideoLevel mCurrentQulityMode = EZConstants.EZVideoLevel.VIDEO_LEVEL_HD;
/**
* 标识是否正在播放
*/
private int mStatus = RealPlayStatus.STATUS_INIT;
/**
* 演示点预览控制对象
*/
private EZPlayer mEZPlayer;
private List<EZDeviceInfo> mCameraList;
private EZDeviceInfo mDeviceInfo = null;
private EZCameraInfo mCameraInfo = null;
private Handler mHandler = new Handler(this);
private int mSoundType = 0;
private boolean mIsOnTalk =false;
private boolean mIsRecording = false;
private TextView tv_device_name,device_list,mRealPlayRecordTv;
private ImageView iv_play;
/**
* 定时器
*/
private Timer mUpdateTimer = null;
/**
* 定时器执行的任务
*/
private TimerTask mUpdateTimerTask = null;
private String mRecordTime = null;
/**
* 录像时间
*/
private int mRecordSecond = 0;
private SharePreferenceUtil sharePreferenceUtil;
private String deviceName;
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
//播放成功的回调
case EZConstants.EZRealPlayConstants.MSG_REALPLAY_PLAY_SUCCESS:
startUpdateTimer();
break;
case MSG_SET_VEDIOMODE_SUCCESS:
closeQualityPopupWindow();
setVideoLevel();
if (mStatus == RealPlayStatus.STATUS_START) {
// 停止播放
stopRealPlay();
//下面语句防止stopRealPlay线程还没释放surface, startRealPlay线程已经开始使用surface
//因此需要等待500ms
SystemClock.sleep(500);
// 开始播放
startRealPlay();
}
break;
case EZConstants.EZRealPlayConstants.MSG_SET_VEDIOMODE_FAIL:
closeQualityPopupWindow();
setVideoLevel();
ToastUtil.showToast(getActivity(),"切换视频质量失败");
break;
case MSG_PLAY_UI_UPDATE:
if (mIsRecording) {
updateRecordTime();
}
break;
}
return false;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 保持屏幕常亮
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view;
view = inflater.inflate(R.layout.ez_realplay_page, container, false);
mRealPlaySv = (SurfaceView) view.findViewById(.realplay_sv);
mRealPlaySh = mRealPlaySv.getHolder();
mRealPlaySh.addCallback(this);
mRealPlayBtn = (Button) view.findViewById(.realplay_play_btn);
mRealPlayBtn.setOnClickListener(this);
mRealPlaySoundBtn = (Button) view.findViewById(.realplay_sound_btn);
mRealPlaySoundBtn.setOnClickListener(this);
mRealPlayQualityBtn = (Button) view.findViewById(.realplay_quality_btn);
mRealPlayQualityBtn.setOnClickListener(this);
mRealPlayPreviouslyBtn = (Button) view.findViewById(.realplay_previously_btn);
mRealPlayPreviouslyBtn.setOnClickListener(this);
mRealPlayTalkBtn = (Button) view.findViewById(.realplay_talk_btn);
mRealPlayTalkBtn.setOnClickListener(this);
mRealPlayVideoBtn = (Button) view.findViewById(.realplay_video_btn);
mRealPlayVideoBtn.setOnClickListener(this);
mRealPlayRecordTv = (TextView) view.findViewById(.tv_video_time);
tv_device_name = (TextView) view.findViewById(.tv_device_name);
iv_play = (ImageView) view.findViewById(.iv_play);
ll_no_camera = (LinearLayout) view.findViewById(.ll_no_camera);
add_device = (Button) view.findViewById(.add_device);
add_device.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), CaptureActivity.class);
startActivity(intent);
}
});
device_list = (TextView) view.findViewById(.device_list);
device_list.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), CameraListActivity.class);
startActivityForResult(intent,CAMERA_LIST);
}
});
return view;
}
@Override
public void onStart() {
super.onStart();
initData();
}
@Override
public void onPause() {
super.onPause();
stopRealPlay();
}
private void initData() {
getAccessToken();
}
private void getAccessToken() {
sharePreferenceUtil = new SharePreferenceUtil(getActivity());
AbRequestParams params = new AbRequestParams();
params.put("userid", sharePreferenceUtil.getUserId());
params.put("accesstoken", sharePreferenceUtil.getAccessToken());
AbHttpUtil.getInstance(getActivity()).post(HttpConfig.get_token, params, new AbStringHttpResponseListener() {
@Override
public void onStart() {
}
@Override
public void onFinish() {
}
@Override
public void onFailure(int statusCode, String content, Throwable error) {
}
@Override
public void onSuccess(int statusCode, String content) {
JSONObject object;
try {
object = new JSONObject(content);
if (object.optString("result").equals("2003")) {
JSONObject info = object.optJSONObject("info");
String accessToken = info.optString("accessToken");
String expireTime = info.optString("expireTime");
sharePreferenceUtil = new SharePreferenceUtil(getActivity());
sharePreferenceUtil.putString("CameraAccessToken",accessToken);
sharePreferenceUtil.putString("CameraExpireTime",expireTime);
getOpenSDK().setAccessToken(accessToken);
getDeviceList();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
private void getDeviceList() {
sharePreferenceUtil = new SharePreferenceUtil(getActivity());
AbRequestParams params = new AbRequestParams();
params.put("userid", sharePreferenceUtil.getUserId());
params.put("accesstoken", sharePreferenceUtil.getAccessToken());
AbHttpUtil.getInstance(getActivity()).post(HttpConfig.getCamera_list, params, new AbStringHttpResponseListener() {
@Override
public void onStart() {
}
@Override
public void onFinish() {
}
@Override
public void onFailure(int statusCode, String content, Throwable error) {
}
@Override
public void onSuccess(int statusCode, String content) {
JSONObject object;
try {
object = new JSONObject(content);
if (object.optString("result").equals("2003")) {
JSONArray info = object.optJSONArray("info");
if (info!=null && info.length()>0) {
JSONObject object1 = info.optJSONObject(0);
deviceSerial = object1.optString("deviceSerial");
deviceName = object1.getString("deviceName");
if (deviceSerial != null) {
new GetCamersInfoListTask().execute();
ll_no_camera.setVisibility(View.GONE);
}
}else {
ll_no_camera.setVisibility(View.VISIBLE);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_LIST){
if (resultCode == RESULT_OK){
deviceSerial = data.getStringExtra("deviceSerial");
Log.d(TAG, "onActivityResult: "+deviceSerial);
new GetCamersInfoListTask().execute();
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (mEZPlayer != null) {
mEZPlayer.setSurfaceHold(holder);
}
mRealPlaySh = holder;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mEZPlayer != null) {
mEZPlayer.setSurfaceHold(null);
}
mRealPlaySh = null;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case .realplay_play_btn:
if (mStatus != RealPlayStatus.STATUS_STOP) {
stopRealPlay();
} else {
startRealPlay();
}
break;
case .realplay_previously_btn:
onCapturePicBtnClick();
break;
case .realplay_video_btn:
onRecordBtnClick();
break;
case .realplay_talk_btn:
if(mIsOnTalk){
stopVoiceTalk();
}else {
startVoiceTalk();
}
break;
case .realplay_quality_btn:
openQualityPopupWindow(mRealPlayQualityBtn);
break;
case .realplay_sound_btn:
setRealPlaySound();
break;
default:
break;
}
}
/**
* 开始播放
*
* @see
* @since V2.0
*/
private void startRealPlay() {
// 增加手机客户端操作信息记录
LogUtil.debugLog(TAG, "startRealPlay");
if (mStatus == RealPlayStatus.STATUS_START || mStatus == RealPlayStatus.STATUS_PLAY) {
return;
}
// 检查网络是否可用
if (!ConnectionDetector.isNetworkAvailable(getActivity())) {
// 提示没有连接网络
ToastUtil.showToast(getActivity(), "没有连接网络");
return;
}
mStatus = RealPlayStatus.STATUS_START;
if (mCameraInfo != null) {
if (mEZPlayer == null) {
mEZPlayer = getOpenSDK().createPlayer(mCameraInfo.getDeviceSerial(), mCameraInfo.getCameraNo());
}
if (mEZPlayer == null)
return;
if (mDeviceInfo == null) {
return;
}
if (mDeviceInfo.getIsEncrypt() == 1) {
mEZPlayer.setPlayVerifyCode(DataManager.getInstance().getDeviceSerialVerifyCode(mCameraInfo.getDeviceSerial()));
}
mEZPlayer.setHandler(mHandler);
mEZPlayer.setSurfaceHold(mRealPlaySh);
mEZPlayer.startRealPlay();
mRealPlayBtn.setBackgroundResource(R.mipmap.camera_pause);
iv_play.setVisibility(View.GONE);
}
}
/**
* 停止播放
*
* @see
* @since V1.0
*/
private void stopRealPlay() {
LogUtil.debugLog(TAG, "stopRealPlay");
mStatus = RealPlayStatus.STATUS_STOP;
if (mEZPlayer != null) {
mEZPlayer.stopRealPlay();
mRealPlayBtn.setBackgroundResource(R.mipmap.camera_play);
}
iv_play.setVisibility(View.VISIBLE);
}
/**
* 调节声音
*/
private void setRealPlaySound() {
if (mEZPlayer != null) {
if (mSoundType == 0) {
mEZPlayer.closeSound();
mSoundType = 1;
mRealPlaySoundBtn.setBackgroundResource(R.mipmap.camera_novoice);
} else {
mEZPlayer.openSound();
mSoundType = 0;
mRealPlaySoundBtn.setBackgroundResource(R.mipmap.camera_voice);
}
}
}
/**
* 设备对讲
*
* @see
* @since V2.0
*/
private void startVoiceTalk() {
LogUtil.debugLog(TAG, "startVoiceTalk");
if (mEZPlayer == null) {
LogUtil.debugLog(TAG, "EZPlaer is null");
return;
}
if (mCameraInfo == null) {
return;
}
mIsOnTalk = true;
if (mEZPlayer != null) {
mEZPlayer.closeSound();
}
mEZPlayer.startVoiceTalk();
mRealPlayTalkBtn.setBackgroundResource(R.mipmap.camera_talking);
}
/**
* 停止对讲
*
* @see
* @since V2.0
*/
private void stopVoiceTalk() {
if (mCameraInfo == null || mEZPlayer == null) {
return;
}
LogUtil.debugLog(TAG, "stopVoiceTalk");
mEZPlayer.stopVoiceTalk();
mRealPlayTalkBtn.setBackgroundResource(R.mipmap.camera_talk);
}
/**
* 开始录像
*
* @see
* @since V1.0
*/
private void onRecordBtnClick() {
if (mIsRecording) {
stopRealPlayRecord();
return;
}
if (!SDCardUtil.isSDCardUseable()) {
// 提示SD卡不可用
Utils.showToast(getActivity(), "SD卡不可用");
return;
}
if (SDCardUtil.getSDCardRemainSize() < SDCardUtil.PIC_MIN_MEM_SPACE) {
// 提示内存不足
Utils.showToast(getActivity(), "内存不足");
return;
}
if (mEZPlayer != null) {
//mAudioPlayUtil.playAudioFile(AudioPlayUtil.RECORD_SOUND);
mIsRecording =true;
//时间作为文件命名
java.util.Date date = new java.util.Date();
String strRecordFile = Environment.getExternalStorageDirectory().getPath() + "/EZOpenSDK/Records/" + String.format("%tY", date)
+ String.format("%tm", date) + String.format("%td", date) + "/"
+ String.format("%tH", date) + String.format("%tM", date) + String.format("%tS", date) + String.format("%tL", date) + ".mp4";
mRealPlayVideoBtn.setBackgroundResource(R.mipmap.camera_videoing);
if (mEZPlayer.startLocalRecordWithFile(strRecordFile))
{
ToastUtil.showToast(getActivity(),"录像成功");
} else {
ToastUtil.showToast(getActivity(),"录像失败");
}
}
}
/**
* 停止录像
*
* @see
* @since V1.0
*/
private void stopRealPlayRecord() {
if (mEZPlayer == null || !mIsRecording) {
return;
}
//mAudioPlayUtil.playAudioFile(AudioPlayUtil.RECORD_SOUND);
mEZPlayer.stopLocalRecord();
mRealPlayVideoBtn.setBackgroundResource(R.mipmap.camera_video);
mIsRecording = false;
mRealPlayRecordTv.setVisibility(View.GONE);
}
/**
* 启动定时器
*
* @see
* @since V1.0
*/
private void startUpdateTimer() {
stopUpdateTimer();
// 开始录像计时
mUpdateTimer = new Timer();
mUpdateTimerTask = new TimerTask() {
@Override
public void run() {
// 更新录像时间
if (mEZPlayer != null && mIsRecording) {
// 更新录像时间
Calendar OSDTime = mEZPlayer.getOSDTime();
if (OSDTime != null) {
String playtime = Utils.OSD2Time(OSDTime);
if (!TextUtils.equals(playtime, mRecordTime)) {
mRecordSecond++;
//mRecordTime = playtime;
}
}
}
if (mHandler != null) {
mHandler.sendEmptyMessage(MSG_PLAY_UI_UPDATE);
}
}
};
// 延时1000ms后执行,1000ms执行一次
mUpdateTimer.schedule(mUpdateTimerTask, 0, 1000);
}
/**
* 停止定时器
*
* @see
* @since V1.0
*/
private void stopUpdateTimer() {
mHandler.removeMessages(MSG_PLAY_UI_UPDATE);
// 停止录像计时
if (mUpdateTimer != null) {
mUpdateTimer.cancel();
mUpdateTimer = null;
}
if (mUpdateTimerTask != null) {
mUpdateTimerTask.cancel();
mUpdateTimerTask = null;
}
}
/**
* 更新录像时间
*
* @see
* @since V1.0
*/
private void updateRecordTime() {
if (mIsRecording) {
mRealPlayRecordTv.setVisibility(View.VISIBLE);
} else {
mRealPlayRecordTv.setVisibility(View.GONE);
}
// 计算分秒
int leftSecond = mRecordSecond % 3600;
int minitue = leftSecond / 60;
int second = leftSecond % 60;
// 显示录像时间
String recordTime = String.format("%02d:%02d", minitue, second);
mRealPlayRecordTv.setText(recordTime);
}
/**
* 抓拍按钮响应函数
*
* @since V1.0
*/
private void onCapturePicBtnClick() {
if (!SDCardUtil.isSDCardUseable()) {
// 提示SD卡不可用
Utils.showToast(getActivity(), "SD卡不可用");
return;
}
if (SDCardUtil.getSDCardRemainSize() < SDCardUtil.PIC_MIN_MEM_SPACE) {
// 提示内存不足
Utils.showToast(getActivity(), "内存不足");
return;
}
if (mEZPlayer != null) {
Thread thr = new Thread() {
@Override
public void run() {
Bitmap bmp = mEZPlayer.capturePicture();
if (bmp != null) {
try {
// 用时间命名
java.util.Date date = new java.util.Date();
final String path = Environment.getExternalStorageDirectory().getPath() + "/EZOpenSDK/CapturePicture/" + String.format("%tY", date)
+ String.format("%tm", date) + String.format("%td", date) + "/"
+ String.format("%tH", date) + String.format("%tM", date) + String.format("%tS", date) + String.format("%tL", date) +".jpg";
if (TextUtils.isEmpty(path)) {
bmp.recycle();
bmp = null;
return;
}
EZUtils.saveCapturePictrue(path, bmp);
MediaScanner mMediaScanner = new MediaScanner(getActivity());
mMediaScanner.scanFile(path, "jpg");
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
ToastUtil.showToast(getActivity(),"保存到相册");
}
});
} catch (InnerException e) {
e.printStackTrace();
} finally {
if (bmp != null) {
bmp.recycle();
bmp = null;
return;
}
}
}
super.run();
}
};
thr.start();
}
}
/**
* 视频质量,2-高清,1-标清,0-流畅
* @param anchor
*/
private void openQualityPopupWindow(View anchor) {
if (mEZPlayer == null) {
return;
}
closeQualityPopupWindow();
LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewGroup layoutView = (ViewGroup) layoutInflater.inflate(R.layout.realplay_quality_items, null, true);
Button qualityHdBtn = (Button) layoutView.findViewById(.quality_hd_btn);
qualityHdBtn.setOnClickListener(mOnPopWndClickListener);
Button qualityBalancedBtn = (Button) layoutView.findViewById(.quality_balanced_btn);
qualityBalancedBtn.setOnClickListener(mOnPopWndClickListener);
Button qualityFlunetBtn = (Button) layoutView.findViewById(.quality_flunet_btn);
qualityFlunetBtn.setOnClickListener(mOnPopWndClickListener);
// 视频质量,2-高清,1-标清,0-流畅
if (mCameraInfo.getVideoLevel() == EZConstants.EZVideoLevel.VIDEO_LEVEL_FLUNET) {
qualityFlunetBtn.setEnabled(false);
} else if (mCameraInfo.getVideoLevel() == EZConstants.EZVideoLevel.VIDEO_LEVEL_BALANCED) {
qualityBalancedBtn.setEnabled(false);
} else if (mCameraInfo.getVideoLevel() == EZConstants.EZVideoLevel.VIDEO_LEVEL_HD) {
qualityHdBtn.setEnabled(false);
}
int height = 105;
qualityFlunetBtn.setVisibility(View.VISIBLE);
qualityBalancedBtn.setVisibility(View.VISIBLE);
qualityHdBtn.setVisibility(View.VISIBLE);
height = Utils.dip2px(getActivity(), height);
mQualityPopupWindow = new PopupWindow(layoutView, RelativeLayout.LayoutParams.WRAP_CONTENT, height, true);
mQualityPopupWindow.setBackgroundDrawable(new BitmapDrawable());
mQualityPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
LogUtil.infoLog(TAG, "KEYCODE_BACK DOWN");
mQualityPopupWindow = null;
closeQualityPopupWindow();
}
});
try {
mQualityPopupWindow.showAsDropDown(anchor, - Utils.dip2px(getActivity(), 5),
-(height + anchor.getHeight() + Utils.dip2px(getActivity(), 8)));
} catch (Exception e) {
e.printStackTrace();
closeQualityPopupWindow();
}
}
private void closeQualityPopupWindow() {
if (mQualityPopupWindow != null) {
dismissPopWindow(mQualityPopupWindow);
mQualityPopupWindow = null;
}
}
private void dismissPopWindow(PopupWindow popupWindow) {
if (popupWindow != null && !getActivity().isFinishing()) {
try {
popupWindow.dismiss();
} catch (Exception e) {
// TODO: handle exception
}
}
}
private View.OnClickListener mOnPopWndClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case .quality_hd_btn:
setQualityMode(EZConstants.EZVideoLevel.VIDEO_LEVEL_HD);
break;
case .quality_balanced_btn:
setQualityMode(EZConstants.EZVideoLevel.VIDEO_LEVEL_BALANCED);
break;
case .quality_flunet_btn:
setQualityMode(EZConstants.EZVideoLevel.VIDEO_LEVEL_FLUNET);
break;
default:
break;
}
}
};
/**
* 码流配置 清晰度 2-高清,1-标清,0-流畅
*
* @see
* @since V2.0
*/
private void setQualityMode(final EZConstants.EZVideoLevel mode) {
// 检查网络是否可用
if (!ConnectionDetector.isNetworkAvailable(getActivity())) {
// 提示没有连接网络
Utils.showToast(getActivity(), "没有连接网络");
return;
}
if (mEZPlayer != null) {
Thread thr = new Thread(new Runnable() {
@Override
public void run() {
try {
Log.d("ssssssss", "run:"+mCameraInfo.getDeviceSerial()+"......"+mCameraInfo.getCameraNo());
String deviceSerial = mCameraInfo.getDeviceSerial();
int cameraNo = mCameraInfo.getCameraNo();
getOpenSDK().setVideoLevel(deviceSerial, cameraNo, mode.getVideoLevel());
mCurrentQulityMode = mode;
Message msg = Message.obtain();
msg.what = MSG_SET_VEDIOMODE_SUCCESS;
mHandler.sendMessage(msg);
LogUtil.i(TAG, "setQualityMode success");
} catch (BaseException e) {
mCurrentQulityMode = EZConstants.EZVideoLevel.VIDEO_LEVEL_FLUNET;
e.printStackTrace();
Message msg = Message.obtain();
msg.what = MSG_SET_VEDIOMODE_FAIL;
mHandler.sendMessage(msg);
LogUtil.i(TAG, "setQualityMode fail");
}
}
}) {
};
thr.start();
}
}
private void setVideoLevel() {
if (mCameraInfo == null || mEZPlayer == null || mDeviceInfo == null) {
return;
}
if (mDeviceInfo.getStatus() == 1) {
mRealPlayQualityBtn.setEnabled(true);
} else {
mRealPlayQualityBtn.setEnabled(false);
}
/************** 本地数据保存 需要更新之前获取到的设备列表信息,开发者自己设置 *********************/
mCameraInfo.setVideoLevel(mCurrentQulityMode.getVideoLevel());
// 视频质量,2-高清,1-标清,0-流畅
if (mCurrentQulityMode.getVideoLevel() == EZConstants.EZVideoLevel.VIDEO_LEVEL_FLUNET.getVideoLevel()) {
mRealPlayQualityBtn.setText(R.string.quality_flunet);
} else if (mCurrentQulityMode.getVideoLevel() == EZConstants.EZVideoLevel.VIDEO_LEVEL_BALANCED.getVideoLevel()) {
mRealPlayQualityBtn.setText(R.string.quality_balanced);
} else if (mCurrentQulityMode.getVideoLevel() == EZConstants.EZVideoLevel.VIDEO_LEVEL_HD.getVideoLevel()) {
mRealPlayQualityBtn.setText(R.string.quality_hd);
}
}
/**
* 获取事件消息任务
*/
private class GetCamersInfoListTask extends AsyncTask<Void, Void, EZDeviceInfo> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected EZDeviceInfo doInBackground(Void... params) {
if (getActivity().isFinishing()) {
return null;
}
if (!ConnectionDetector.isNetworkAvailable(getActivity())) {
return null;
}
try {
EZDeviceInfo result = null;
result = getOpenSDK().getDeviceInfo(deviceSerial);
return result;
} catch (BaseException e) {
ErrorInfo errorInfo = (ErrorInfo) e.getObject();
LogUtil.debugLog(TAG, errorInfo.toString());
return null;
}
}
@Override
protected void onPostExecute(EZDeviceInfo result) {
super.onPostExecute(result);
if (getActivity().isFinishing()) {
return;
}
if (result != null) {
ll_no_camera.setVisibility(View.GONE);
mDeviceInfo = result;
mCameraInfo = EZUtils.getCameraInfoFromDevice(mDeviceInfo, 0);
if (tv_device_name!=null && deviceName !=null){
tv_device_name.setText(deviceName);
}
startRealPlay();
}else {
ll_no_camera.setVisibility(View.VISIBLE);
}
}
}
}
















