Android: как включить FLASHLIGHT с помощью WEBRTC android io.pristine.libjingle:11139
Великие разработчики. Я использую библиотеку webRTC io.pristine.libjingle:11139 для видеозвонков. Все идет хорошо, теперь я просто хочу включить FLASHLIGHT, я исследовал почти все вопросы, связанные с FLASHLIGHT, где я обнаружил, что FLASHLIGHT - это функция камеры, поэтому для включения FLASHLIGHT нужно идти с объектом CAMERA, Теперь я застрял здесь, потому что я использую библиотеку, она не позволяет мне получить доступ к объекту камеры, уже открытому. Так как же включить фонарик, не используя камеру, потому что камера уже используется библиотекой webrtc? Есть ли какая-либо другая последняя библиотека, которая позволяет получить доступ к объекту камеры libjingle для webrtc для Android?
Мне нужна помощь, это действительно как вызов.
С уважением, Дхарма
2 ответа
Сегодня я столкнулся с этой проблемой и нигде не нашел решения, поэтому я хотел поделиться своим решением, хотя уже довольно поздно после того, как вопрос был задан. В основном есть два варианта: изменить исходный код и скомпилировать библиотеку webrtc самостоятельно или более простое решение - немного переопределить функциональность библиотеки. Я должен сказать, что я использую последнюю готовую библиотеку прямо из репозитория Google, поэтому моя библиотека libjingle может немного отличаться.
implementation 'org.webrtc:google-webrtc:1.0.28262'
Теперь перейдем к самому коду. Создать пакетorg.webrtc
чтобы иметь доступ к частным классам и интерфейсам пакета, которые необходимо реализовать или изменить.
Первый из них interface CameraSession
. Экземпляр этого интерфейса обрабатывает доступ к камере Android. Итак, я создалclass FlaslightCameraSession implements CameraSession
скопировав код из class Camera1Session
и добавляем функцию включения / выключения фонарика следующим образом.
void setFlashlightActive(boolean isActive) {
Camera.Parameters params = camera.getParameters();
if (isActive) {
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
} else {
params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
}
camera.setParameters(params);
}
Следующим шагом является изменение VideoCapturer
привык получать VideoFrame
с камеры. Для этого я просто сделалclass FlashlightCameraCapturer
путем расширения webrtc class Camera1Capturer
и добавлена простая модификация для управления фонариком.
@Override
protected void createCameraSession(CameraSession.CreateSessionCallback createSessionCallback, CameraSession.Events events, Context applicationContext, SurfaceTextureHelper surfaceTextureHelper, String cameraName, int width, int height, int framerate) {
CameraSession.CreateSessionCallback myCallback = new CameraSession.CreateSessionCallback() {
@Override
public void onDone(CameraSession cameraSession) {
FlashlightCameraCapturer.this.cameraSession = (FlashlightCameraSession) cameraSession;
createSessionCallback.onDone(cameraSession);
}
@Override
public void onFailure(CameraSession.FailureType failureType, String s) {
createSessionCallback.onFailure(failureType, s);
}
};
FlashlightCameraSession.create(myCallback, events, captureToTexture, applicationContext, surfaceTextureHelper, Camera1Enumerator.getCameraIndex(cameraName), width, height, framerate);
}
public void turnOnFlashlight() {
cameraSession.setFlashlightActive(true);
}
public void turnOffFlashlight() {
cameraSession.setFlashlightActive(false);
}
Последний шаг - изменить CameraEnumerator
. В частности, вам нужно переопределить функцию createCapturer, чтобы создать экземпляр нашего модифицированного захватчика. Так что я продлилclass Camera1Enumerator
чтобы переопределить эту функцию следующим образом.
@Override
public CameraVideoCapturer createCapturer(String deviceName, CameraVideoCapturer.CameraEventsHandler eventsHandler) {
return new FlashlightCameraCapturer(deviceName, eventsHandler, true);
}
Теперь вы можете просто использовать свой новый модифицированный перечислитель камер, чтобы получить экземпляр устройства захвата камеры, который может управлять фонариком.
Надеюсь это поможет:)
Чтобы скомпрометировать ответ @Dzerjrin, я наконец реализовал функциональность фонарика в рабочем Android-приложении на основе WebRTC.
Прежде всего, я использовал Gradle-зависимость библиотеки WebRTC;
implementation 'org.webrtc:google-webrtc:1.0.32006'
Как было предложено, для доступа к частным классам пакета нам нужно создать пакет
org.webrtc
Затем нам нужно создать три класса
FlashlightCameraCapturer
, а также
FlaslightCameraSession
.
Основная хитрость для этой функции заключается в использовании созданного CameraNumerator в вашем существующем классе VideoChat, как показано ниже; Тогда вы можете использовать фонарик. В приведенном ниже сценарии
FlashlightCameraNumerator
использовался.
private fun createCameraCapturer(enumerator: FlashlightCameraNumerator): FlashlightCameraCapturer? {
val deviceNames = enumerator.deviceNames
if (expertOfTheCall) {
// First, try to find front facing camera
Logging.d(RtcAppConstant.TAG, "Looking for front facing cameras.")
for (i in deviceNames.indices) {
val deviceName = deviceNames[i]
if (enumerator.isFrontFacing(deviceName)) {
Logging.d(RtcAppConstant.TAG, "Creating front facing camera capturer.")
val videoCapturer: FlashlightCameraCapturer? = enumerator.createCapturer(deviceName, null) as FlashlightCameraCapturer?
cameraDeviceId = i
cameraDeviceName = deviceName
if (videoCapturer != null) {
return videoCapturer
}
}
}
// Front facing camera not found, try something else
Logging.d(RtcAppConstant.TAG, "Looking for other cameras.")
for (i in deviceNames.indices) {
val deviceName = deviceNames[i]
if (!enumerator.isFrontFacing(deviceName)) {
Logging.d(RtcAppConstant.TAG, "Creating other camera capturer.")
val videoCapturer: FlashlightCameraCapturer? = enumerator.createCapturer(deviceName, null) as FlashlightCameraCapturer?
cameraDeviceId = i
cameraDeviceName = deviceName
if (videoCapturer != null) {
return videoCapturer
}
}
}
} else {
// First, try to find back camera
Logging.d(RtcAppConstant.TAG, "Looking for other cameras.")
for (i in deviceNames.indices) {
val deviceName = deviceNames[i]
if (!enumerator.isFrontFacing(deviceName)) {
Logging.d(RtcAppConstant.TAG, "Creating other camera capturer.")
val videoCapturer: FlashlightCameraCapturer? = enumerator.createCapturer(deviceName, null) as FlashlightCameraCapturer?
cameraDeviceId = i
cameraDeviceName = deviceName
if (videoCapturer != null) {
return videoCapturer
}
}
}
// Back camera not found, try something else
Logging.d(RtcAppConstant.TAG, "Looking for front facing cameras.")
for (i in deviceNames.indices) {
val deviceName = deviceNames[i]
if (enumerator.isFrontFacing(deviceName)) {
Logging.d(RtcAppConstant.TAG, "Creating front facing camera capturer.")
val videoCapturer: FlashlightCameraCapturer? = enumerator.createCapturer(deviceName, null) as FlashlightCameraCapturer?
cameraDeviceId = i
cameraDeviceName = deviceName
if (videoCapturer != null) {
return videoCapturer
}
}
}
}
return null
}