8000 Add setTorch support for Android (Camera1 API) · flutter-webrtc/flutter-webrtc@5ccd7e0 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5ccd7e0

Browse files
committed
Add setTorch support for Android (Camera1 API)
1 parent 016f124 commit 5ccd7e0

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

android/src/main/java/com/cloudwebrtc/webrtc/FlutterWebRTCPlugin.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,14 +301,18 @@ public void onMethodCall(MethodCall call, Result notSafeResult) {
301301

302302
FlutterRTCVideoRenderer render = renders.get(textureId);
303303

304-
if(render == null ){
304+
if (render == null) {
305305
result.error("FlutterRTCVideoRendererNotFound", "render [" + textureId + "] not found !", null);
306306
return;
307307
}
308308

309309
MediaStream stream = getStreamForId(streamId);
310310
render.setStream(stream);
311311
result.success(null);
312+
} else if (call.method.equals("mediaStreamTrackSetTorch")) {
313+
String trackId = call.argument("trackId");
314+
boolean torch = call.argument("torch");
315+
getUserMediaImpl.setTorch(trackId, torch, result);
312316
} else if (call.method.equals("mediaStreamTrackSwitchCamera")) {
313317
String trackId = call.argument("trackId");
314318
getUserMediaImpl.switchCamera(trackId, result);

android/src/main/java/com/cloudwebrtc/webrtc/GetUserMediaImpl.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import android.content.ContentValues;
77
import android.content.Context;
88
import android.content.pm.PackageManager;
9+
import android.hardware.Camera;
910
import android.os.Build;
1011
import android.os.Bundle;
1112
import android.os.Handler;
@@ -33,6 +34,7 @@
3334
import com.cloudwebrtc.webrtc.utils.PermissionUtils;
3435

3536
import java.io.File;
37+
import java.lang.reflect.Field;
3638
import java.util.ArrayList;
3739
import java.util.HashMap;
3840
import java.util.List;
@@ -797,4 +799,53 @@ void stopRecording(Integer id) {
797799
}
798800
}
799801

802+
void setTorch(String trackId, boolean torch, Result result) {
803+
VideoCapturer videoCapturer = mVideoCapturers.get(trackId);
804+
if (videoCapturer == null) {
805+
result.error("Video capturer not found for id: " + trackId, null, null);
806+
return;
807+
}
808+
809+
if (videoCapturer instanceof Camera1Capturer) {
810+
Object session;
811+
try {
812+
Field currentSessionField = Camera1Capturer.class.getSuperclass().getDeclaredField("currentSession");
813+
currentSessionField.setAccessible(true);
814+
session = currentSessionField.get(videoCapturer);
815+
} catch (NoSuchFieldException e) {
816+
// Most likely the upstream Camera1Capturer class have changed
817+
Log.e(TAG, "[TORCH] Failed to get `currentSession` from `Camera1Capturer`");
818+
result.error("Failed to get `currentSession` from `Camera1Capturer`", null, null);
819+
return;
820+
} catch (IllegalAccessException e) {
821+
// Should never happen since we are calling `setAccessible(true)`
822+
throw new RuntimeException(e);
823+
}
824+
825+
Camera camera;
826+
try {
827+
Field cameraField = session.getClass().getDeclaredField("camera");
828+
cameraField.setAccessible(true);
829+
camera = (Camera) cameraField.get(session);
830+
} catch (NoSuchFieldException e) {
831+
// Most likely the upstream Camera1Session class have changed
832+
Log.e(TAG, "[TORCH] Failed to get `camera` from `Camera1Session`");
833+
result.error("Failed to get `camera` from `Camera1Session`", null, null);
834+
return;
835+
} catch (IllegalAccessException e) {
836+
// Should never happen since we are calling `setAccessible(true)`
837+
throw new RuntimeException(e);
838+
}
839+
840+
Camera.Parameters params = camera.getParameters();
841+
params.setFlashMode(torch ? Camera.Parameters.FLASH_MODE_TORCH : Camera.Parameters.FLASH_MODE_OFF);
842+
camera.setParameters(params);
843+
844+
result.success(null);
845+
return;
846+
}
847+
848+
Log.e(TAG, "[TORCH] Video capturer not compatible");
849+
result.error("Video capturer not compatible", null, null);
850+
}
800851
}

0 commit comments

Comments
 (0)
0