Jelajahi Sumber

## [1.0.14] version 14 - 2020-07-15
### Added
- 当有线耳机插入时,按键接听,使用耳机及其麦克风进行对讲
- 当蓝牙耳机连接时,按键接听,使用蓝牙耳机及其麦克风进行对讲
> 优先集小于有线耳机
### Changed
- 更新Keepalive.aar,去掉背景音乐播放
- 优化WatchHome2Activity代码
- 更新高分辨率的图标LOGO
- 优化换班列表展示
### Removed
- 删除 home 模块中的 KeepAcitivity 相关

allen 4 tahun lalu
induk
melakukan
8404e5cc1e

+ 1 - 1
app/src/main/AndroidManifest.xml

@@ -22,7 +22,7 @@
     <application
         android:allowBackup="true"
         android:icon="@mipmap/launcher"
-        android:label="维鼎腕表"
+        android:label="维鼎移动"
         android:supportsRtl="true"
         tools:replace="android:label"
         tools:remove="android:requestLegacyExternalStorage"

+ 3 - 3
build.gradle

@@ -27,7 +27,7 @@ buildscript {
     /**
      * SDK最小支持版本
      */
-    ext.min_sdk_version = 24
+    ext.min_sdk_version = 22
 
     /**
      * SDK目标支持版本
@@ -47,12 +47,12 @@ buildscript {
     /**
      * APP版本码
      */
-    ext.app_version_code = 13
+    ext.app_version_code = 14
 
     /**
      * APP版本号
      */
-    ext.app_version = "1.0.13"
+    ext.app_version = "1.0.14"
 
     /**
      * 项目依赖库

+ 1 - 0
gradle.properties

@@ -22,3 +22,4 @@ org.gradle.configureondemand=true
 android.useAndroidX=true
 android.enableJetifier=true
 android.enableAapt2=true
+android.injected.testOnly=false

+ 34 - 38
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioActivity.kt

@@ -1,6 +1,9 @@
 package com.wdkl.ncs.android.component.home.activity
 
 import android.app.Activity
+import android.bluetooth.BluetoothAdapter
+import android.bluetooth.BluetoothHeadset
+import android.media.AudioManager
 import android.os.Bundle
 import android.os.CountDownTimer
 import android.os.Handler
@@ -17,7 +20,6 @@ import com.wdkl.ncs.android.lib.utils.AppTool
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
-import com.wdkl.ncs.android.middleware.tcp.TcpClientHandler
 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
@@ -90,7 +92,6 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
 
         Log.i(TAG, "tcpModel" + tcpModel.action)
 
-        MediaPlayHelper.getInstance().playResMusic(R.raw.outgoing_call, 0.6f, true)
         if (tcpModel.type == TcpType.VOICE) {
             if (tcpModel.action === TcpAction.VoiceAction.CALL) {
                 val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
@@ -105,31 +106,16 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
 
         if (action == CALLING) {
             Log.i(TAG, "自己同意 拨打过去。。。")
-            //webRTC
-            var room = UUID.randomUUID().toString() + System.currentTimeMillis()
-            Log.i(TAG, "生成的房间号room " + room + "sipid targetId" + targetId)
-            val b = gEngineKit?.startOutCall(applicationContext, room, targetId, true)
-            val session = gEngineKit?.getCurrentSession()
-            if (session != null) {
-                Handler().postDelayed({
-                    //防止建立连接的时候 不能成功切换外音
-                    session.toggleSpeaker(true)
-                }, 3500)
-            }
+            createCallout()
 
             call_duration_tv.visibility = View.VISIBLE
-
             call_duration_tv.text = "连接中...."
-            Handler().postDelayed({
-                call_duration_tv.base = SystemClock.elapsedRealtime()
-                call_duration_tv.start()
-            }, 2900)
 
         } else if (action == RING) {
             Log.i(TAG, "接电话。。。")
+        } else if (action == CALL) { //主动拨出,服务端回复success时
+            MediaPlayHelper.getInstance().playResMusic(R.raw.outgoing_call, 0.6f, true)
         }
-
-
     }
 
     override fun onStart() {
@@ -141,6 +127,33 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
         hands_free_image.setOnClickListener(this)
     }
 
+    fun createCallout(){
+        Handler().postDelayed({
+            call_duration_tv.base = SystemClock.elapsedRealtime()
+            call_duration_tv.start()
+
+        }, 2900)
+
+        var room = UUID.randomUUID().toString() + System.currentTimeMillis()
+        Log.i(TAG, "生成的房间号room " + room + "sipid targetId" + targetId)
+
+        val b = gEngineKit?.startOutCall(applicationContext, room, targetId, true)
+        val session = gEngineKit?.getCurrentSession()
+        val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
+        val isBluetoothHeadsetConnected = (bluetoothAdapter != null && bluetoothAdapter.isEnabled
+                && bluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED)
+        if (session?.isHeadphonesPlugged()!!){
+            session?.toggleHeadset(true)
+        } else if (isBluetoothHeadsetConnected){
+            session?.toggleBluetooth()
+        } else {
+            Handler().postDelayed({
+                //防止建立连接的时候 不能成功切换外音
+                session?.toggleSpeaker(true)
+            }, 3500)
+        }
+    }
+
     override fun onClick(p0: View?) {
         when (p0?.id) {
             R.id.hang_up_imagev -> {
@@ -213,26 +226,9 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
             if (tcpModel.action === TcpAction.VoiceAction.ACCEPT) {
                 MediaPlayHelper.getInstance().stopMusic()
                 Log.i(TAG, "对方接听电话啦")
-                MediaPlayHelper.getInstance().stopMusic()
                 call_duration_tv.visibility = View.VISIBLE
-
                 call_duration_tv.text = "连接中...."
-                Handler().postDelayed({
-                    call_duration_tv.base = SystemClock.elapsedRealtime()
-                    call_duration_tv.start()
-
-                }, 2900)
-
-                var room = UUID.randomUUID().toString() + System.currentTimeMillis()
-                Log.i(TAG, "生成的房间号room " + room + "sipid targetId" + targetId)
-
-                val b = gEngineKit?.startOutCall(applicationContext, room, targetId, true)
-                val session = gEngineKit?.getCurrentSession()
-                if (session != null) {
-                    Handler().postDelayed({
-                        session.toggleSpeaker(true)
-                    }, 3500)
-                }
+                createCallout()
             } else if (tcpModel.action == TcpAction.VoiceAction.HANDOFF) { //对方挂断
                 call_duration_tv.stop()
                 val session = gEngineKit?.getCurrentSession()

+ 3 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioRingingActivity.kt

@@ -191,6 +191,9 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
 
     override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
         Log.i(TAG, "keyup keyCode " + keyCode)
+        if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK){
+            answerCall()
+        }
         return if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP) {
             true
         } else {

+ 1 - 1
home/src/main/code/com/wdkl/ncs/android/component/home/util/MediaPlayHelper.java

@@ -257,7 +257,7 @@ public class MediaPlayHelper {
                             switch (keyCode) {
                                 case KeyEvent.KEYCODE_MEDIA_PLAY:
                                 case KeyEvent.KEYCODE_MEDIA_PAUSE:
-//                                    EventBus.getDefault().post(new MessageEvent(1, Constants.EVENT_BLUETOOTH_ACCEPT_CALL));
+                                    EventBus.getDefault().post(new MessageEvent(1, Constants.EVENT_BLUETOOTH_ACCEPT_CALL));
                                     break;
                                 default:
                                     break;

+ 1 - 1
home/src/main/code/com/wdkl/ncs/android/component/home/util/SpeechUtil.java

@@ -80,7 +80,7 @@ public class SpeechUtil {
                 }
             });
         }
-        textToSpeech.setSpeechRate(0.5f);
+        textToSpeech.setSpeechRate(1f);
     }
 
     public void newSpeech(String text, boolean emergency) {

+ 3 - 3
home/src/main/res/layout/takeover_item.xml

@@ -3,8 +3,8 @@
     <RelativeLayout
         xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
-        android:layout_height="70px"
-        android:layout_marginTop="7px"
+        android:layout_height="70sp"
+        android:layout_marginTop="7sp"
         android:background="@drawable/item_selector">
 
         <RelativeLayout
@@ -16,7 +16,7 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_centerVertical="true"
-                android:layout_marginLeft="20px"
+                android:layout_marginLeft="20sp"
                 android:textColor="#F78B8F"
                 android:textSize="16sp" />
 

+ 6 - 6
home/src/main/res/layout/user_setting_layout.xml

@@ -37,7 +37,7 @@
                     android:id="@+id/tv_device_imei"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="设备IMEI: --"
+                    android:text="设备识别码: --"
                     android:textSize="16dp" />
                 <TextView
                     android:id="@+id/tv_device_ip"
@@ -50,13 +50,13 @@
                 android:id="@+id/tv_device_user_name"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="当前用户: 王护士"
+                android:text="当前用户: ---"
                 android:textSize="16dp" />
                 <TextView
                     android:id="@+id/tv_device_user_role_name"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="用户角色: 护士"
+                    android:text="用户角色: ---"
                     android:textSize="16dp" />
             </LinearLayout>
 
@@ -118,7 +118,7 @@
                 android:layout_height="40dp"
                 android:background="#ffffff"
                 android:gravity="center"
-                android:textSize="18px"
+                android:textSize="18dp"
                 android:text="检查升级"/>
 
             <TextView
@@ -130,7 +130,7 @@
                 android:background="#ffffff"
                 android:layout_marginTop="10dp"
                 android:gravity="center"
-                android:textSize="18px"
+                android:textSize="18dp"
                 android:text="重启设备"/>
             <TextView
                 android:id="@+id/setting_tv"
@@ -142,7 +142,7 @@
                 android:layout_marginBottom="20dp"
                 android:background="#ffffff"
                 android:gravity="center"
-                android:textSize="18px"
+                android:textSize="18dp"
                 android:text="系统设置"/>
 
         </LinearLayout>

+ 15 - 0
readme.md

@@ -25,6 +25,21 @@
 在发布新版本时,可以直接将Unreleased区块中的内容移动至新发 布版本的描述区块就可以了
 
 ---
+
+## [1.0.14] version 14 - 2020-07-15
+### Added
+- 当有线耳机插入时,按键接听,使用耳机及其麦克风进行对讲
+- 当蓝牙耳机连接时,按键接听,使用蓝牙耳机及其麦克风进行对讲
+> 优先集小于有线耳机
+### Changed
+- 更新Keepalive.aar,去掉背景音乐播放
+- 优化WatchHome2Activity代码
+- 更新高分辨率的图标LOGO
+- 优化换班列表展示
+### Removed
+- 删除 home 模块中的 KeepAcitivity 相关
+
+---
 ## [1.0.13] version 13 - 2020-07-09
 ### Added
 - 监听蓝牙耳机按键播放和暂停,来接听对讲

TEMPAT SAMPAH
resource/src/main/res/mipmap-xxhdpi/launcher.png


TEMPAT SAMPAH
resource/src/main/res/mipmap-xxxhdpi/launcher.png


+ 17 - 0
rtc-chat/src/main/java/com/wdkl/skywebrtc/AVEngine.java

@@ -193,4 +193,21 @@ public class AVEngine implements IEngine {
         iEngine.release();
     }
 
+    @Override
+    public void toggleBluetooth() {
+        if (iEngine == null) {
+            return;
+        }
+        Log.d(TAG,"toggleBluetooth");
+        iEngine.toggleBluetooth();
+    }
+
+    @Override
+    public boolean isHeadphonesPlugged(){
+        if (iEngine == null) {
+            return false;
+        }
+        Log.d(TAG,"isHeadphonesPlugged");
+        return iEngine.isHeadphonesPlugged();
+    }
 }

+ 8 - 1
rtc-chat/src/main/java/com/wdkl/skywebrtc/CallSession.java

@@ -180,11 +180,18 @@ public class CallSession implements EngineCallback {
         return iEngine.toggleSpeaker(enable);
     }
 
-    // 设置扬声器
+    public boolean isHeadphonesPlugged(){
+        return iEngine.isHeadphonesPlugged();
+    }
+    // 设置耳机
     public boolean toggleHeadset(boolean isHeadset) {
         return iEngine.toggleHeadset(isHeadset);
     }
 
+    public void toggleBluetooth(){
+        iEngine.toggleBluetooth();
+    }
+
     // 切换到语音通话
     public void switchToAudio() {
         mIsAudioOnly = true;

+ 2 - 0
rtc-chat/src/main/java/com/wdkl/skywebrtc/engine/IEngine.java

@@ -118,4 +118,6 @@ public interface IEngine {
      */
     void release();
 
+    void toggleBluetooth();
+    boolean isHeadphonesPlugged();
 }

+ 36 - 41
rtc-chat/src/main/java/com/wdkl/skywebrtc/engine/webrtc/WebRTCEngine.java

@@ -133,22 +133,15 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
             mCallback.joinRoomSucc();
         }
 
-        /*if (isHeadphonesPlugged()) {
+        if (isHeadphonesPlugged()) {
             toggleHeadset(true);
         } else {
-            if (mIsAudioOnly)
-                toggleSpeaker(false);
-            else {
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-                    audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
-                } else {
-                    audioManager.setMode(AudioManager.MODE_IN_CALL);
-                }
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
+            } else {
+                audioManager.setMode(AudioManager.MODE_IN_CALL);
             }
-        }*/
-
-        toggleSpeaker(true);
-        audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
+        }
     }
 
     @Override
@@ -375,6 +368,23 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
         return isBluetoothHeadsetConnected;
     }
 
+    public void toggleBluetooth(){
+        if (audioManager != null) {
+            audioManager.setStreamVolume(
+                    AudioManager.STREAM_MUSIC,
+                    audioManager.getStreamVolume(AudioManager.STREAM_MUSIC),
+                    AudioManager.FX_KEY_CLICK
+            );
+            audioManager.setSpeakerphoneOn(false);
+
+            audioManager.startBluetoothSco();
+            audioManager.setBluetoothScoOn(true);
+
+            audioFocusManager = new AudioFocusManager(audioManager);
+            audioFocusManager.requestFocus();
+        }
+    }
+
     AudioFocusManager audioFocusManager;
     @Override
     public boolean toggleSpeaker(boolean enable) {
@@ -384,7 +394,7 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
             if (audioToBluetoothDevice()){
                 audioManager.setStreamVolume(
                         AudioManager.STREAM_MUSIC,
-                        audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL),
+                        audioManager.getStreamVolume(AudioManager.STREAM_MUSIC),
                         AudioManager.FX_KEY_CLICK
                 );
                 audioManager.setSpeakerphoneOn(false);
@@ -396,8 +406,8 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
                 audioFocusManager.requestFocus();
             } else {
                 if (enable) {
-                    audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,
-                            audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL),
+                    audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
+                            audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
                             AudioManager.FX_KEY_CLICK);
                     audioManager.setSpeakerphoneOn(true);
                 } else {
@@ -411,8 +421,8 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
                     }
                     //设置音量,解决有些机型切换后没声音或者声音突然变大的问题
                     audioManager.setStreamVolume(
-                            AudioManager.STREAM_VOICE_CALL,
-                            audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL),
+                            AudioManager.STREAM_MUSIC,
+                            audioManager.getStreamVolume(AudioManager.STREAM_MUSIC),
                             AudioManager.FX_KEY_CLICK
                     );
                     audioManager.setSpeakerphoneOn(false);
@@ -446,7 +456,7 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
         return false;
     }
 
-    private boolean isHeadphonesPlugged() {
+    public boolean isHeadphonesPlugged() {
         if (audioManager == null) {
             return false;
         }
@@ -468,6 +478,13 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
     public void release() {
         if (audioManager != null) {
             audioManager.setMode(AudioManager.MODE_NORMAL);
+
+            if (audioToBluetoothDevice()) {
+                audioManager.stopBluetoothSco();
+                audioManager.setBluetoothScoOn(false);
+            }
+        }
+        if (audioFocusManager!=null){
             audioFocusManager.releaseAudioFocus();
         }
         // 清空peer
@@ -496,28 +513,6 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
     }
 
     // -----------------------------其他方法--------------------------------
-
-//    private void initIceServer() {
-//        // 初始化一些stun和turn的地址
-//        PeerConnection.IceServer var1 = PeerConnection.IceServer.builder("stun:stun.l.google.com:19302")
-//                .createIceServer();
-//        iceServers.add(var1);
-//
-//        PeerConnection.IceServer var11 = PeerConnection.IceServer.builder("stun:172.28.100.100:3478?transport=udp")
-//                .createIceServer();
-//        PeerConnection.IceServer var12 = PeerConnection.IceServer.builder("turn:172.28.100.100:3478?transport=udp")
-//                .setUsername("ddssingsong")
-//                .setPassword("123456")
-//                .createIceServer();
-//        PeerConnection.IceServer var13 = PeerConnection.IceServer.builder("turn:172.28.100.100:3478?transport=tcp")
-//                .setUsername("ddssingsong")
-//                .setPassword("123456")
-//                .createIceServer();
-//        iceServers.add(var11);
-//        iceServers.add(var12);
-//        iceServers.add(var13);
-//    }
-
     private void initIceServer() {
         // 初始化一些stun和turn的地址
 //        PeerConnection.IceServer var1 = PeerConnection.IceServer.builder("stun:stun.l.google.com:19302")