package com.hdl.hdllinphonesdk.activity; import android.content.Context; import android.content.DialogInterface; import android.graphics.Bitmap; import android.media.AudioAttributes; import android.media.MediaPlayer; import android.os.Build; import android.os.CountDownTimer; import android.os.Handler; import android.os.SystemClock; import android.os.Vibrator; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; import android.view.TextureView; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.Chronometer; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.hdl.hdllinphonesdk.HDLLinphoneKit; import com.hdl.hdllinphonesdk.R; import com.hdl.hdllinphonesdk.callback.OnLPOpenDoorCallBack; import com.hdl.hdllinphonesdk.utils.HDLImageUtils; import com.hdl.hdllinphonesdk.utils.HDLLog; import org.linphone.core.Call; import org.linphone.core.CallParams; import org.linphone.core.Core; import org.linphone.core.CoreListenerStub; /** * 反呼页面 */ public class HDLLinphoneReverseCallActivity extends LPCheckPermissionsActivity implements View.OnClickListener { private static final String TAG = "HDLLinphoneReverseCallActivity"; //控件 private TextView tv_lp_title; private ImageView iv_lp_screenshot; private ImageView iv_lp_unlock; private ImageView iv_lp_hangUp; private TextView tv_lp_hangUp; private RelativeLayout rl_lp_hangUpAll; private ImageView iv_lp_hangUpAll; private TextView tv_lp_hangUpAll; private ImageView iv_lp_answer; private TextView tv_lp_answer; private RelativeLayout rl_lp_answerView; private LinearLayout ll_video_lp_rendering; private TextureView video_lp_rendering; private TextureView video_lp_rendering2; // private TextView tv_lp_calltime; private Chronometer timer_lp_calltime; private TextView tv_lp_calltime; //参数 private boolean isAnswer = false;//是否已经接听了 private int callTime;//通话时间 //倒计时 private CountDownTimer mCountDownTimer; /** * 手机振动器 */ private Vibrator mVibrator; //Linphone private CoreListenerStub mCoreListener; private String deviceSipAccount;//设备SIP账号 private boolean enableVideo = false; private CountDownTimer mMissedCallsTimer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, // WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_hdllinphone_intercom); initView(); initData(); initOnClick(); initCallBack(); initCountDownTimer(); initLinphone(); // initVibrator(); initMissedCallsTimer(); mMissedCallsTimer.start(); } /** * onDestroy */ @Override protected void onDestroy() { super.onDestroy(); //1.挂断 HDLLinphoneKit.getInstance().hangUp(); //2.暂停计时 if (null != timer_lp_calltime) { timer_lp_calltime.stop(); } //3.注销callBack HDLLinphoneKit.getInstance().setOpenOpenDoorCallBack(null); //4.取消震动器 cancelVibrator(); //5. if (mCountDownTimer != null) { mCountDownTimer.cancel(); mCountDownTimer = null; } if (mMissedCallsTimer != null) { mMissedCallsTimer.cancel(); mMissedCallsTimer = null; } onDestroyLinphone(); HDLLog.i(TAG, "onDestroy"); } /** * initView */ private void initView() { tv_lp_title = findViewById(R.id.tv_lp_title); iv_lp_screenshot = findViewById(R.id.iv_lp_screenshot); iv_lp_unlock = findViewById(R.id.iv_lp_unlock); iv_lp_hangUp = findViewById(R.id.iv_lp_hangUp); tv_lp_hangUp = findViewById(R.id.tv_lp_hangUp); rl_lp_hangUpAll = findViewById(R.id.rl_lp_hangUp_all); iv_lp_hangUpAll = findViewById(R.id.iv_lp_hangUp_all); tv_lp_hangUpAll = findViewById(R.id.tv_lp_hangUp_all); iv_lp_answer = findViewById(R.id.iv_lp_answer); tv_lp_answer = findViewById(R.id.tv_lp_answer); rl_lp_answerView = findViewById(R.id.rl_lp_answerView); ll_video_lp_rendering = findViewById(R.id.ll_video_lp_rendering); video_lp_rendering = findViewById(R.id.video_lp_rendering); video_lp_rendering2 = findViewById(R.id.video_lp_rendering2); // tv_lp_calltime = findViewById(R.id.tv_lp_calltime); timer_lp_calltime = (Chronometer) findViewById(R.id.timer_lp_calltime); tv_lp_calltime = findViewById(R.id.tv_lp_calltime); setWidthHeightWithRatio(ll_video_lp_rendering, 16, 9); iv_lp_screenshot.setEnabled(false); iv_lp_unlock.setEnabled(false); } /** * initData */ private void initData() { Bundle extras = getIntent().getExtras(); if (extras != null) { String titleName = extras.getString(HDLLinphoneKit.KEY_TITLE_NAME); if (!TextUtils.isEmpty(titleName)) { tv_lp_title.setText(titleName); } deviceSipAccount = extras.getString(HDLLinphoneKit.KEY_SIP_ACCOUNT); } } /** * 指定屏幕宽度 根据宽高比设置控件宽高 */ public void setWidthHeightWithRatio(View view, int widthRatio, int heightRatio) { DisplayMetrics outMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(outMetrics); int width = outMetrics.widthPixels; if (width <= 0) width = view.getWidth(); int height = width * heightRatio / widthRatio; ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); if (layoutParams != null) { layoutParams.height = height; layoutParams.width = width; view.setLayoutParams(layoutParams); } } /** * init OnClickListener */ private void initOnClick() { iv_lp_screenshot.setOnClickListener(this); iv_lp_unlock.setOnClickListener(this); iv_lp_hangUp.setOnClickListener(this); tv_lp_hangUp.setOnClickListener(this); iv_lp_answer.setOnClickListener(this); tv_lp_answer.setOnClickListener(this); iv_lp_hangUpAll.setOnClickListener(this); tv_lp_hangUpAll.setOnClickListener(this); } /** * 初始化开门回调事件 */ void initCallBack() { HDLLinphoneKit.getInstance().setOpenOpenDoorCallBack(new OnLPOpenDoorCallBack() { @Override public void onOpenSuccess() { setOpenDoorSuccess(); } @Override public void onOpenError(String errorMes) { showToast(getString(R.string.lp_unlockfailureStr) + errorMes); } }); } /** * 初始化开锁屏蔽倒计时 */ void initCountDownTimer() { mCountDownTimer = new CountDownTimer(10 * 1000, 1000) { @Override public void onTick(long millisUntilFinished) { if (!HDLLinphoneReverseCallActivity.this.isFinishing()) { } } /** *倒计时结束后调用的 */ @Override public void onFinish() { iv_lp_unlock.setEnabled(true); } }; } /** * 初始化接听计时器 */ void initMissedCallsTimer() { mMissedCallsTimer = new CountDownTimer(HDLLinphoneKit.getInstance().missedCallsTime * 1000, 1000) { @Override public void onTick(long millisUntilFinished) { if (!HDLLinphoneReverseCallActivity.this.isFinishing()) { if(isAnswer){ mMissedCallsTimer.cancel(); mMissedCallsTimer = null; } } } /** *倒计时结束后调用的 */ @Override public void onFinish() { if (!HDLLinphoneReverseCallActivity.this.isFinishing()) { if (!isAnswer) { isAnswer = true; HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener().onMissedCallsAction(); finish(); } } } }; } @Override public void onClick(View view) { int id = view.getId(); if (id == R.id.iv_lp_screenshot) { //截图 onClickScreenshot(); } else if (id == R.id.iv_lp_unlock) { //开锁 onClickUnlock(); } else if (id == R.id.iv_lp_hangUp || id == R.id.tv_lp_hangUp) { //挂断 onClickHangUp(); } else if (id == R.id.iv_lp_answer || id == R.id.tv_lp_answer) { //接听 onClickAnswer(); } else if (id == R.id.iv_lp_hangUp_all || id == R.id.tv_lp_hangUp_all) { //全部挂断 onClickHangUpAll(); } } /** * 截图点击事件 */ private void onClickScreenshot() { // Bitmap img = HDLImageUtils.createViewBitmap(video_lp_rendering); Bitmap img = video_lp_rendering.getBitmap(); boolean isSuccess = HDLImageUtils.saveImageToGallery(this, img); if (isSuccess) { showToast(getString(R.string.lp_saveToTheAlbumsStr)); } else { showToast(getString(R.string.lp_operationFailedStr)); } } /** * 开锁点击事件 */ private void onClickUnlock() { try { AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.CustomAlertDialog); builder.setTitle(R.string.lp_tipStr); builder.setMessage(R.string.tip_confirm_unlock); builder.setPositiveButton(R.string.lp_confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 在确定按钮被点击时执行的操作 // 可以在这里添加你想要执行的逻辑 if (HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener() != null) { HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener().onUnlockAction(); } dialog.dismiss(); // 关闭弹窗 } }); builder.setNegativeButton(R.string.lp_cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 在取消按钮被点击时执行的操作 // 可以在这里添加你想要执行的逻辑 dialog.dismiss(); // 关闭弹窗 } }); AlertDialog dialog = builder.create(); dialog.show(); } catch (Exception exception) { Log.e(TAG, exception.getMessage()); } } /** * 挂断点击事件 */ private void onClickHangUp() { //2.回调事件 if (HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener() != null) { if (isAnswer) { //如果之前已经接听了,回调是挂断 callTime = getTimerCallTime(); HDLLog.i("callTime", "callTime" + callTime); HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener().onHangUpAction(callTime); } else { //如果之前没接听了,回调是拒接 HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener().onRejectCallAction(); } } //2.页面关闭 finish(); } /** * 全部挂断点击事件 */ private void onClickHangUpAll() { //1.挂断 HDLLinphoneKit.getInstance().hangUp(); //2.回调事件 if (HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener() != null) { HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener().onCallAllRejection(); } //3.页面关闭 finish(); } /** * 接听按钮点击事件 */ private void onClickAnswer() { //1.接听 反呼 if (TextUtils.isEmpty(deviceSipAccount)) { getString(R.string.lp_sipAccount_null); return; } HDLLinphoneKit.getInstance().callTo(deviceSipAccount, true); //2.取消震动 cancelVibrator(); //3.修改UI isAnswer = true; tv_lp_hangUp.setText(getString(R.string.lp_hangupStr)); setViewGone(rl_lp_answerView); setViewGone(tv_lp_calltime); setViewGone(rl_lp_hangUpAll); setViewVisible(timer_lp_calltime); startCallTimeCountdown(); //接听通知 if (HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener() != null) { HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener().onAnswerAction(); } iv_lp_screenshot.setEnabled(true); iv_lp_unlock.setEnabled(true); } /****************开锁成功********/ /** * 开锁成功后,10s内不能重复开锁 * 开锁按钮禁用,倒计时结束后重新允许点击 */ void setOpenDoorSuccess() { showToast(getString(R.string.lp_unlockSuccessfullyStr)); iv_lp_unlock.setEnabled(false); startOpenDoorCountdown(); } /** * 开启倒计时 */ void startOpenDoorCountdown() { mCountDownTimer.start(); } /** * 通话记录开启倒计时 */ void startCallTimeCountdown() { timer_lp_calltime.setBase(SystemClock.elapsedRealtime());//计时器清零 timer_lp_calltime.start(); } int getTimerCallTime() { int temp0 = Integer.parseInt(timer_lp_calltime.getText().toString().split(":")[0]); int temp1 = Integer.parseInt(timer_lp_calltime.getText().toString().split(":")[1]); return temp0 * 60 + temp1; } /****************封装常用方法********/ /** * showToast */ private void showToast(String text) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); } /** * setViewVisible */ private static void setViewVisible(View view) { if (view.getVisibility() != View.VISIBLE) { view.setVisibility(View.VISIBLE); } } /** * setViewGone */ private static void setViewGone(View view) { if (view.getVisibility() != View.GONE) { view.setVisibility(View.GONE); } } /**********LinPhone**********/ /** * initLinphone */ void initLinphone() { mCoreListener = new CoreListenerStub() { @Override public void onCallStateChanged(Core core, Call call, Call.State state, String message) { if (state == Call.State.End || state == Call.State.Released) { // Once call is finished (end state), terminate the activity // We also check for released state (called a few seconds later) just in case // we missed the first one showToast(getString(R.string.lp_endOfCallStr)); finish(); } else if (state == Call.State.StreamsRunning) { if (HDLLinphoneKit.getInstance().getIntercomeType().equals(HDLLinphoneKit.INTER_PHONE_TYPE_HDL)) { if (!enableVideo) { enableVideo(core, call); enableVideo = true; } } } } }; Core core = HDLLinphoneKit.getInstance().getCore(); // We need to tell the core in which to display what if (core != null) { core.setNativeVideoWindowId(video_lp_rendering); core.setNativePreviewWindowId(video_lp_rendering2); // Listen for call state changes core.addListener(mCoreListener); core.enableMic(true);//开启麦克风 } } void enableVideo(Core core, Call call) { // Call currentCall = HDLLinphoneService.getCore().getCurrentCall(); CallParams params = call.getCurrentParams(); if (params == null) { params = core.createCallParams(call); } params.enableVideo(true); params.enableLowBandwidth(false); params.setAudioBandwidthLimit(0); // disable limitation call.update(params); } /** * onDestroyLinphone */ void onDestroyLinphone() { Core core = HDLLinphoneKit.getInstance().getCore(); if (core != null) { core.removeListener(mCoreListener); core.setNativeVideoWindowId(null); core.setNativePreviewWindowId(null); } video_lp_rendering = null; video_lp_rendering2 = null; } /** * 初始化震动器 */ void initVibrator() { mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); if (mVibrator.hasVibrator()) { long[] patern = {0, 1000, 1000}; AudioAttributes audioAttributes = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { audioAttributes = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE) //key .build(); mVibrator.vibrate(patern, 1, audioAttributes); } else { mVibrator.vibrate(patern, 1); } } else { HDLLog.E("当前手机没有震动器"); } } /** * 关闭震动器 */ void cancelVibrator() { if (mVibrator != null) { mVibrator.cancel(); mVibrator = null; } } }