Вот код, который я использую:
Код: Выделить всё
import android.app.Activity;
import android.content.Context;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.os.Bundle;
import android.widget.Toast;
public class FlashlightToggleActivity extends Activity {
private CameraManager cameraManager;
private String cameraId;
private boolean isFlashlightOn = false;
private final CameraManager.TorchCallback torchCallback = new CameraManager.TorchCallback() {
@Override
public void onTorchModeChanged(String cameraId, boolean enabled) {
super.onTorchModeChanged(cameraId, enabled);
isFlashlightOn = enabled;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
for (String id : cameraManager.getCameraIdList()) {
if (cameraManager.getCameraCharacteristics(id).get(CameraCharacteristics.FLASH_INFO_AVAILABLE)) {
cameraId = id;
break;
}
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
if (cameraId == null) {
Toast.makeText(this, "Flashlight not available on this device", Toast.LENGTH_SHORT).show();
finish();
return;
}
cameraManager.registerTorchCallback(torchCallback, null);
toggleFlashlight();
}
private void toggleFlashlight() {
try {
cameraManager.setTorchMode(cameraId, !isFlashlightOn);
Toast.makeText(this, !isFlashlightOn ? "Flashlight turned on" : "Flashlight turned off", Toast.LENGTH_SHORT).show();
} catch (CameraAccessException e) {
Toast.makeText(this, "Error toggling flashlight: " + e.getMessage(), Toast.LENGTH_SHORT).show();
} finally {
finish();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
cameraManager.unregisterTorchCallback(torchCallback);
}
}
Приложение правильно включает фонарик, если он был выключен, но если фонарик уже был включен при запуске приложения оно его не выключает.
Мне кажется, причина в флаге isFlashlightOn, который должен отслеживать состояние фонарика, но это выглядит так обратный вызов onTorchModeChanged может не успеть обновить isFlashlightOn до вызова toggleFlashlight. Я пробовал делать разные способы реализации, но моих навыков недостаточно для решения проблемы
Подробнее здесь: https://stackoverflow.com/questions/787 ... ht-not-off