Browse Source

添加语音呼入 语音呼出功能

wangjk 4 years ago
parent
commit
39325e8e32

+ 383 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/RTCVoipAudioActivity.java

@@ -0,0 +1,383 @@
+package com.wdkl.ncs.android.component.nursehome.activity;
+
+import android.content.DialogInterface;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.support.v7.app.AlertDialog;
+import android.util.Log;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.Chronometer;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.google.gson.Gson;
+import com.starrtc.demo.database.CoreDB;
+import com.starrtc.demo.database.HistoryBean;
+import com.starrtc.demo.demo.BaseActivity;
+import com.starrtc.demo.demo.MLOC;
+import com.starrtc.demo.ui.CircularCoverView;
+import com.starrtc.demo.utils.AEvent;
+import com.starrtc.demo.utils.ColorUtils;
+import com.starrtc.demo.utils.DensityUtils;
+import com.starrtc.starrtcsdk.api.XHClient;
+import com.starrtc.starrtcsdk.api.XHConstants;
+import com.starrtc.starrtcsdk.api.XHVoipManager;
+import com.starrtc.starrtcsdk.apiInterface.IXHResultCallback;
+import com.starrtc.starrtcsdk.core.audio.StarRTCAudioManager;
+import com.starrtc.starrtcsdk.core.pusher.XHCameraRecorder;
+import com.wdkl.ncs.android.component.nursehome.R;
+import com.wdkl.ncs.android.component.nursehome.common.Constants;
+import com.wdkl.ncs.android.component.nursehome.fragment.FramePartFragment;
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO;
+import com.wdkl.ncs.android.middleware.tcp.TcpClient;
+import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel;
+import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil;
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
+
+import java.text.SimpleDateFormat;
+import java.util.Set;
+
+public class RTCVoipAudioActivity extends BaseActivity implements View.OnClickListener {
+    private String TAG = RTCVoipAudioActivity.class.getSimpleName();
+
+    private XHVoipManager voipManager;
+    private Chronometer timer;
+
+    private TextView bao_mother_name_tv, bao_mother_age_tv;
+
+    public static String ACTION = "ACTION";
+    public static String RING = "RING";
+    public static String CALLING = "CALLING";
+    private String action;
+    private String targetId;
+    private TextView voice_time_tv;
+
+    private StarRTCAudioManager starRTCAudioManager;
+
+    public InteractionVO interactionVO = new InteractionVO();
+    public TcpModel tcpModel = new TcpModel();
+
+    public static RTCVoipAudioActivity rtcVoipAudioActivity;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
+                WindowManager.LayoutParams.FLAG_FULLSCREEN);
+        setContentView(R.layout.window_make_a_voice_call);
+        setFinishOnTouchOutside(false);
+        rtcVoipAudioActivity = this;
+        //todo 设置为通话状态 有其他用户输入时 DeviceChannel设置返回通话中
+        DeviceChannel.calling = true;
+
+        starRTCAudioManager = StarRTCAudioManager.create(this.getApplicationContext());
+        starRTCAudioManager.start(new StarRTCAudioManager.AudioManagerEvents() {
+            @Override
+            public void onAudioDeviceChanged(StarRTCAudioManager.AudioDevice selectedAudioDevice, Set availableAudioDevices) {
+                MLOC.d("onAudioDeviceChanged ", selectedAudioDevice.name());
+            }
+        });
+
+        voipManager = XHClient.getInstance().getVoipManager();
+        voipManager.setRtcMediaType(XHConstants.XHRtcMediaTypeEnum.STAR_RTC_MEDIA_TYPE_AUDIO_ONLY);
+        voipManager.setRecorder(new XHCameraRecorder());
+        addListener();
+
+        targetId = getIntent().getStringExtra("targetId");
+        Log.e("RTCVoipAudioActivity", "SIP账号" + targetId);
+        tcpModel = (TcpModel) getIntent().getSerializableExtra("TcpModel");
+//        interactionVO = (InteractionVO) getIntent().getSerializableExtra("interactionVO");
+        action = getIntent().getStringExtra(ACTION);
+        timer = (Chronometer) findViewById(R.id.voice_time_tv);
+
+        bao_mother_name_tv = (TextView) findViewById(R.id.bao_mother_name_tv);
+        bao_mother_age_tv = findViewById(R.id.bao_mother_age_tv);
+        bao_mother_age_tv.setVisibility(View.GONE);
+
+//        ((TextView)findViewById(com.starrtc.demo.R.id.targetid_text)).setText(targetId);
+//        ((ImageView)findViewById(com.starrtc.demo.R.id.head_img)).setImageResource(MLOC.getHeadImage(RTCVoipAudioActivity.this,targetId));
+//        findViewById(com.starrtc.demo.R.id.head_bg).setBackgroundColor(ColorUtils.getColor(RTCVoipAudioActivity.this,targetId));
+//        ((CircularCoverView)findViewById(com.starrtc.demo.R.id.head_cover)).setCoverColor(Color.parseColor("#000000"));
+//        int cint = DensityUtils.dip2px(RTCVoipAudioActivity.this,45);
+//        ((CircularCoverView)findViewById(com.starrtc.demo.R.id.head_cover)).setRadians(cint, cint, cint, cint,0);
+
+        findViewById(R.id.voice_hang_up_imagev).setOnClickListener(this);
+//        voice_time_tv =  findViewById(R.id.voice_time_tv);
+//        voice_time_tv.setVisibility(View.GONE);
+
+        if (tcpModel.getType() == TcpType.VOICE) {
+            if(tcpModel.getAction() == TcpAction.VoiceAction.CALL) {
+                InteractionVO interactionVO =  new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+                bao_mother_name_tv.setText(interactionVO.getFromMemberName());
+            }else if(tcpModel.getAction() == TcpAction.VoiceAction.SUCCESS){
+                InteractionVO interactionVO = (InteractionVO) tcpModel.getData();
+                bao_mother_name_tv.setText(interactionVO.getToMemberName());
+            }
+        }
+
+
+        if (action.equals(CALLING)) {
+            showCallingView();
+            MLOC.d("newVoip", "call");
+            voipManager.audioCall(this, targetId, new IXHResultCallback() {
+                @Override
+                public void success(Object data) {
+                    MLOC.d("newVoip", "call success");
+                }
+
+                @Override
+                public void failed(String errMsg) {
+                    MLOC.d("newVoip", "call failed");
+                    stopAndFinish();
+                }
+            });
+        } else if (action.equals(RING)) {
+            MLOC.d("newVoip", "onPickup");
+            onPickup();
+        }
+    }
+
+    /**
+     * 直接呼叫对方
+     */
+    public void audioCall() {
+        showCallingView();
+        MLOC.d("newVoip", "call");
+        voipManager.audioCall(this, targetId, new IXHResultCallback() {
+            @Override
+            public void success(Object data) {
+                MLOC.d("newVoip", "call success");
+            }
+
+            @Override
+            public void failed(String errMsg) {
+                MLOC.d("newVoip", "call failed");
+                stopAndFinish();
+            }
+        });
+
+
+    }
+
+
+    private void setupView() {
+        voipManager.setupView(null, null, new IXHResultCallback() {
+            @Override
+            public void success(Object data) {
+                MLOC.d("newVoip", "setupView success");
+
+            }
+
+            @Override
+            public void failed(String errMsg) {
+                MLOC.d("newVoip", "setupView failed");
+                stopAndFinish();
+            }
+        });
+    }
+
+    public void addListener() {
+        AEvent.addListener(AEvent.AEVENT_VOIP_INIT_COMPLETE, this);
+        AEvent.addListener(AEvent.AEVENT_VOIP_REV_BUSY, this);
+        AEvent.addListener(AEvent.AEVENT_VOIP_REV_REFUSED, this);
+        AEvent.addListener(AEvent.AEVENT_VOIP_REV_HANGUP, this);
+        AEvent.addListener(AEvent.AEVENT_VOIP_REV_CONNECT, this);
+        AEvent.addListener(AEvent.AEVENT_VOIP_REV_ERROR, this);
+    }
+
+    public void removeListener() {
+        MLOC.canPickupVoip = true;
+        AEvent.removeListener(AEvent.AEVENT_VOIP_INIT_COMPLETE, this);
+        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_BUSY, this);
+        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_REFUSED, this);
+        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_HANGUP, this);
+        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_CONNECT, this);
+        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_ERROR, this);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        MLOC.canPickupVoip = false;
+        HistoryBean historyBean = new HistoryBean();
+        historyBean.setType(CoreDB.HISTORY_TYPE_VOIP);
+        historyBean.setLastTime(new SimpleDateFormat("MM-dd HH:mm").format(new java.util.Date()));
+        historyBean.setConversationId(targetId);
+        historyBean.setNewMsgCount(1);
+        MLOC.addHistory(historyBean, true);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+    }
+
+    @Override
+    public void onRestart() {
+        super.onRestart();
+        addListener();
+    }
+
+    @Override
+    public void onDestroy() {
+        removeListener();
+        //todo 状态设置为未在通话中
+        DeviceChannel.calling = false;
+        super.onDestroy();
+    }
+
+    @Override
+    public void onBackPressed() {
+        new AlertDialog.Builder(RTCVoipAudioActivity.this).setCancelable(true)
+                .setTitle("是否挂断?")
+                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface arg0, int arg1) {
+
+                    }
+                }).setPositiveButton("确定", new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface arg0, int arg1) {
+                        timer.stop();
+                        voipManager.hangup(new IXHResultCallback() {
+                            @Override
+                            public void success(Object data) {
+                                stopAndFinish();
+                            }
+
+                            @Override
+                            public void failed(final String errMsg) {
+                                MLOC.d("", "AEVENT_VOIP_ON_STOP errMsg:" + errMsg);
+                                MLOC.showMsg(RTCVoipAudioActivity.this, errMsg);
+                            }
+                        });
+                    }
+                }
+        ).show();
+    }
+
+    @Override
+    public void dispatchEvent(String aEventID, boolean success, final Object eventObj) {
+        super.dispatchEvent(aEventID, success, eventObj);
+        switch (aEventID) {
+            case AEvent.AEVENT_VOIP_REV_BUSY:
+                MLOC.d("", "对方线路忙");
+                MLOC.showMsg(RTCVoipAudioActivity.this, "对方线路忙");
+                stopAndFinish();
+                break;
+            case AEvent.AEVENT_VOIP_REV_REFUSED:
+                MLOC.d("", "对方拒绝通话");
+                MLOC.showMsg(RTCVoipAudioActivity.this, "对方拒绝通话");
+                stopAndFinish();
+                break;
+            case AEvent.AEVENT_VOIP_REV_HANGUP:
+                MLOC.d("", "对方已挂断");
+                MLOC.showMsg(RTCVoipAudioActivity.this, "对方已挂断");
+                timer.stop();
+                stopAndFinish();
+                break;
+            case AEvent.AEVENT_VOIP_REV_CONNECT:
+                MLOC.d("", "对方允许通话");
+                showTalkingView();
+                break;
+            case AEvent.AEVENT_VOIP_REV_ERROR:
+                MLOC.d("", (String) eventObj);
+                stopAndFinish();
+                break;
+        }
+    }
+
+    private void showCallingView() {
+        MLOC.d("", "showCallingView");
+//        findViewById(com.starrtc.demo.R.id.calling_txt).setVisibility(View.VISIBLE);
+//        findViewById(R.id.voice_time_tv).setVisibility(View.INVISIBLE);
+        timer.setVisibility(View.VISIBLE);
+    }
+
+    private void showTalkingView() {
+        MLOC.d("", "showTalkingView");
+//        findViewById(com.starrtc.demo.R.id.calling_txt).setVisibility(View.INVISIBLE);
+        findViewById(R.id.voice_time_tv).setVisibility(View.VISIBLE);
+        timer.setBase(SystemClock.elapsedRealtime());
+        timer.start();
+        setupView();
+    }
+
+    private void onPickup() {
+        voipManager.accept(this, targetId, new IXHResultCallback() {
+            @Override
+            public void success(Object data) {
+                MLOC.d("newVoip", "onPickup OK ");
+            }
+
+            @Override
+            public void failed(String errMsg) {
+                MLOC.d("newVoip", "onPickup failed ");
+                stopAndFinish();
+            }
+        });
+        showTalkingView();
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.voice_hang_up_imagev) {
+            InteractionVO interactionVO = null;
+            if(tcpModel.getData().getClass().getName().equals(String.class.getName())) {
+                 interactionVO = new Gson().fromJson(tcpModel.getData().toString(),InteractionVO.class);
+            }else{
+                interactionVO = (InteractionVO) tcpModel.getData();
+            }
+
+            Log.e(TAG, "tcpModel" + interactionVO.getId());
+            Log.e(TAG, "tcpModel" + tcpModel.toJson());
+//            InteractionVO interactionVO =null;
+//            if(tcpModel.getData() != null){
+//                interactionVO =  new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+//            }
+            //todo 给服务器发送挂断 tcp
+            if (interactionVO != null) {
+                if (tcpModel.getType() == TcpType.VOICE) {
+                    if (tcpModel.getAction() == TcpAction.VoiceAction.SUCCESS) {
+                        TcpModel voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getToId()
+                                , interactionVO.getId());
+                        TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson());
+                    } else if(tcpModel.getAction() == TcpAction.VoiceAction.CALL){
+                        TcpModel voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getFromId()
+                                , interactionVO.getId());
+                        TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson());
+                    }
+                }
+            }
+            voipManager.hangup(new IXHResultCallback() {
+                @Override
+                public void success(Object data) {
+                    stopAndFinish();
+                }
+
+                @Override
+                public void failed(String errMsg) {
+                    stopAndFinish();
+                }
+            });
+        }
+    }
+
+    private void stopAndFinish() {
+        if (starRTCAudioManager != null) {
+            starRTCAudioManager.stop();
+        }
+        RTCVoipAudioActivity.this.finish();
+    }
+    public void Finish() {
+        if (starRTCAudioManager != null) {
+            starRTCAudioManager.stop();
+        }
+        RTCVoipAudioActivity.this.finish();
+    }
+}

+ 149 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/RTCVoipAudioRingingActivity.java

@@ -0,0 +1,149 @@
+package com.wdkl.ncs.android.component.nursehome.activity;
+
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.google.gson.Gson;
+import com.starrtc.demo.database.CoreDB;
+import com.starrtc.demo.database.HistoryBean;
+import com.starrtc.demo.demo.BaseActivity;
+import com.starrtc.demo.demo.MLOC;
+import com.starrtc.demo.demo.voip.VoipAudioActivity;
+import com.starrtc.demo.ui.CircularCoverView;
+import com.starrtc.demo.utils.AEvent;
+import com.starrtc.demo.utils.ColorUtils;
+import com.starrtc.demo.utils.DensityUtils;
+import com.starrtc.starrtcsdk.api.XHClient;
+import com.starrtc.starrtcsdk.apiInterface.IXHResultCallback;
+import com.wdkl.ncs.android.component.nursehome.R;
+import com.wdkl.ncs.android.component.nursehome.common.Constants;
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO;
+import com.wdkl.ncs.android.middleware.tcp.TcpClient;
+import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel;
+import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil;
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
+
+import java.text.SimpleDateFormat;
+
+public class RTCVoipAudioRingingActivity extends BaseActivity implements View.OnClickListener {
+
+    private String targetId;
+    private  InteractionVO interactionVO = new InteractionVO();
+    private TcpModel tcpModel = new TcpModel();
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,
+                WindowManager.LayoutParams. FLAG_FULLSCREEN);
+        setContentView(R.layout.window_invite_voice_calls);
+
+        //todo 设置为通话状态 有其他用户输入时 DeviceChannel设置返回通话中
+        DeviceChannel.calling = true;
+
+        addListener();
+        targetId = getIntent().getStringExtra("targetId");
+        tcpModel = (TcpModel) getIntent().getSerializableExtra("TcpModel");
+
+        findViewById(R.id.voice_hang_up_imagev).setOnClickListener(this);
+        findViewById(R.id.the_voice_answered_imagev).setOnClickListener(this);
+//        ((TextView)findViewById(R.id.targetid_text)).setText(targetId);
+//        ((ImageView)findViewById(R.id.head_img)).setImageResource(MLOC.getHeadImage(RTCVoipAudioRingingActivity.this,targetId));
+//        findViewById(R.id.head_bg).setBackgroundColor(ColorUtils.getColor(RTCVoipAudioRingingActivity.this,targetId));
+//        ((CircularCoverView)findViewById(R.id.head_cover)).setCoverColor(Color.parseColor("#000000"));
+//        int cint = DensityUtils.dip2px(RTCVoipAudioRingingActivity.this,45);
+//        ((CircularCoverView)findViewById(R.id.head_cover)).setRadians(cint, cint, cint, cint,0);
+
+        HistoryBean historyBean = new HistoryBean();
+        historyBean.setType(CoreDB.HISTORY_TYPE_VOIP);
+        historyBean.setLastTime(new SimpleDateFormat("MM-dd HH:mm").format(new java.util.Date()));
+        historyBean.setConversationId(targetId);
+        historyBean.setNewMsgCount(1);
+        MLOC.addHistory(historyBean,true);
+
+    }
+
+    public void addListener(){
+        AEvent.addListener(AEvent.AEVENT_VOIP_REV_HANGUP,this);
+        AEvent.addListener(AEvent.AEVENT_VOIP_REV_ERROR,this);
+    }
+
+    public void removeListener(){
+        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_HANGUP,this);
+        AEvent.removeListener(AEvent.AEVENT_VOIP_REV_ERROR,this);
+    }
+
+    @Override
+    public void dispatchEvent(final String aEventID, boolean success, final Object eventObj) {
+        super.dispatchEvent(aEventID,success,eventObj);
+        switch (aEventID){
+            case AEvent.AEVENT_VOIP_REV_HANGUP:
+                MLOC.d("","对方已挂断");
+                MLOC.showMsg(RTCVoipAudioRingingActivity.this,"对方已挂断");
+                finish();
+                break;
+            case AEvent.AEVENT_VOIP_REV_ERROR:
+                MLOC.showMsg(RTCVoipAudioRingingActivity.this, (String) eventObj);
+                finish();
+                break;
+        }
+    }
+
+    @Override
+    public void onRestart(){
+        super.onRestart();
+        addListener();
+    }
+
+    @Override
+    public void onStop(){
+        super.onStop();
+        //todo 状态设置为未在通话中
+        DeviceChannel.calling = false;
+        removeListener();
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.voice_hang_up_imagev) {
+            //todo 给服务器发送拒接 tcp
+//            InteractionVO interactionVO = (InteractionVO) tcpModel.getData();
+            InteractionVO interactionVO =  new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+            TcpModel voiceUtilTcpModel = VoiceUtil.voiceReject(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getFromId()
+            ,interactionVO.getId());
+            TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson());
+
+            XHClient.getInstance().getVoipManager().refuse(new IXHResultCallback() {
+                @Override
+                public void success(Object data) {
+                    finish();
+                }
+
+                @Override
+                public void failed(String errMsg) {
+                    finish();
+                }
+            });
+        } else if (id == R.id.the_voice_answered_imagev) {
+            //todo 给服务器发送接听 tcp
+//            InteractionVO interactionVO = (InteractionVO) tcpModel.getData();
+            InteractionVO interactionVO =  new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+            TcpModel voiceUtilTcpModel = VoiceUtil.voiceAccept(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getFromId()
+            ,interactionVO.getId());
+            TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson());
+
+            Intent intent = new Intent(RTCVoipAudioRingingActivity.this, RTCVoipAudioActivity.class);
+            intent.putExtra("targetId", targetId);
+//            intent.putExtra("interactionVO", interactionVO);
+            intent.putExtra("TcpModel", tcpModel);
+            intent.putExtra(RTCVoipAudioActivity.ACTION, RTCVoipAudioActivity.CALLING);
+            startActivity(intent);
+            finish();
+        }
+    }
+}

BIN
home/src/main/res/drawable-hdpi/hu_jiao.png


BIN
home/src/main/res/drawable-hdpi/hu_jiao_bg.png


BIN
home/src/main/res/drawable-mdpi/hu_jiao.png


BIN
home/src/main/res/drawable-mdpi/hu_jiao_bg.png