|
@@ -0,0 +1,306 @@
|
|
|
+package com.sikey.skvideo.manager;
|
|
|
+
|
|
|
+import android.content.Context;
|
|
|
+import android.os.Handler;
|
|
|
+import android.util.Log;
|
|
|
+import android.view.SurfaceView;
|
|
|
+import android.view.View;
|
|
|
+
|
|
|
+import com.juphoon.cloud.JCCall;
|
|
|
+import com.juphoon.cloud.JCCallCallback;
|
|
|
+import com.juphoon.cloud.JCCallItem;
|
|
|
+import com.juphoon.cloud.JCClient;
|
|
|
+import com.juphoon.cloud.JCClientCallback;
|
|
|
+import com.juphoon.cloud.JCMediaDevice;
|
|
|
+import com.juphoon.cloud.JCMediaDeviceCallback;
|
|
|
+import com.juphoon.cloud.JCMediaDeviceVideoCanvas;
|
|
|
+import com.juphoon.cloud.LoginParam;
|
|
|
+import com.juphoon.cloud.MediaConfig;
|
|
|
+import com.sikey.skvideo.R;
|
|
|
+import com.sikey.skvideo.utils.Constant;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+public class JuphoonManager extends VideoManager implements JCClientCallback, JCCallCallback, JCMediaDeviceCallback {
|
|
|
+ private JCClient mClient = null;
|
|
|
+ public JCCall mCall = null;
|
|
|
+ public JCMediaDevice mMediaDevice = null;
|
|
|
+ private JCMediaDeviceVideoCanvas mLocalCanvas = null;
|
|
|
+ private JCMediaDeviceVideoCanvas mRemoteCanvas = null;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void onInit(Context context) {
|
|
|
+ super.onInit(context);
|
|
|
+ boolean isOK = initJuphoon(context);
|
|
|
+ if (isOK) {
|
|
|
+ acitonLogin(mTicket);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 初始化函数
|
|
|
+ private boolean initJuphoon(Context context) {
|
|
|
+ Log.d(TAG, "initJuphoon: ");
|
|
|
+ mClient = JCClient.create(context, Constant.APP_KEY_JUPHOON, this, null);
|
|
|
+ mMediaDevice = JCMediaDevice.create(mClient,this);
|
|
|
+ mCall = JCCall.create(mClient, mMediaDevice, this);
|
|
|
+ mCall.updateMediaConfig(MediaConfig.generateByMode(MediaConfig.MODE_INTELLIGENT_HARDWARE_SMALL));
|
|
|
+ // 获取初始化状态(用来判断初始化状态)
|
|
|
+ boolean isOK = mClient.getState() == JCClient.STATE_IDLE;
|
|
|
+ Log.d(TAG, "initJuphoon: " + isOK);
|
|
|
+ return isOK;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void acitonLogin(String ticket) {
|
|
|
+ Log.d(TAG, "acitonLogin: " + ticket);
|
|
|
+ LoginParam loginParam = new LoginParam();
|
|
|
+ // 发起登录
|
|
|
+ mClient.login(ticket, "123456", loginParam);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onLogin(boolean result, int reason) {
|
|
|
+ Log.d(TAG, "acitonLogin callback: " + result + " reason:" + reason);
|
|
|
+ if (result) {// 登录成功
|
|
|
+ if (mVideoListener != null) {
|
|
|
+ mVideoListener.onLoginCallback(true);
|
|
|
+ }
|
|
|
+ } else if (reason == JCClient.REASON_AUTH) {// 账号密码错误
|
|
|
+ if (mVideoListener != null) {
|
|
|
+ mVideoListener.onLoginCallback(false);
|
|
|
+ }
|
|
|
+ } else if (reason != JCClient.REASON_NONE && reason != JCClient.REASON_STATE_CANNOT_LOGIN) {
|
|
|
+ //重新登录
|
|
|
+ new Handler().postDelayed(new Runnable() {
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ acitonLogin(mTicket);
|
|
|
+ }
|
|
|
+ }, 2000);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void onCall(String callId) {
|
|
|
+ super.onCall(callId);
|
|
|
+ boolean isOK = mCall.call(callId, true , new JCCall.CallParam("extraParam", "ticket"));
|
|
|
+ Log.d(TAG, "onCall: " + callId + " isOK: " + isOK);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void onAnswer() {
|
|
|
+ super.onAnswer();
|
|
|
+ JCCallItem item = getActiveCall();
|
|
|
+ if (mCall != null && item != null) {
|
|
|
+ boolean isOK = mCall.answer(item, true);
|
|
|
+ Log.d(TAG, "onAnswer: " + isOK);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void onHangup() {
|
|
|
+ super.onHangup();
|
|
|
+ JCCallItem item = getActiveCall();
|
|
|
+ if (mCall != null && item != null) {
|
|
|
+ boolean isOK = mCall.term(item, JCCall.REASON_NONE, "");
|
|
|
+ Log.d(TAG, "onHangup: " + isOK);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onClientStateChange(int state, int oldState) {
|
|
|
+ Log.d(TAG, "onClientStateChange: " + state);
|
|
|
+ if (state == JCClient.STATE_IDLE) { // 未登录
|
|
|
+ //loginJuphoon(this.mTicket);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onCallItemAdd(JCCallItem item) {
|
|
|
+ Log.d(TAG, "onCallItemAdd:" + item.getUserId());
|
|
|
+ if (mCall.getCallItems().size() > 0) {
|
|
|
+ if (mVideoListener != null) {
|
|
|
+ mVideoListener.onEnterRoom();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onCallItemRemove(JCCallItem item, int reason, String description) {
|
|
|
+ Log.d(TAG, "onCallItemRemove" + reason);
|
|
|
+ // 销毁本地视频画面
|
|
|
+ item.stopSelfVideo();
|
|
|
+ // 销毁远端视频画面
|
|
|
+ item.stopOtherVideo();
|
|
|
+ if (mVideoListener != null) {
|
|
|
+ mVideoListener.onRemoteExitRoom();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onCallItemUpdate(JCCallItem item, JCCallItem.ChangeParam changeParam) {
|
|
|
+ Log.d(TAG, "onCallItemUpdate");
|
|
|
+ List<JCCallItem> callItems = mCall.getCallItems();
|
|
|
+ if (callItems.size() <= 0)
|
|
|
+ return;
|
|
|
+ JCCallItem activeCall = getActiveCall();
|
|
|
+ if (activeCall == null)
|
|
|
+ return;
|
|
|
+
|
|
|
+ int state = activeCall.getState();
|
|
|
+ Log.d(TAG, "onCallItemUpdate: " + state);
|
|
|
+ if (state == JCCall.STATE_INIT || state == JCCall.STATE_PENDING) {
|
|
|
+ SurfaceView view = updatePending(activeCall);
|
|
|
+ if (mVideoListener != null) {
|
|
|
+ mVideoListener.onPending(view);
|
|
|
+ }
|
|
|
+ } else if (state == JCCall.STATE_CONNECTING) {
|
|
|
+ if (mVideoListener != null) {
|
|
|
+ mVideoListener.onConnecting();
|
|
|
+ }
|
|
|
+ } else if (state == JCCall.STATE_TALKING) {
|
|
|
+ SurfaceView view = updateTalking(activeCall);
|
|
|
+ if (mVideoListener != null) {
|
|
|
+ mVideoListener.onTalking(view);
|
|
|
+ }
|
|
|
+ mLocalCanvas = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private SurfaceView updatePending(JCCallItem item) {
|
|
|
+ Log.d(TAG, "updatePending: ");
|
|
|
+ if (mLocalCanvas == null && item.getUploadVideoStreamSelf()) {
|
|
|
+ mLocalCanvas = mMediaDevice.startCameraVideo(JCMediaDevice.RENDER_FULL_SCREEN);
|
|
|
+ if (mLocalCanvas == null)
|
|
|
+ return null;
|
|
|
+ mLocalCanvas.getVideoView().setZOrderMediaOverlay(true);
|
|
|
+ mLocalCanvas.getVideoView().setId(View.generateViewId());
|
|
|
+ return mLocalCanvas.getVideoView();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private SurfaceView updateTalking(JCCallItem item) {
|
|
|
+ Log.d(TAG, "updateTalking: ");
|
|
|
+ if (mRemoteCanvas == null && item.getUploadVideoStreamOther()) {
|
|
|
+ mMediaDevice.enableSpeaker(true);
|
|
|
+ mRemoteCanvas = mMediaDevice.startVideo(item.getRenderId(), JCMediaDevice.RENDER_FULL_CONTENT);
|
|
|
+ if (mRemoteCanvas == null)
|
|
|
+ return null;
|
|
|
+ mRemoteCanvas.getVideoView().setId(View.generateViewId());
|
|
|
+ return mRemoteCanvas.getVideoView();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onLogout(int reason) {
|
|
|
+ Log.d(TAG, "onLogout: " + reason);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void onClear() {
|
|
|
+ super.onClear();
|
|
|
+ removeCanvas();
|
|
|
+ JCMediaDevice.destroy();
|
|
|
+ JCCall.destroy();
|
|
|
+ JCClient.destroy();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void removeCanvas() {
|
|
|
+ Log.d(TAG, "removeCanvas: ");
|
|
|
+ if (mLocalCanvas != null) {
|
|
|
+ mMediaDevice.stopVideo(mLocalCanvas);
|
|
|
+ mLocalCanvas = null;
|
|
|
+ }
|
|
|
+ if (mRemoteCanvas != null) {
|
|
|
+ mMediaDevice.stopVideo(mRemoteCanvas);
|
|
|
+ mRemoteCanvas = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public JCCallItem getActiveCall() {
|
|
|
+ if (mCall == null)
|
|
|
+ return null;
|
|
|
+ for (JCCallItem item: mCall.getCallItems()) {
|
|
|
+ if (item.getActive())
|
|
|
+ return item;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onOnlineMessageSendResult(int operationId, boolean result) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onOnlineMessageReceive(String userId, String content) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onMessageReceive(String type, String content, JCCallItem item) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onMissedCallItem(JCCallItem item) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onDtmfReceived(JCCallItem item, int value) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onEarlyMediaReceived(JCCallItem item) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onSipRingInfoReceived(JCCallItem item, String callSipType) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onCameraUpdate() {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onAudioOutputTypeChange(int audioRouteType) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onRenderReceived(JCMediaDeviceVideoCanvas canvas) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onRenderStart(JCMediaDeviceVideoCanvas canvas) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onVideoError(JCMediaDeviceVideoCanvas canvas) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onAudioError(boolean background) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onAudioResume() {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onNeedKeyFrame() {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|