Commit 11ea3344 authored by sheteng's avatar sheteng

语音房间

parent 1f2ac88d
...@@ -25,6 +25,7 @@ import androidx.navigation.NavController; ...@@ -25,6 +25,7 @@ import androidx.navigation.NavController;
import androidx.navigation.Navigation; import androidx.navigation.Navigation;
import com.ccwangluo.ccim.CCIMClient; import com.ccwangluo.ccim.CCIMClient;
import com.ccwangluo.ccim.listener.AudioRoomListener;
import com.ccwangluo.ccim.listener.ResultEventCallback; import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.im.adapter.ChannelAdapter; import com.ccwangluo.im.adapter.ChannelAdapter;
import com.ccwangluo.im.data.LoginViewModel; import com.ccwangluo.im.data.LoginViewModel;
...@@ -173,15 +174,25 @@ public class NotificationsFragment extends Fragment { ...@@ -173,15 +174,25 @@ public class NotificationsFragment extends Fragment {
binding.joinRoom.setOnClickListener(new View.OnClickListener() { binding.joinRoom.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
CCIMClient.getInstance().joinAudioRoom(getContext(), 1234, new ResultEventCallback<Void>() { CCIMClient.getInstance().joinAudioRoom(getContext(), 62, new AudioRoomListener() {
@Override @Override
public void onSuccess(Void unused) { public void onJoinSuccess() {
ToastUtil.show(getContext(),"加入成功"); ToastUtil.show(getContext(), "onJoinSuccess");
} }
@Override @Override
public void onFailed(int errorCode) { public void onJoinFailed(int code) {
ToastUtil.show(getContext(),"加入失败"); ToastUtil.show(getContext(), "onJoinFailed");
}
@Override
public void onExit() {
ToastUtil.show(getContext(), "onExit");
}
@Override
public void onError(int code) {
ToastUtil.show(getContext(), "onError");
} }
}); });
......
...@@ -13,6 +13,7 @@ import androidx.annotation.NonNull; ...@@ -13,6 +13,7 @@ import androidx.annotation.NonNull;
import com.ccwangluo.ccim.audio.JanusService; import com.ccwangluo.ccim.audio.JanusService;
import com.ccwangluo.ccim.audio.ServiceDelegate; import com.ccwangluo.ccim.audio.ServiceDelegate;
import com.ccwangluo.ccim.listener.AudioRoomListener;
import com.ccwangluo.ccim.listener.OnClientConnectListener; import com.ccwangluo.ccim.listener.OnClientConnectListener;
import com.ccwangluo.ccim.listener.OnConnectListener; import com.ccwangluo.ccim.listener.OnConnectListener;
import com.ccwangluo.ccim.listener.OnPlayAudioCallback; import com.ccwangluo.ccim.listener.OnPlayAudioCallback;
...@@ -675,7 +676,7 @@ public class CCIMClient { ...@@ -675,7 +676,7 @@ public class CCIMClient {
/** /**
* 加入房间 * 加入房间
*/ */
public void joinAudioRoom(Context context, int roomId, ResultEventCallback<Void> callback) { public void joinAudioRoom(Context context, int roomId, AudioRoomListener callback) {
JanusConfImpl conf = new JanusConfImpl(); JanusConfImpl conf = new JanusConfImpl();
conf.url(audioServer); conf.url(audioServer);
conf.plugin(JanusPlugins.VIDEOROOM); conf.plugin(JanusPlugins.VIDEOROOM);
......
package com.ccwangluo.ccim.audio; package com.ccwangluo.ccim.audio;
import android.Manifest; import android.Manifest;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.util.Log; import android.os.Handler;
import android.os.Looper;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.room.Room;
import com.ccwangluo.ccim.CCIMClient;
import com.ccwangluo.ccim.listener.AudioRoomListener;
import com.ccwangluo.ccim.listener.ResultEventCallback; import com.ccwangluo.ccim.listener.ResultEventCallback;
import com.ccwangluo.ccim.modle.User; import com.ccwangluo.ccim.modle.User;
import com.ccwangluo.ccim.util.ErrorCode; import com.ccwangluo.ccim.util.ErrorCode;
...@@ -29,81 +27,83 @@ import com.karumi.dexter.MultiplePermissionsReport; ...@@ -29,81 +27,83 @@ import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken; import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionRequest; import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener; import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
import org.webrtc.AudioTrack;
import org.webrtc.DataChannel; import org.webrtc.DataChannel;
import org.webrtc.EglBase; import org.webrtc.EglBase;
import org.webrtc.VideoTrack; import org.webrtc.Logging;
import org.webrtc.PeerConnection;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.logging.Logger;
public class JanusService extends JanusDelegate { public class JanusService extends JanusDelegate {
private final Logger logger = Logger.getLogger(CCIMClient.class.getName());
private Janus _janus; private Janus _janus;
private EglBase _rootEgl; private EglBase _rootEgl;
private User user; private User user;
private Integer roomId; private Integer roomId;
private Boolean isJoin = false; private Boolean isJoin = false;
private AppRTCAudioManager audioManager; private AudioRoomListener callback;
private ResultEventCallback<Void> callback;
// private AppRTCAudioManager audioManager;
public JanusService(Context context, Integer roomId, User user, ResultEventCallback<Void> callback) { public JanusService(Context context, Integer roomId, User user, AudioRoomListener callback) {
audioManager = AppRTCAudioManager.create(context.getApplicationContext());
this.user = user; this.user = user;
this.roomId = roomId; this.roomId = roomId;
this.callback = callback; this.callback = callback;
} }
public void start(Context context, JanusConfImpl conf) { public void start(Context context, JanusConfImpl conf) {
Dexter.withContext(context).withPermissions(Manifest.permission.RECORD_AUDIO).withListener(new MultiplePermissionsListener() { Dexter.withContext(context).withPermissions(Manifest.permission.RECORD_AUDIO).withListener(new MultiplePermissionsListener() {
@Override @Override
public void onPermissionsChecked(MultiplePermissionsReport report) { public void onPermissionsChecked(MultiplePermissionsReport report) {
JanusFactory factory = new JanusFactory(); JanusFactory factory = new JanusFactory();
_janus = factory.create(conf,JanusService.this , context.getApplicationContext()); _janus = factory.create(conf,JanusService.this , context.getApplicationContext());
Logging.enableLogToDebugOutput(Logging.Severity.LS_VERBOSE);
_rootEgl = factory.rootEgl(); _rootEgl = factory.rootEgl();
_janus.init(); _janus.init();
if (audioManager != null) { // if (audioManager != null) {
audioManager.start((selectedAudioDevice, availableAudioDevices) -> { // audioManager.start((selectedAudioDevice, availableAudioDevices) -> {
//
} // }
); // );
} // }
} }
@Override @Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) { public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
callback.onFailed(ErrorCode.ERROR_PERMISSION_DENIE); callback.onJoinFailed(ErrorCode.ERROR_PERMISSION_DENIE);
} }
}).check(); }).check();
} }
public void stop() { public void stop() {
if (_janus != null) {
this._janus.close(); this._janus.close();
} }
public void hangup() {
this._janus.hangup();
} }
@Override @Override
public void onClose() { public void onClose() {
if (audioManager != null) { logger.info("close");
audioManager.stop(); // if (audioManager != null) {
} // audioManager.stop();
// }
} }
@Override @Override
public void onError(JanusError error, Bundle context) { public void onError(JanusError error, Bundle context) {
logger.info("onError " + error.toString());
callback.onError(ErrorCode.ERRORCODE_NOT_EXISTS);
} }
@Override @Override
public void onReady() { public void onReady() {
logger.info("onReady");
Bundle payload = Bundle.create(); Bundle payload = Bundle.create();
payload.setInt("room", roomId); payload.setInt("room", roomId);
payload.setString("display", new Gson().toJson(user)); payload.setString("display", new Gson().toJson(user));
...@@ -124,6 +124,30 @@ public class JanusService extends JanusDelegate { ...@@ -124,6 +124,30 @@ public class JanusService extends JanusDelegate {
public void onDatachannelMessage(DataChannel.Buffer buffer) { public void onDatachannelMessage(DataChannel.Buffer buffer) {
} }
private State state = State.INIT;
@Override
public void onIceConnectionChange(PeerConnection.IceConnectionState iceConnectionState) {
logger.info("onIceConnectionChange");
if (iceConnectionState == PeerConnection.IceConnectionState.DISCONNECTED) {
stop();
state = State.DISCONNECTED;
callback.onError(ErrorCode.NET_ERROR);
new Handler(Looper.getMainLooper()).postDelayed(() -> {
if (state != State.DISCONNECTED) {
return;
}
_janus.dispatch(JanusCommands.FORCE_DESTROY, Bundle.create());
}, 5000);
}
}
private enum State {
INIT,
STARTED,
DISCONNECTED,
STOPPED
}
@Override @Override
public String onOffer(String sdp) { public String onOffer(String sdp) {
...@@ -138,10 +162,12 @@ public class JanusService extends JanusDelegate { ...@@ -138,10 +162,12 @@ public class JanusService extends JanusDelegate {
@Override @Override
public void onEvent(JanusEvent event, Bundle context) { public void onEvent(JanusEvent event, Bundle context) {
JanusData data = event.data(); JanusData data = event.data();
logger.info("onEvent " + data.getString("janus",""));
logger.info("onEvent " + data.getString("videoroom",""));
if (data.getString("janus", "").equals("error") && context.getString("command", "").equals(JanusCommands.JOIN)) { if (data.getString("janus", "").equals("error") && context.getString("command", "").equals(JanusCommands.JOIN)) {
System.out.println("加入失败"); logger.info("加入失败");
if (callback!= null) { if (callback!= null) {
callback.onFailed(ErrorCode.JOIN_AUDIO_FAILED); callback.onJoinFailed(ErrorCode.JOIN_AUDIO_FAILED);
} }
return; return;
} }
...@@ -154,12 +180,12 @@ public class JanusService extends JanusDelegate { ...@@ -154,12 +180,12 @@ public class JanusService extends JanusDelegate {
payload.setBool("video", false); payload.setBool("video", false);
payload.setBool("data", false); payload.setBool("data", false);
this._janus.dispatch(JanusCommands.PUBLISH, payload); this._janus.dispatch(JanusCommands.PUBLISH, payload);
System.out.println("加入成功"); logger.info("加入成功");
List<JanusData> publishers = data.getList("publishers"); // List<JanusData> publishers = data.getList("publishers");
subscribePublishers(publishers); // subscribePublishers(publishers);
if (callback!= null) { // if (callback!= null) {
callback.onSuccess(null); // callback.onJoinSuccess();
} // }
} }
return; return;
} }
...@@ -188,4 +214,5 @@ public class JanusService extends JanusDelegate { ...@@ -188,4 +214,5 @@ public class JanusService extends JanusDelegate {
} }
} }
package com.ccwangluo.ccim.listener;
public interface AudioRoomListener {
void onJoinSuccess();
void onJoinFailed(int code);
void onExit();
void onError(int code);
}
...@@ -17,5 +17,6 @@ public class ErrorCode { ...@@ -17,5 +17,6 @@ public class ErrorCode {
public static final int START_VOICE_FAILED = 911; //录音创建失败 public static final int START_VOICE_FAILED = 911; //录音创建失败
public static final int ERROR_PERMISSION_DENIE = 912; //权限拒绝 public static final int ERROR_PERMISSION_DENIE = 912; //权限拒绝
public static final int JOIN_AUDIO_FAILED = 913; //加入语音失败 public static final int JOIN_AUDIO_FAILED = 913; //加入语音失败
public static final int SYSTEM_ERROR = 914; //未知错误
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment