我正在开发一个 Android 应用程序,该应用程序应该在应用程序启动时打开或关闭手电筒。目标是将手电筒切换到与应用程序启动时相反的状态。但是,我的实现仅打开手电筒,如果手电筒已经打开,则不会将其关闭。
这是我正在使用的代码:
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 回调可能没有时间在调用toggleFlashlight之前更新 isFlashlightOn 。我尝试过不同的实现方式,但我的技能不足以解决问题
我以前见过这种情况发生。据我所知,冲突是由在您的应用程序尝试关闭手电筒之前控制手电筒的系统进程引起的。您的代码不是问题,您需要在尝试关闭手电筒之前结束所有可以控制手电筒的系统进程。我不知道具体如何执行此操作,但它不需要 root 访问权限。只是一个检查手电筒状态标志的函数,如果它打开,则杀死所有可以展示手电筒控制的系统进程,然后关闭手电筒。