New file |
| | |
| | | package com.hdl.hdllinphonesdk.activity; |
| | | |
| | | import android.content.Context; |
| | | import android.graphics.Bitmap; |
| | | import android.media.AudioAttributes; |
| | | import android.os.Build; |
| | | import android.os.CountDownTimer; |
| | | import android.os.SystemClock; |
| | | import android.os.Vibrator; |
| | | import android.support.v7.app.AppCompatActivity; |
| | | import android.os.Bundle; |
| | | import android.text.TextUtils; |
| | | import android.util.DisplayMetrics; |
| | | 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.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 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;//是否已经接听了 |
| | | private int callTime;//通话时间 |
| | | //倒计时 |
| | | private CountDownTimer mCountDownTimer; |
| | | /** |
| | | * 手机振动器 |
| | | */ |
| | | private Vibrator mVibrator; |
| | | |
| | | //Linphone |
| | | private CoreListenerStub mCoreListener; |
| | | |
| | | private String deviceSipAccount;//设备SIP账号 |
| | | |
| | | |
| | | @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(); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 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; |
| | | } |
| | | //5. |
| | | 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); |
| | | 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); |
| | | |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 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); |
| | | } |
| | | |
| | | /** |
| | | * 初始化开门回调事件 |
| | | */ |
| | | 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() { |
| | | // showToast("开锁onFinish"); |
| | | iv_lp_unlock.setEnabled(true); |
| | | } |
| | | |
| | | }; |
| | | // |
| | | } |
| | | |
| | | @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(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 截图点击事件 |
| | | */ |
| | | 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() { |
| | | if (HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener() != null) { |
| | | HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener().onUnlockAction(); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 挂断点击事件 |
| | | */ |
| | | 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 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); |
| | | setViewVisible(timer_lp_calltime); |
| | | startCallTimeCountdown(); |
| | | //接听通知 |
| | | if (HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener() != null) { |
| | | HDLLinphoneKit.getInstance().getOnHDLLinphoneCallListener().onAnswerAction(); |
| | | } |
| | | } |
| | | |
| | | /****************开锁成功********/ |
| | | |
| | | /** |
| | | * 开锁成功后,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(); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | 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);//开启麦克风 |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 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; |
| | | } |
| | | |
| | | } |
| | | } |