浏览代码

尝试蓝牙耳机接听按键

allen 4 年之前
父节点
当前提交
f602819b0c

+ 2 - 0
app/src/main/AndroidManifest.xml

@@ -4,6 +4,8 @@
           package="com.wdkl.app.ncs">
           package="com.wdkl.app.ncs">
     <uses-permission android:name="android.permission.BLUETOOTH"/>
     <uses-permission android:name="android.permission.BLUETOOTH"/>
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
+    <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"
+        tools:ignore="ProtectedPermissions" />
     <uses-permission android:name="android.permission.INTERNET"/>
     <uses-permission android:name="android.permission.INTERNET"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

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

@@ -3,6 +3,10 @@
     xmlns:tools="http://schemas.android.com/tools"
     xmlns:tools="http://schemas.android.com/tools"
     package="com.wdkl.ncs.android.component.home">
     package="com.wdkl.ncs.android.component.home">
 
 
+    <uses-permission android:name="android.permission.BLUETOOTH"/>
+    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
+    <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"
+        tools:ignore="ProtectedPermissions" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
@@ -34,12 +38,12 @@
                 <action android:name="com.wdkl.ncs.android.component.home.service.TcpHandleService" />
                 <action android:name="com.wdkl.ncs.android.component.home.service.TcpHandleService" />
             </intent-filter>
             </intent-filter>
         </service>
         </service>
-        <receiver android:name=".broadcast.MyMediaButtonReceiver">
-            <intent-filter>
-                <action android:name="android.intent.action.MEDIA_BUTTON" />
-                <action android:name="android.media.AUDIO.BECOMING_NOISY" />
-            </intent-filter>
-        </receiver>
+<!--        <receiver android:name=".broadcast.MyMediaButtonReceiver">-->
+<!--            <intent-filter>-->
+<!--                <action android:name="android.intent.action.MEDIA_BUTTON" />-->
+<!--                <action android:name="android.media.AUDIO.BECOMING_NOISY" />-->
+<!--            </intent-filter>-->
+<!--        </receiver>-->
     </application>
     </application>
 
 
 </manifest>
 </manifest>

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

@@ -7,10 +7,12 @@ import android.content.Intent
 import android.content.IntentFilter
 import android.content.IntentFilter
 import android.content.pm.PackageManager
 import android.content.pm.PackageManager
 import android.graphics.Color
 import android.graphics.Color
+import android.media.session.MediaSession
 import android.net.wifi.WifiManager
 import android.net.wifi.WifiManager
 import android.provider.Settings
 import android.provider.Settings
 import android.support.v4.app.ActivityCompat
 import android.support.v4.app.ActivityCompat
 import android.support.v4.content.ContextCompat
 import android.support.v4.content.ContextCompat
+import android.support.v4.media.session.MediaSessionCompat
 import android.telephony.PhoneStateListener
 import android.telephony.PhoneStateListener
 import android.telephony.SignalStrength
 import android.telephony.SignalStrength
 import android.telephony.TelephonyManager
 import android.telephony.TelephonyManager
@@ -158,9 +160,9 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         intentFilter.addAction(WifiManager.RSSI_CHANGED_ACTION)
         intentFilter.addAction(WifiManager.RSSI_CHANGED_ACTION)
         registerReceiver(wifiReceiver, intentFilter)
         registerReceiver(wifiReceiver, intentFilter)
 
 
-        myMediaButtonReceiver = MyMediaButtonReceiver()
-        val ittFilterButton = IntentFilter(Intent.ACTION_MEDIA_BUTTON) //控制键
-        registerReceiver(myMediaButtonReceiver, ittFilterButton);
+//        myMediaButtonReceiver = MyMediaButtonReceiver()
+//        val ittFilterButton = IntentFilter(Intent.ACTION_MEDIA_BUTTON) //控制键
+//        registerReceiver(myMediaButtonReceiver, ittFilterButton);
 
 
 //        val ittFilterBluetooth = IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED)  //蓝牙断开
 //        val ittFilterBluetooth = IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED)  //蓝牙断开
 //        registerReceiver(myMediaButtonReceiver, ittFilterBluetooth);
 //        registerReceiver(myMediaButtonReceiver, ittFilterBluetooth);
@@ -172,6 +174,18 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         registerReceiver(batteryBroadcastReceiver, intentFilter2)
         registerReceiver(batteryBroadcastReceiver, intentFilter2)
     }
     }
 
 
+    private fun releaseReceiver(){
+        if (wifiReceiver != null){
+            unregisterReceiver(wifiReceiver)
+        }
+        if (batteryBroadcastReceiver != null) {
+            unregisterReceiver(batteryBroadcastReceiver)
+        }
+//        if (myMediaButtonReceiver != null ){
+//            unregisterReceiver(myMediaButtonReceiver)
+//        }
+    }
+
     /**
     /**
      * 返回的tcp信息
      * 返回的tcp信息
      */
      */
@@ -248,6 +262,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                 watch_role_name_tv.text = Constants.userRoleName
                 watch_role_name_tv.text = Constants.userRoleName
             }
             }
         }
         }
+
         showMessage("初始化完成")
         showMessage("初始化完成")
     }
     }
 
 
@@ -339,15 +354,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         //注销webRTC
         //注销webRTC
         SocketManager.getInstance().unConnect()
         SocketManager.getInstance().unConnect()
 
 
-        if (wifiReceiver != null){
-            unregisterReceiver(wifiReceiver)
-        }
-        if (batteryBroadcastReceiver != null) {
-            unregisterReceiver(batteryBroadcastReceiver)
-        }
-        if (myMediaButtonReceiver != null ){
-            unregisterReceiver(myMediaButtonReceiver)
-        }
+        releaseReceiver()
     }
     }
 
 
     /**
     /**

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

@@ -5,10 +5,13 @@ import android.content.ComponentName
 import android.content.Context
 import android.content.Context
 import android.content.Intent
 import android.content.Intent
 import android.media.AudioManager
 import android.media.AudioManager
+import android.media.session.MediaSession
 import android.os.Bundle
 import android.os.Bundle
 import android.os.CountDownTimer
 import android.os.CountDownTimer
 import android.os.VibrationEffect
 import android.os.VibrationEffect
 import android.os.Vibrator
 import android.os.Vibrator
+import android.support.v4.media.session.MediaSessionCompat
+import android.text.TextUtils
 import android.util.Log
 import android.util.Log
 import android.view.KeyEvent
 import android.view.KeyEvent
 import android.view.View
 import android.view.View
@@ -88,45 +91,6 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
         change_over_relayout.setOnClickListener(this)
         change_over_relayout.setOnClickListener(this)
         hang_up_imagev.setOnClickListener(this)
         hang_up_imagev.setOnClickListener(this)
         call_the_voice_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() {
     override fun onStart() {
@@ -175,6 +139,7 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
 
 
     fun answerCall(){
     fun answerCall(){
 //        asyncPlayer.stop()
 //        asyncPlayer.stop()
+        DeviceChannel.calling = true
         isAnswerOrHangUp = true
         isAnswerOrHangUp = true
         MediaPlayHelper.getInstance().stopMusic()
         MediaPlayHelper.getInstance().stopMusic()
         countDownTimer?.cancel()
         countDownTimer?.cancel()
@@ -201,6 +166,7 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
 
 
             override fun onFinish() {
             override fun onFinish() {
                 if (isAnswerOrHangUp) return
                 if (isAnswerOrHangUp) return
+                DeviceChannel.calling = false
                 Log.i(TAG, "时间到 转发了")
                 Log.i(TAG, "时间到 转发了")
                 MediaPlayHelper.getInstance().stopMusic()
                 MediaPlayHelper.getInstance().stopMusic()
                 //todo 给服务器发送转接 tcp
                 //todo 给服务器发送转接 tcp
@@ -233,15 +199,6 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
         }
         }
     }
     }
 
 
-    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
-        Log.i(TAG, "keydown keyCode " + keyCode)
-        if (keyCode == 24) {
-            answerCall()
-            return true
-        }
-        return super.onKeyDown(keyCode, event)
-    }
-
     @Subscribe(threadMode = ThreadMode.MAIN)
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun onMoonEvent(messageEvent: MessageEvent) {
     fun onMoonEvent(messageEvent: MessageEvent) {
         if (messageEvent.tag == 2) {
         if (messageEvent.tag == 2) {
@@ -252,6 +209,7 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
                 countDownTimer?.cancel()
                 countDownTimer?.cancel()
                 MediaPlayHelper.getInstance().stopMusic()
                 MediaPlayHelper.getInstance().stopMusic()
                 mVibrator.cancel()
                 mVibrator.cancel()
+                DeviceChannel.calling = false
 //                asyncPlayer.stop()
 //                asyncPlayer.stop()
                 finish()
                 finish()
             }
             }
@@ -262,11 +220,12 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
 
 
     override fun onDestroy() {
     override fun onDestroy() {
         super.onDestroy()
         super.onDestroy()
-        DeviceChannel.calling = false
+
         isAnswerOrHangUp = false
         isAnswerOrHangUp = false
         if (countDownTimer != null) {
         if (countDownTimer != null) {
             countDownTimer?.cancel()
             countDownTimer?.cancel()
         }
         }
+
 //        asyncPlayer.stop()
 //        asyncPlayer.stop()
         MediaPlayHelper.getInstance().stopMusic()
         MediaPlayHelper.getInstance().stopMusic()
         mVibrator.cancel()
         mVibrator.cancel()

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

@@ -1,19 +1,32 @@
 package com.wdkl.ncs.android.component.home.util;
 package com.wdkl.ncs.android.component.home.util;
 
 
+import android.content.Intent;
 import android.media.AudioManager;
 import android.media.AudioManager;
 import android.media.MediaPlayer;
 import android.media.MediaPlayer;
 import android.os.Handler;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.HandlerThread;
 import android.os.Message;
 import android.os.Message;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.KeyEvent;
 
 
+import com.wdkl.ncs.android.component.nursehome.common.Constants;
 import com.wdkl.ncs.android.lib.base.BaseApplication;
 import com.wdkl.ncs.android.lib.base.BaseApplication;
+import com.wdkl.ncs.android.middleware.utils.MessageEvent;
+import com.wdkl.skywebrtc.engine.AudioFocusManager;
+
+import org.greenrobot.eventbus.EventBus;
 
 
 public class MediaPlayHelper {
 public class MediaPlayHelper {
+    private static String TAG = MediaPlayHelper.class.getCanonicalName();
 
 
     private static MediaPlayHelper sInstance = null;
     private static MediaPlayHelper sInstance = null;
     private MediaPlayer mediaPlayer;
     private MediaPlayer mediaPlayer;
     private HandlerThread playHandlerThread;
     private HandlerThread playHandlerThread;
     private Handler playHandler;
     private Handler playHandler;
+    private MediaSessionCompat mediaSessionCompat;
+    private AudioFocusManager audioFocusManager;
 
 
     private int mResId;
     private int mResId;
     private String mUrl;
     private String mUrl;
@@ -40,6 +53,7 @@ public class MediaPlayHelper {
 
 
     private MediaPlayHelper() {
     private MediaPlayHelper() {
         createHandlerThread();
         createHandlerThread();
+        audioFocusManager = new AudioFocusManager(BaseApplication.appContext);
     }
     }
 
 
     public static MediaPlayHelper getInstance() {
     public static MediaPlayHelper getInstance() {
@@ -129,9 +143,11 @@ public class MediaPlayHelper {
                 public boolean onError(MediaPlayer player, int what, int extra) {
                 public boolean onError(MediaPlayer player, int what, int extra) {
                     //playMusicError();
                     //playMusicError();
                     stopMusicNow();
                     stopMusicNow();
+                    releaseMediaSession();
                     return false;
                     return false;
                 }
                 }
             });
             });
+            initMediaSession();
         } catch (Exception e) {
         } catch (Exception e) {
             //playMusicError();
             //playMusicError();
             e.printStackTrace();
             e.printStackTrace();
@@ -193,6 +209,7 @@ public class MediaPlayHelper {
             }
             }
         }
         }
         mediaPlayer = null;
         mediaPlayer = null;
+        releaseMediaSession();
     }
     }
 
 
     private void releaseMediaNow() {
     private void releaseMediaNow() {
@@ -207,6 +224,7 @@ public class MediaPlayHelper {
             }
             }
         }
         }
         mediaPlayer = null;
         mediaPlayer = null;
+        releaseMediaSession();
     }
     }
 
 
     public boolean isMediaPlaying() {
     public boolean isMediaPlaying() {
@@ -215,4 +233,51 @@ public class MediaPlayHelper {
         }
         }
         return false;
         return false;
     }
     }
+
+    private void initMediaSession(){
+        if (mediaSessionCompat!=null){
+            releaseMediaSession();
+        }
+
+        audioFocusManager.requestFocus();
+
+        mediaSessionCompat = new MediaSessionCompat(BaseApplication.appContext,TAG);
+        mediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS);
+        mediaSessionCompat.setActive(true);
+        mediaSessionCompat.setCallback(new MediaSessionCompat.Callback(){
+            @Override
+            public boolean onMediaButtonEvent(Intent intent) {
+                String action = intent.getAction();
+                if (action != null) {
+                    if (TextUtils.equals(action, Intent.ACTION_MEDIA_BUTTON)) {
+                        KeyEvent keyEvent = intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
+                        if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
+                            Integer keyCode = keyEvent.getKeyCode();
+                            Log.i(TAG, "mediasession keycode " + keyCode);
+                            switch (keyCode) {
+                                case KeyEvent.KEYCODE_MEDIA_PLAY:
+                                case KeyEvent.KEYCODE_MEDIA_PAUSE:
+//                                    EventBus.getDefault().post(new MessageEvent(1, Constants.EVENT_BLUETOOTH_ACCEPT_CALL));
+                                    break;
+                                default:
+                                    break;
+                            }
+                        }
+                    }
+                }
+                return super.onMediaButtonEvent(intent);
+            }
+        });
+    }
+
+    private void releaseMediaSession(){
+        if (mediaSessionCompat!=null){
+            mediaSessionCompat.setCallback(null);
+            mediaSessionCompat.setActive(false);
+            mediaSessionCompat.release();
+            mediaSessionCompat = null;
+
+            audioFocusManager.releaseAudioFocus();
+        }
+    }
 }
 }

+ 100 - 0
rtc-chat/src/main/java/com/wdkl/skywebrtc/engine/AudioFocusManager.java

@@ -0,0 +1,100 @@
+package com.wdkl.skywebrtc.engine;
+
+import android.content.Context;
+import android.media.AudioAttributes;
+import android.media.AudioFocusRequest;
+import android.media.AudioManager;
+import android.os.Build;
+import android.util.Log;
+
+public class AudioFocusManager implements AudioManager.OnAudioFocusChangeListener {
+    private static String TAG = AudioFocusManager.class.getCanonicalName();
+
+    private AudioManager mAudioManager;
+    private AudioFocusRequest mFocusRequest;
+    private AudioAttributes mAudioAttributes;
+
+    private onRequestFocusResultListener mOnRequestFocusResultListener;
+    private OnAudioFocusChangeListener mAudioFocusChangeListener;
+
+    public AudioFocusManager(Context context) {
+        mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+    }
+
+    public AudioFocusManager(AudioManager audioManager){
+        mAudioManager = audioManager;
+    }
+
+    /**
+     * Request audio focus.
+     */
+    public void requestFocus() {
+        int result;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            if (mFocusRequest == null) {
+                if (mAudioAttributes == null) {
+                    mAudioAttributes = new AudioAttributes.Builder()
+                            .setUsage(AudioAttributes.USAGE_MEDIA)
+                            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
+                            .build();
+                }
+                mFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
+                        .setAudioAttributes(mAudioAttributes)
+                        .setWillPauseWhenDucked(true)
+                        .setOnAudioFocusChangeListener(this)
+                        .build();
+            }
+            result = mAudioManager.requestAudioFocus(mFocusRequest);
+        } else {
+            result = mAudioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
+        }
+        if (mOnRequestFocusResultListener != null) {
+            mOnRequestFocusResultListener.onHandleResult(result);
+        }
+    }
+
+
+    @Override
+    public void onAudioFocusChange(int focusChange) {
+        Log.i(TAG,"onAudioFocusChange focusChange");
+        if (mAudioFocusChangeListener != null) {
+            mAudioFocusChangeListener.onAudioFocusChange(focusChange);
+        }
+    }
+
+    /**
+     * Release audio focus.
+     */
+    public void releaseAudioFocus() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            mAudioManager.abandonAudioFocusRequest(mFocusRequest);
+        } else {
+            mAudioManager.abandonAudioFocus(this);
+        }
+    }
+
+    /**
+     * Handle the result of audio focus.
+     */
+    public interface onRequestFocusResultListener {
+        void onHandleResult(int result);
+    }
+
+
+    public void setOnHandleResultListener(onRequestFocusResultListener listener) {
+        mOnRequestFocusResultListener = listener;
+    }
+
+
+    /**
+     * Same as AudioManager.OnAudioFocusChangeListener.
+     */
+    public interface OnAudioFocusChangeListener {
+        void onAudioFocusChange(int focusChange);
+    }
+
+
+    public void setOnAudioFocusChangeListener(OnAudioFocusChangeListener listener) {
+        mAudioFocusChangeListener = listener;
+    }
+}

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

@@ -15,6 +15,7 @@ import android.util.Log;
 import android.view.View;
 import android.view.View;
 
 
 import com.wdkl.skywebrtc.EnumType;
 import com.wdkl.skywebrtc.EnumType;
+import com.wdkl.skywebrtc.engine.AudioFocusManager;
 import com.wdkl.skywebrtc.engine.EngineCallback;
 import com.wdkl.skywebrtc.engine.EngineCallback;
 import com.wdkl.skywebrtc.engine.IEngine;
 import com.wdkl.skywebrtc.engine.IEngine;
 import com.wdkl.skywebrtc.render.ProxyVideoSink;
 import com.wdkl.skywebrtc.render.ProxyVideoSink;
@@ -374,6 +375,7 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
         return isBluetoothHeadsetConnected;
         return isBluetoothHeadsetConnected;
     }
     }
 
 
+    AudioFocusManager audioFocusManager;
     @Override
     @Override
     public boolean toggleSpeaker(boolean enable) {
     public boolean toggleSpeaker(boolean enable) {
         if (audioManager != null) {
         if (audioManager != null) {
@@ -389,6 +391,9 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
 
 
                 audioManager.startBluetoothSco();
                 audioManager.startBluetoothSco();
                 audioManager.setBluetoothScoOn(true);
                 audioManager.setBluetoothScoOn(true);
+
+                audioFocusManager = new AudioFocusManager(audioManager);
+                audioFocusManager.requestFocus();
             } else {
             } else {
                 if (enable) {
                 if (enable) {
                     audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,
                     audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,
@@ -463,6 +468,7 @@ public class WebRTCEngine implements IEngine, Peer.IPeerEvent {
     public void release() {
     public void release() {
         if (audioManager != null) {
         if (audioManager != null) {
             audioManager.setMode(AudioManager.MODE_NORMAL);
             audioManager.setMode(AudioManager.MODE_NORMAL);
+            audioFocusManager.releaseAudioFocus();
         }
         }
         // 清空peer
         // 清空peer
         if (peers != null) {
         if (peers != null) {