Explorar o código

## [1.0.13] version 13 - 2020-07-09
### Added
- 监听蓝牙耳机按键播放和暂停,来接听对讲

allen %!s(int64=4) %!d(string=hai) anos
pai
achega
1c6dd1912d

+ 0 - 1
WebRTC/src/main/java/com/wdkl/core/voip/AsyncPlayer.java

@@ -75,7 +75,6 @@ public class AsyncPlayer {
                         startSound(cmd);
                         break;
                     case STOP:
-
                         if (mPlayer != null) {
                             mPlayer.stop();
                             mPlayer.release();

+ 2 - 2
build.gradle

@@ -47,12 +47,12 @@ buildscript {
     /**
      * APP版本码
      */
-    ext.app_version_code = 12
+    ext.app_version_code = 13
 
     /**
      * APP版本号
      */
-    ext.app_version = "1.0.12"
+    ext.app_version = "1.0.13"
 
     /**
      * 项目依赖库

+ 6 - 0
home/src/main/AndroidManifest.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="com.wdkl.ncs.android.component.home">
 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -34,6 +35,11 @@
                 <action android:name="com.wdkl.ncs.android.component.home.service.TcpHandleService" />
             </intent-filter>
         </service>
+        <receiver android:name=".broadcast.MyMediaButtonReceiver">
+            <intent-filter>
+                <action android:name="android.intent.action.MEDIA_BUTTON" />
+            </intent-filter>
+        </receiver>
     </application>
 
 </manifest>

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

@@ -249,6 +249,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
             Constants.tcpServer = tcpSeverDTO.publicIp
             Constants.tcpPort = tcpSeverDTO.tcpPort
             Constants.heartBeat = tcpSeverDTO.readerIdleTime
+            tv_server_ip.text = tcpSeverDTO.publicIp
 
             startConnectTcpServer()
 //            showMessage("开始连接TCP服务器...")

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

@@ -64,6 +64,7 @@ class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
         if (!EventBus.getDefault().isRegistered(this)) {
             EventBus.getDefault().register(this)
         }
+        MediaPlayHelper.getInstance().stopMusic()
         initCountDownTimer()
         countDownTimer.start()
 

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

@@ -1,8 +1,10 @@
 package com.wdkl.ncs.android.component.home.activity
 
 import android.app.Activity
+import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
+import android.media.AudioManager
 import android.os.Bundle
 import android.os.CountDownTimer
 import android.os.VibrationEffect
@@ -11,7 +13,9 @@ import android.util.Log
 import android.view.KeyEvent
 import android.view.View
 import com.google.gson.Gson
+import com.wdkl.core.voip.AsyncPlayer
 import com.wdkl.ncs.android.component.home.R
+import com.wdkl.ncs.android.component.home.broadcast.MyMediaButtonReceiver
 import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.home.util.MediaPlayHelper
 import com.wdkl.ncs.android.component.nursehome.common.Constants
@@ -38,6 +42,7 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
     private var countdownTime = 15//默认转接时间
     private var isAnswerOrHangUp = false//加一个变量防止在最后一秒点击了接听或者挂断 还是会转发出去
     lateinit var mVibrator: Vibrator
+//    lateinit var asyncPlayer: AsyncPlayer
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -71,6 +76,8 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
             // 是护士才开启自动转接
             countDownTimer?.start()
         }
+//        asyncPlayer = AsyncPlayer(TAG)
+//        asyncPlayer.play(this,R.raw.incoming_call,true, AudioManager.STREAM_MUSIC)
         MediaPlayHelper.getInstance().playResMusic(R.raw.incoming_call, 1.0f, true)
     }
 
@@ -81,6 +88,45 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
         change_over_relayout.setOnClickListener(this)
         hang_up_imagev.setOnClickListener(this)
         call_the_voice_imagev.setOnClickListener(this)
+
+        /*
+        val mbr = ComponentName(packageName, MediaButtonReceiver::class.java.getName())
+        val mMediaSession = MediaSessionCompat(this, "mbr", mbr, null)
+        //一定要设置
+        mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS or
+                MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS)
+        if (!mMediaSession.isActive()) {
+            mMediaSession.setActive(true)
+        }
+
+        mMediaSession.setCallback(object : MediaSessionCompat.Callback() {
+            override fun onMediaButtonEvent(intent: Intent): Boolean {
+                val action = intent.action
+                if (action != null) {
+                    if (TextUtils.equals(action, Intent.ACTION_MEDIA_BUTTON)) {
+                        val keyEvent: KeyEvent = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT)
+                        if (keyEvent != null) {
+                            if (keyEvent.getAction() === KeyEvent.ACTION_DOWN) {
+                                val keyCode: Int = keyEvent.getKeyCode()
+                                Log.i(TAG, "keycode " + keyCode)
+                                when (keyCode) {
+                                    KeyEvent.KEYCODE_MEDIA_PLAY -> {
+                                        answerCall()
+                                    }
+                                    KeyEvent.KEYCODE_MEDIA_PAUSE -> {
+                                        answerCall()
+                                    }
+                                    KeyEvent.KEYCODE_MEDIA_NEXT -> {}
+                                    KeyEvent.KEYCODE_MEDIA_PREVIOUS -> {}
+                                }
+                            }
+                        }
+                    }
+                }
+                return super.onMediaButtonEvent(intent)
+            }
+        })
+         */
     }
 
     override fun onStart() {
@@ -90,7 +136,6 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
         }
     }
 
-
     override fun onClick(p0: View?) {
         when(p0?.id){
             R.id.change_over_relayout ->{
@@ -102,31 +147,19 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
                 val voiceTransferTcpModel = VoiceUtil.voiceTransfer(Integer.parseInt(Constants.deviceId), tcpModel.fromId, interactionVO)
                 TcpClient.getInstance().sendMsg(voiceTransferTcpModel.toJson())
                 mVibrator.cancel()
+//                asyncPlayer.stop()
                 finish()
             }
             R.id.hang_up_imagev ->{
-                acceptCall()
+                rejectCall()
             }
             R.id.call_the_voice_imagev ->{
-                isAnswerOrHangUp = true
-                MediaPlayHelper.getInstance().stopMusic()
-                countDownTimer?.cancel()
-                //给服务器发送接听 tcp
-                val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
-                val voiceUtilTcpModel = VoiceUtil.voiceAccept(Integer.parseInt(Constants.deviceId), tcpModel.fromId, interactionVO.id)
-                TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
-                mVibrator.cancel()
-                val intent = Intent(this, WebRTCVoipAudioActivity::class.java)
-                intent.putExtra("targetId", targetId)
-                intent.putExtra("TcpModel", tcpModel)
-                intent.putExtra(WebRTCVoipAudioActivity().ACTION, WebRTCVoipAudioActivity().CALLING)
-                startActivity(intent)
-                finish()
+                answerCall()
             }
         }
     }
 
-    fun acceptCall(){
+    fun rejectCall(){
         DeviceChannel.calling = false
         isAnswerOrHangUp = true
         MediaPlayHelper.getInstance().stopMusic()
@@ -136,6 +169,25 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
         val voiceUtilTcpModel = VoiceUtil.voiceReject(Integer.parseInt(Constants.deviceId), tcpModel.fromId, interactionVO.id)
         TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
         mVibrator.cancel()
+//        asyncPlayer.stop()
+        finish()
+    }
+
+    fun answerCall(){
+//        asyncPlayer.stop()
+        isAnswerOrHangUp = true
+        MediaPlayHelper.getInstance().stopMusic()
+        countDownTimer?.cancel()
+        //给服务器发送接听 tcp
+        val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+        val voiceUtilTcpModel = VoiceUtil.voiceAccept(Integer.parseInt(Constants.deviceId), tcpModel.fromId, interactionVO.id)
+        TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+        mVibrator.cancel()
+        val intent = Intent(this, WebRTCVoipAudioActivity::class.java)
+        intent.putExtra("targetId", targetId)
+        intent.putExtra("TcpModel", tcpModel)
+        intent.putExtra(WebRTCVoipAudioActivity().ACTION, WebRTCVoipAudioActivity().CALLING)
+        startActivity(intent)
         finish()
     }
 
@@ -156,6 +208,7 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
                 val voiceTransferTcpModel = VoiceUtil.voiceTransfer(Integer.parseInt(Constants.deviceId), tcpModel.fromId, interactionVO)
                 TcpClient.getInstance().sendMsg(voiceTransferTcpModel.toJson())
                 mVibrator.cancel()
+//                asyncPlayer.stop()
                  finish()
             }
         }
@@ -164,13 +217,10 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
 
     override fun onStop() {
         super.onStop()
-
     }
 
 
     override fun onBackPressed() {
-
-
     }
 
     override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
@@ -190,8 +240,6 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun onMoonEvent(messageEvent: MessageEvent) {
-        Log.i(TAG,"收到tcp"+tcpModel!!.action)
-
         if (messageEvent.tag == 2) {
             val tcpModel = messageEvent.getMessage() as TcpModel?
             Log.i(TAG,"收到tcp"+tcpModel!!.action)
@@ -200,8 +248,11 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
                 countDownTimer?.cancel()
                 MediaPlayHelper.getInstance().stopMusic()
                 mVibrator.cancel()
+//                asyncPlayer.stop()
                 finish()
             }
+        } else if (messageEvent.tag == Constants.EVENT_BLUETOOTH_ACCEPT_CALL){
+            answerCall()
         }
     }
 
@@ -212,6 +263,7 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
         if (countDownTimer != null) {
             countDownTimer?.cancel()
         }
+//        asyncPlayer.stop()
         MediaPlayHelper.getInstance().stopMusic()
         mVibrator.cancel()
         EventBus.getDefault().unregister(this)

+ 34 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/broadcast/MyMediaButtonReceiver.kt

@@ -0,0 +1,34 @@
+package com.wdkl.ncs.android.component.home.broadcast
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.util.Log
+import android.view.KeyEvent
+import com.wdkl.ncs.android.component.nursehome.common.Constants
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import org.greenrobot.eventbus.EventBus
+
+class MyMediaButtonReceiver: BroadcastReceiver() {
+    var TAG = "MyMediaButtonReceiver"
+    override fun onReceive(context: Context?, intent: Intent?) {
+        val action = intent!!.action
+        if (action!=null&&action.equals(Intent.ACTION_MEDIA_BUTTON)){
+            var keyEvent = intent!!.getParcelableExtra<KeyEvent>(Intent.EXTRA_KEY_EVENT)
+            if (keyEvent!=null && keyEvent.action == KeyEvent.ACTION_DOWN){
+                val keyCode = keyEvent.keyCode
+                Log.i(TAG, "keyCode " + keyCode)
+                when (keyCode){
+                    KeyEvent.KEYCODE_MEDIA_PLAY -> {
+                        EventBus.getDefault().post(MessageEvent(1,Constants.EVENT_BLUETOOTH_ACCEPT_CALL))
+                        return
+                    }
+                    KeyEvent.KEYCODE_MEDIA_PAUSE -> {
+                        EventBus.getDefault().post(MessageEvent(1,Constants.EVENT_BLUETOOTH_ACCEPT_CALL))
+                        return
+                    }
+                }
+            }
+        }
+    }
+}

+ 3 - 12
home/src/main/code/com/wdkl/ncs/android/component/home/service/TcpHandleService.kt

@@ -6,22 +6,12 @@ import android.os.Binder
 import android.os.IBinder
 import android.util.Log
 import com.google.gson.Gson
-import com.wdkl.ncs.android.component.home.activity.SOSEmergencyCallActivity
-import com.wdkl.ncs.android.component.home.activity.AppUpdateActivity
-import com.wdkl.ncs.android.component.home.activity.WatchEventDetailActivity
-import com.wdkl.ncs.android.component.home.activity.WebRTCVoipAudioActivity
-import com.wdkl.ncs.android.component.home.activity.WebRTCVoipAudioRingingActivity
+import com.wdkl.ncs.android.component.home.activity.*
 import com.wdkl.ncs.android.component.home.util.AppUtils
-import com.wdkl.ncs.android.component.home.util.NetHelper
 import com.wdkl.ncs.android.component.home.util.SpeechUtil
 import com.wdkl.ncs.android.component.home.util.Util
 import com.wdkl.ncs.android.component.nursehome.common.Constants
-import com.wdkl.ncs.android.lib.utils.AppTool
-import com.wdkl.ncs.android.lib.utils.push
-import com.wdkl.ncs.android.lib.utils.weak
 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.dto.TcpModel
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
@@ -30,7 +20,7 @@ import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
-import java.util.*
+
 
 class TcpHandleService : Service(){
     val TAG = TcpHandleService.javaClass.canonicalName
@@ -49,6 +39,7 @@ class TcpHandleService : Service(){
 
     override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
         Log.i("TcpHandleService", "已经启动")
+
         return super.onStartCommand(intent, flags, startId)
     }
 

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

@@ -1,6 +1,7 @@
 package com.wdkl.ncs.android.component.home.util;
 
 import android.content.Context;
+import android.os.Build;
 import android.speech.tts.TextToSpeech;
 import android.speech.tts.UtteranceProgressListener;
 import android.text.TextUtils;
@@ -38,25 +39,47 @@ public class SpeechUtil {
     }
 
     public void init(Context context) {
-        textToSpeech = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
-            @Override
-            public void onInit(int status) {
-                if (status == TextToSpeech.SUCCESS) {
-                    int supported = textToSpeech.setLanguage(Locale.CHINESE);
-                    if ((supported != TextToSpeech.LANG_AVAILABLE) && (supported != TextToSpeech.LANG_COUNTRY_AVAILABLE)) {
-                        Constants.Companion.setTtsState(1);
-                        Log.d(TAG, "onInit: 当前不支持中文");
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+            textToSpeech = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
+                @Override
+                public void onInit(int status) {
+                    if (status == TextToSpeech.SUCCESS) {
+                        int supported = textToSpeech.setLanguage(Locale.CHINESE);
+                        if ((supported != TextToSpeech.LANG_AVAILABLE) && (supported != TextToSpeech.LANG_COUNTRY_AVAILABLE)) {
+                            Constants.Companion.setTtsState(1);
+                            Log.d(TAG, "onInit: 当前不支持中文");
+                        } else {
+                            Constants.Companion.setTtsState(2);
+                            Log.d(TAG, "onInit: 支持中文");
+                        }
+                        Log.d(TAG, "onInit: TTS引擎初始化成功");
                     } else {
-                        Constants.Companion.setTtsState(2);
-                        Log.d(TAG, "onInit: 支持中文");
+                        Constants.Companion.setTtsState(0);
+                        Log.d(TAG, "onInit: TTS引擎初始化失败");
                     }
-                    Log.d(TAG, "onInit: TTS引擎初始化成功");
-                } else {
-                    Constants.Companion.setTtsState(0);
-                    Log.d(TAG, "onInit: TTS引擎初始化失败");
                 }
-            }
-        }, "com.iflytek.speechcloud");
+            }, "com.iflytek.speechcloud");
+        } else {
+            textToSpeech = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
+                @Override
+                public void onInit(int status) {
+                    if (status == TextToSpeech.SUCCESS) {
+                        int supported = textToSpeech.setLanguage(Locale.CHINESE);
+                        if ((supported != TextToSpeech.LANG_AVAILABLE) && (supported != TextToSpeech.LANG_COUNTRY_AVAILABLE)) {
+                            Constants.Companion.setTtsState(1);
+                            Log.d(TAG, "onInit: 当前不支持中文");
+                        } else {
+                            Constants.Companion.setTtsState(2);
+                            Log.d(TAG, "onInit: 支持中文");
+                        }
+                        Log.d(TAG, "onInit: TTS引擎初始化成功");
+                    } else {
+                        Constants.Companion.setTtsState(0);
+                        Log.d(TAG, "onInit: TTS引擎初始化失败");
+                    }
+                }
+            });
+        }
         textToSpeech.setSpeechRate(0.5f);
     }
 

+ 2 - 1
home/src/main/res/layout/watch_activity_register.xml

@@ -15,11 +15,12 @@
         android:orientation="vertical">
 
     <TextView
+        android:id="@+id/tv_server_ip"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginTop="40dp"
         android:textSize="20dp"
-        android:text="注册页面"/>
+        android:text=""/>
     <TextView
         android:id="@+id/tv_mac_addr"
         android:layout_width="match_parent"

+ 2 - 2
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/UrlManager.kt

@@ -55,9 +55,9 @@ private class DevUrlManager : UrlManager{
 
     override val base: String
 //        get() = "http://dev.base.wdklian.com"
-//        get() = "http://8.129.220.143"
+        get() = "http://8.129.220.143"
 //        get() = "http://192.168.1.188"
-      get() = "http://120.76.246.253"
+//      get() = "http://120.76.246.253"
 
     override val device_url: String
 //        get() = "${base}:6005/"

+ 1 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt

@@ -29,6 +29,6 @@ class Constants {
         const val EVENT_USER_CHANGE = 0x77
         const val EVENT_DEVICE_CHANGE = 0x88 //切换设备
         const val EVENT_APP_UPDATE  = 0x13 //app更新
-        const val EVENT_NET_OFF = 0x44 //断网
+        const val EVENT_BLUETOOTH_ACCEPT_CALL = 0x44 //断网
     }
 }

+ 5 - 0
readme.md

@@ -25,6 +25,11 @@
 在发布新版本时,可以直接将Unreleased区块中的内容移动至新发 布版本的描述区块就可以了
 
 ---
+## [1.0.13] version 13 - 2020-07-09
+### Added
+- 监听蓝牙耳机按键播放和暂停,来接听对讲
+---
+
 ## [1.0.12] version 12 - 2020-07-09
 ### Changed
 - SOS置于通话状态中,呼叫时对当前设备做占线处理

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

@@ -382,7 +382,7 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
             if (audioToBluetoothDevice()){
                 audioManager.setStreamVolume(
                         AudioManager.STREAM_MUSIC,
-                        audioManager.getStreamVolume(AudioManager.STREAM_MUSIC),
+                        audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL),
                         AudioManager.FX_KEY_CLICK
                 );
                 audioManager.setSpeakerphoneOn(false);