集成:
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 android.app.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(R.id.realplay_sv);
mRealPlaySh = mRealPlaySv.getHolder();
mRealPlaySh.addCallback(this);
mRealPlayBtn = (Button) view.findViewById(R.id.realplay_play_btn);
mRealPlayBtn.setOnClickListener(this);
mRealPlaySoundBtn = (Button) view.findViewById(R.id.realplay_sound_btn);
mRealPlaySoundBtn.setOnClickListener(this);
mRealPlayQualityBtn = (Button) view.findViewById(R.id.realplay_quality_btn);
mRealPlayQualityBtn.setOnClickListener(this);
mRealPlayPreviouslyBtn = (Button) view.findViewById(R.id.realplay_previously_btn);
mRealPlayPreviouslyBtn.setOnClickListener(this);
mRealPlayTalkBtn = (Button) view.findViewById(R.id.realplay_talk_btn);
mRealPlayTalkBtn.setOnClickListener(this);
mRealPlayVideoBtn = (Button) view.findViewById(R.id.realplay_video_btn);
mRealPlayVideoBtn.setOnClickListener(this);
mRealPlayRecordTv = (TextView) view.findViewById(R.id.tv_video_time);
tv_device_name = (TextView) view.findViewById(R.id.tv_device_name);
iv_play = (ImageView) view.findViewById(R.id.iv_play);
ll_no_camera = (LinearLayout) view.findViewById(R.id.ll_no_camera);
add_device = (Button) view.findViewById(R.id.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(R.id.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 R.id.realplay_play_btn:
if (mStatus != RealPlayStatus.STATUS_STOP) {
stopRealPlay();
} else {
startRealPlay();
}
break;
case R.id.realplay_previously_btn:
onCapturePicBtnClick();
break;
case R.id.realplay_video_btn:
onRecordBtnClick();
break;
case R.id.realplay_talk_btn:
if(mIsOnTalk){
stopVoiceTalk();
}else {
startVoiceTalk();
}
break;
case R.id.realplay_quality_btn:
openQualityPopupWindow(mRealPlayQualityBtn);
break;
case R.id.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(R.id.quality_hd_btn);
qualityHdBtn.setOnClickListener(mOnPopWndClickListener);
Button qualityBalancedBtn = (Button) layoutView.findViewById(R.id.quality_balanced_btn);
qualityBalancedBtn.setOnClickListener(mOnPopWndClickListener);
Button qualityFlunetBtn = (Button) layoutView.findViewById(R.id.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 R.id.quality_hd_btn:
setQualityMode(EZConstants.EZVideoLevel.VIDEO_LEVEL_HD);
break;
case R.id.quality_balanced_btn:
setQualityMode(EZConstants.EZVideoLevel.VIDEO_LEVEL_BALANCED);
break;
case R.id.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);
}
}
}
}
