372 lines
13 KiB
Java
372 lines
13 KiB
Java
package com.tianrun.sipcall.call;
|
||
|
||
|
||
import android.annotation.SuppressLint;
|
||
import android.app.Activity;
|
||
import android.app.KeyguardManager;
|
||
import android.content.Context;
|
||
import android.content.Intent;
|
||
import android.os.Bundle;
|
||
import android.os.Handler;
|
||
import android.os.Message;
|
||
import android.os.PowerManager;
|
||
import android.os.PowerManager.WakeLock;
|
||
import android.view.View;
|
||
import android.view.View.OnClickListener;
|
||
import android.view.ViewGroup;
|
||
import android.widget.Button;
|
||
import android.widget.ImageButton;
|
||
import android.widget.TextView;
|
||
|
||
import androidx.annotation.NonNull;
|
||
import androidx.viewpager.widget.PagerAdapter;
|
||
import androidx.viewpager.widget.ViewPager;
|
||
|
||
import com.qmuiteam.qmui.util.QMUIDisplayHelper;
|
||
import com.qmuiteam.qmui.widget.tab.QMUITabBuilder;
|
||
import com.qmuiteam.qmui.widget.tab.QMUITabIndicator;
|
||
import com.qmuiteam.qmui.widget.tab.QMUITabSegment;
|
||
import com.tianrun.sipcall.R;
|
||
import com.tianrun.sipcall.SipEngine;
|
||
import com.tianrun.sipcall.db.DBGroup;
|
||
import com.tianrun.sipcall.db.DBUser;
|
||
import com.tianrun.sipcall.net.Net;
|
||
import com.tianrun.sipcall.ui.TrBaseActivity;
|
||
import com.tianrun.sipcall.utils.CONS;
|
||
import com.tianrun.sipcall.utils.logmy;
|
||
|
||
import blue.view.EngineServer;
|
||
import blue.view.SMPercentFrameLayout;
|
||
import blue.view.SMSurfaceViewRenderer;
|
||
|
||
|
||
public class InCallActivity extends TrBaseActivity implements OnClickListener {
|
||
public static Handler handler_CallActivity;
|
||
public static String TAG = "CallActivity";
|
||
private PowerManager powerManager = null;
|
||
private WakeLock wakeLock = null;
|
||
private SMSurfaceViewRenderer localRender;
|
||
private SMSurfaceViewRenderer remoteRender;
|
||
private SMPercentFrameLayout localRenderLayout;
|
||
private SMPercentFrameLayout remoteRenderLayout;
|
||
private ImageButton incall_answer, incall_hangup;
|
||
private TextView show;
|
||
QMUITabSegment mTabSegment;
|
||
ViewPager mContentViewPager;
|
||
|
||
private EngineServer engineServer;
|
||
|
||
private int callid = -1;//当前通话的id
|
||
private String callnumber = "未知";
|
||
private String callstate = "未知";
|
||
private int calltype = 0; //0音频1视频
|
||
private boolean selfCall = false;
|
||
private boolean VIDEOSTATE = false;
|
||
public static Intent incallIntent;
|
||
|
||
public String[] screenTyps = {"经典模式", "均分模式", "远程全屏", "本地全屏"};
|
||
|
||
private PagerAdapter mPagerAdapter = new PagerAdapter() {
|
||
@Override
|
||
public boolean isViewFromObject(View view, Object object) {
|
||
return view == object;
|
||
}
|
||
|
||
@Override
|
||
public int getCount() {
|
||
return screenTyps.length;
|
||
}
|
||
|
||
@Override
|
||
public Object instantiateItem(final ViewGroup container, int position) {
|
||
// ContentPage page = ContentPage.getPage(position);
|
||
View view = remoteRender;
|
||
// view.setTag(page);
|
||
// ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
|
||
// ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
|
||
// container.addView(view, params);
|
||
return view;
|
||
}
|
||
|
||
@Override
|
||
public void destroyItem(ViewGroup container, int position, Object object) {
|
||
container.removeView((View) object);
|
||
}
|
||
|
||
@Override
|
||
public int getItemPosition(@NonNull Object object) {
|
||
View view = (View) object;
|
||
return 0;
|
||
}
|
||
};
|
||
|
||
@SuppressLint("InvalidWakeLockTag")
|
||
@Override
|
||
protected void onCreate(Bundle savedInstanceState) {
|
||
super.onCreate(savedInstanceState);
|
||
// fullScreen();
|
||
setContentView(R.layout.incallactivity);
|
||
handler_CallActivity = handler;
|
||
powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
|
||
//获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是调试用的Tag
|
||
wakeLock = powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
|
||
//点亮屏幕
|
||
wakeLock.acquire();
|
||
|
||
KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
|
||
KeyguardManager.KeyguardLock kl = km.newKeyguardLock("unLock");
|
||
kl.disableKeyguard();
|
||
initview();
|
||
incallIntent = getIntent();
|
||
setDate(this.getIntent());
|
||
initTabAndPager();
|
||
}
|
||
|
||
private void initview() {
|
||
show = (TextView) findViewById(R.id.show);
|
||
incall_answer = (ImageButton) findViewById(R.id.incall_answer);
|
||
incall_hangup = (ImageButton) findViewById(R.id.incall_hangup);
|
||
incall_hangup.setOnClickListener(this);
|
||
incall_answer.setOnClickListener(this);
|
||
//下面为视频部分
|
||
localRender = (SMSurfaceViewRenderer) findViewById(R.id.local_video_view);
|
||
remoteRender = (SMSurfaceViewRenderer) findViewById(R.id.remote_video_view);
|
||
localRenderLayout = (SMPercentFrameLayout) findViewById(R.id.local_video_layout);
|
||
remoteRenderLayout = (SMPercentFrameLayout) findViewById(R.id.remote_video_layout);
|
||
engineServer = new EngineServer(localRender, remoteRender, localRenderLayout, remoteRenderLayout, true);
|
||
|
||
mTabSegment = findViewById(R.id.ScreenType);
|
||
mContentViewPager = findViewById(R.id.contentViewPager);
|
||
}
|
||
|
||
private void initTabAndPager() {
|
||
mContentViewPager.setAdapter(mPagerAdapter);
|
||
mContentViewPager.setCurrentItem(0, false);
|
||
QMUITabBuilder tabBuilder = mTabSegment.tabBuilder();
|
||
for (int i = 0; i < screenTyps.length; i++) {
|
||
mTabSegment.addTab(tabBuilder.setText(screenTyps[i]).build(this));
|
||
}
|
||
int space = QMUIDisplayHelper.dp2px(this, 16);
|
||
mTabSegment.setIndicator(new QMUITabIndicator(
|
||
QMUIDisplayHelper.dp2px(this, 2), false, true));
|
||
mTabSegment.setMode(QMUITabSegment.MODE_SCROLLABLE);
|
||
mTabSegment.setItemSpaceInScrollMode(space);
|
||
mTabSegment.setupWithViewPager(mContentViewPager, false);
|
||
mTabSegment.setPadding(space, 0, space, 0);
|
||
mTabSegment.addOnTabSelectedListener(new QMUITabSegment.OnTabSelectedListener() {
|
||
@Override
|
||
public void onTabSelected(int index) {
|
||
engineServer.adjustVideoView(index);
|
||
}
|
||
|
||
@Override
|
||
public void onTabUnselected(int index) {
|
||
}
|
||
|
||
@Override
|
||
public void onTabReselected(int index) {
|
||
}
|
||
|
||
@Override
|
||
public void onDoubleTap(int index) {
|
||
}
|
||
});
|
||
}
|
||
|
||
@Override
|
||
protected void onNewIntent(Intent intent) {
|
||
super.onNewIntent(intent);
|
||
fullScreen();
|
||
incallIntent = getIntent();
|
||
setDate(intent);
|
||
}
|
||
|
||
@Override
|
||
protected void onResume() {
|
||
super.onResume();
|
||
if (callstate.equals("来电")) {
|
||
incall_answer.setVisibility(View.VISIBLE);
|
||
} else {
|
||
incall_answer.setVisibility(View.GONE);
|
||
}
|
||
show.setText(callnumber + callstate);
|
||
if (incall_answer.getVisibility() == View.VISIBLE && selfCall) {
|
||
incall_answer.setVisibility(View.GONE);
|
||
SipEngine.getInstance().answer(callid);
|
||
SipEngine.getInstance().StopdefaultCallMediaPlayer(this);
|
||
} else {
|
||
SipEngine.getInstance().PlaydefaultCallMediaPlayer(this);
|
||
}
|
||
|
||
}
|
||
|
||
@Override
|
||
protected void onPause() {
|
||
super.onPause();
|
||
// onDestroy();
|
||
}
|
||
|
||
@Override
|
||
protected void onDestroy() {
|
||
stopVideoStream(true);
|
||
super.onDestroy();
|
||
SipEngine.getInstance().hangup(callid);
|
||
handler_CallActivity = null;
|
||
if (wakeLock != null) {
|
||
wakeLock.release();
|
||
wakeLock = null;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 变更通话数据
|
||
*/
|
||
public void setDate(Intent intent) {
|
||
Bundle bundle = intent.getExtras();
|
||
callid = bundle.getInt("callid");
|
||
callnumber = bundle.getString("callnumber");
|
||
callstate = bundle.getString("callstate");
|
||
calltype = bundle.getInt("calltype");
|
||
selfCall = bundle.getBoolean("selfCall");
|
||
}
|
||
|
||
/**
|
||
* 停止视频
|
||
*
|
||
* @param isExit 是否完全退出视频
|
||
*/
|
||
public synchronized void stopVideoStream(boolean isExit) {
|
||
if (VIDEOSTATE && engineServer != null) {
|
||
engineServer.stopVideoStream(isExit);
|
||
VIDEOSTATE = false;
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public boolean handleMessage(Message m) {
|
||
switch (m.what) {
|
||
case CONS.ONGETCALLID:
|
||
callid = (int)m.obj;
|
||
break;
|
||
case CONS.CALLSTATE:
|
||
callstate = (String) m.obj;
|
||
show.setText(callnumber + callstate);
|
||
if (callstate.equals("挂断")) {
|
||
stopVideoStream(true);
|
||
finish();
|
||
}
|
||
break;
|
||
case CONS.MEDIASTATE:
|
||
CallMediaUtils utils = (CallMediaUtils) m.obj;
|
||
int r = utils.getR();
|
||
int l = utils.getL();
|
||
int payload = utils.getPayload();
|
||
if (r != 0 || l != 0) {
|
||
//开始视频
|
||
ShowVideoView(true);
|
||
startVideoStream(SipEngine.getInstance().getip(), r, l, payload);
|
||
} else {
|
||
//开始音频
|
||
stopVideoStream(false);
|
||
ShowVideoView(false);
|
||
}
|
||
break;
|
||
case CONS.CALLDOWN:
|
||
stopVideoStream(true);
|
||
finish();
|
||
break;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
private synchronized void startVideoStream(String server, int rport, int lport, final int payload) {
|
||
int BitRate = 768;
|
||
int FrameRate = 10;
|
||
int w = 480;
|
||
int h = 270;
|
||
String camerafb = "Front";
|
||
int c = 1;
|
||
switch (camerafb) {
|
||
case "Front":
|
||
c = 1;
|
||
break;
|
||
case "Post":
|
||
c = 0;
|
||
break;
|
||
case "Usb":
|
||
c = 2;
|
||
break;
|
||
}
|
||
c = 0;
|
||
logmy.e(callnumber + "--" + server + "--" + rport + "--" + lport);
|
||
if (engineServer != null) {
|
||
ShowVideoView(true);
|
||
/*
|
||
* 开始视频
|
||
* @param context
|
||
* @param server 服务器地址
|
||
* @param rport 远程端口
|
||
* @param lport 本地端口
|
||
* @param payload payload
|
||
* @param BitRate 带宽
|
||
* @param FrameRate 帧率
|
||
* @param w 宽
|
||
* @param h 高
|
||
* @param camtype 摄像头前后外置
|
||
* @param videoHwAcceleration 是否启用硬编
|
||
* @param recordTx 是否录制远程画面
|
||
* @param recordRx 是否录制本地画面
|
||
* @param saveVideoDir 录制画面存放的文件
|
||
*/
|
||
engineServer.startVideoStream(this, server, rport, lport, payload, BitRate, FrameRate, w, h, c, true);
|
||
VIDEOSTATE = true;
|
||
}
|
||
|
||
}
|
||
|
||
@Override
|
||
public void onClick(View v) {
|
||
switch (v.getId()) {
|
||
case R.id.incall_hangup:
|
||
SipEngine.getInstance().hangup(callid);
|
||
if (SipEngine.callPagesConfig.size() == 0) {
|
||
finish();
|
||
}
|
||
break;
|
||
case R.id.incall_answer:
|
||
incall_answer.setVisibility(View.GONE);
|
||
SipEngine.getInstance().answer(callid);
|
||
SipEngine.getInstance().StopdefaultCallMediaPlayer(this);
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
public void ShowVideoView(boolean show) {
|
||
if (show) {
|
||
localRenderLayout.setVisibility(View.VISIBLE);
|
||
remoteRenderLayout.setVisibility(View.VISIBLE);
|
||
} else {
|
||
localRenderLayout.setVisibility(View.GONE);
|
||
remoteRenderLayout.setVisibility(View.GONE);
|
||
}
|
||
}
|
||
|
||
@SuppressLint("NewApi")
|
||
void fullScreen() {
|
||
int flag = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
||
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
||
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||
| View.SYSTEM_UI_FLAG_FULLSCREEN
|
||
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
|
||
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
|
||
getWindow().getDecorView().setSystemUiVisibility(flag);
|
||
}
|
||
|
||
public void switchCamera() {
|
||
if (engineServer != null) {
|
||
engineServer.switchCamera(null);
|
||
}
|
||
}
|
||
}
|