[+] 拍照、录像控制
This commit is contained in:
@@ -4,7 +4,9 @@ import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
import android.media.projection.MediaProjectionManager;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
@@ -29,6 +31,7 @@ import com.acgist.taoyao.client.signal.Taoyao;
|
||||
import com.acgist.taoyao.media.MediaManager;
|
||||
import com.acgist.taoyao.media.VideoSourceType;
|
||||
import com.acgist.taoyao.media.config.Config;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.stream.Stream;
|
||||
@@ -180,7 +183,7 @@ public class MainActivity extends AppCompatActivity implements Serializable {
|
||||
}
|
||||
this.threadHandler.post(() -> {
|
||||
// 进入房间
|
||||
Taoyao.taoyao.roomEnter("4f19f6fc-1763-499b-a352-d8c955af5a6e", null);
|
||||
// Taoyao.taoyao.roomEnter("4f19f6fc-1763-499b-a352-d8c955af5a6e", null);
|
||||
// Taoyao.taoyao.sessionCall("taoyao");
|
||||
});
|
||||
}
|
||||
@@ -216,6 +219,7 @@ public class MainActivity extends AppCompatActivity implements Serializable {
|
||||
Log.d(MainHandler.class.getSimpleName(), "Handler消息:" + message.what + " - " + message.obj);
|
||||
switch (message.what) {
|
||||
case Config.WHAT_SCREEN_CAPTURE -> MainActivity.this.screenCapture(message);
|
||||
case Config.WHAT_RECORD -> MainActivity.this.record(message);
|
||||
case Config.WHAT_NEW_LOCAL_VIDEO,
|
||||
Config.WHAT_NEW_REMOTE_VIDEO -> MainActivity.this.previewVideo(message);
|
||||
case Config.WHAT_REMOVE_VIDEO -> MainActivity.this.removeVideo(message);
|
||||
@@ -233,6 +237,16 @@ public class MainActivity extends AppCompatActivity implements Serializable {
|
||||
this.activityResultLauncher.launch(this.mediaProjectionManager.createScreenCaptureIntent());
|
||||
}
|
||||
|
||||
private void record(Message message) {
|
||||
final Resources resources = this.getResources();
|
||||
final FloatingActionButton record = this.binding.record;
|
||||
if(Boolean.TRUE.equals(message.obj)) {
|
||||
record.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.color.purple_500, this.getTheme())));
|
||||
} else {
|
||||
record.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.color.teal_200, this.getTheme())));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 预览用户视频
|
||||
*
|
||||
|
||||
@@ -537,6 +537,8 @@ public final class Taoyao implements ITaoyao {
|
||||
switch (header.getSignal()) {
|
||||
case "control::config::audio" -> this.controlConfigAudio(message, message.body());
|
||||
case "control::config::video" -> this.controlConfigVideo(message, message.body());
|
||||
case "control::photograph" -> this.controlPhotograph(message, message.body());
|
||||
case "control::record" -> this.controlRecord(message, message.body());
|
||||
case "client::config" -> this.clientConfig(message, message.body());
|
||||
case "client::register" -> this.clientRegister(message, message.body());
|
||||
case "client::reboot" -> this.clientReboot(message, message.body());
|
||||
@@ -601,6 +603,21 @@ public final class Taoyao implements ITaoyao {
|
||||
this.mediaManager.updateVideoConfig(mediaVideoProperties);
|
||||
}
|
||||
|
||||
private void controlPhotograph(Message message, Map<String, Object> body) {
|
||||
this.mediaManager.photograph();
|
||||
}
|
||||
|
||||
private void controlRecord(Message message, Map<String, Object> body) {
|
||||
final Boolean enabled = MapUtils.getBoolean(body, "enabled");
|
||||
if(Boolean.TRUE.equals(enabled)) {
|
||||
this.mediaManager.startRecord();
|
||||
} else {
|
||||
this.mediaManager.stopRecord();
|
||||
}
|
||||
body.put("enabled", enabled);
|
||||
this.push(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param message 消息
|
||||
* @param body 消息主体
|
||||
@@ -890,7 +907,8 @@ public final class Taoyao implements ITaoyao {
|
||||
if(sessionClient == null) {
|
||||
return;
|
||||
}
|
||||
sessionClient.pause();
|
||||
final String type = MapUtils.get(body, "type");
|
||||
sessionClient.pause(type);
|
||||
}
|
||||
|
||||
private void sessionResume(Message message, Map<String, Object> body) {
|
||||
@@ -899,7 +917,8 @@ public final class Taoyao implements ITaoyao {
|
||||
if(sessionClient == null) {
|
||||
return;
|
||||
}
|
||||
sessionClient.resume();
|
||||
final String type = MapUtils.get(body, "type");
|
||||
sessionClient.resume(type);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -632,6 +632,7 @@ public final class MediaManager {
|
||||
this.recordClient.start();
|
||||
final VideoTrack videoTrack = this.peerConnectionFactory.createVideoTrack("TaoyaoVR", this.mainVideoSource);
|
||||
this.recordClient.source(videoTrack);
|
||||
this.mainHandler.obtainMessage(Config.WHAT_RECORD, Boolean.TRUE).sendToTarget();
|
||||
return this.recordClient;
|
||||
}
|
||||
}
|
||||
@@ -643,6 +644,7 @@ public final class MediaManager {
|
||||
} else {
|
||||
this.recordClient.close();
|
||||
this.recordClient = null;
|
||||
this.mainHandler.obtainMessage(Config.WHAT_RECORD, Boolean.FALSE).sendToTarget();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import org.webrtc.DataChannel;
|
||||
import org.webrtc.IceCandidate;
|
||||
import org.webrtc.MediaConstraints;
|
||||
import org.webrtc.MediaStream;
|
||||
import org.webrtc.MediaStreamTrack;
|
||||
import org.webrtc.PeerConnection;
|
||||
import org.webrtc.PeerConnectionFactory;
|
||||
import org.webrtc.SdpObserver;
|
||||
@@ -292,6 +293,21 @@ public class SessionClient extends Client {
|
||||
this.pauseVideo();
|
||||
}
|
||||
|
||||
public void pause(String type) {
|
||||
if(MediaStreamTrack.AUDIO_TRACK_KIND.equals(type)) {
|
||||
ListUtils.getOnlyOne(this.mediaStream.audioTracks, audioTrack -> {
|
||||
audioTrack.setEnabled(false);
|
||||
return audioTrack;
|
||||
});
|
||||
} else if(MediaStreamTrack.VIDEO_TRACK_KIND.equals(type)) {
|
||||
ListUtils.getOnlyOne(this.mediaStream.videoTracks, videoTrack -> {
|
||||
videoTrack.setEnabled(false);
|
||||
return videoTrack;
|
||||
});
|
||||
} else {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resume() {
|
||||
super.resume();
|
||||
@@ -299,6 +315,21 @@ public class SessionClient extends Client {
|
||||
this.resumeVideo();
|
||||
}
|
||||
|
||||
public void resume(String type) {
|
||||
if(MediaStreamTrack.AUDIO_TRACK_KIND.equals(type)) {
|
||||
ListUtils.getOnlyOne(this.mediaStream.audioTracks, audioTrack -> {
|
||||
audioTrack.setEnabled(true);
|
||||
return audioTrack;
|
||||
});
|
||||
} else if(MediaStreamTrack.VIDEO_TRACK_KIND.equals(type)) {
|
||||
ListUtils.getOnlyOne(this.mediaStream.videoTracks, videoTrack -> {
|
||||
videoTrack.setEnabled(true);
|
||||
return videoTrack;
|
||||
});
|
||||
} else {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
synchronized (this) {
|
||||
|
||||
@@ -11,6 +11,10 @@ public class Config {
|
||||
* 屏幕捕获
|
||||
*/
|
||||
public static final int WHAT_SCREEN_CAPTURE = 1000;
|
||||
/**
|
||||
* 视频录制
|
||||
*/
|
||||
public static final int WHAT_RECORD = 1001;
|
||||
/**
|
||||
* 新建本地音频
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user