Sto utilizzando l'API Camera2 di Android e attualmente desidero che la fotocamera esegua una determinata azione ogni volta che si prepara a lampeggiare.Android: come rilevare se la fotocamera lampeggiava
Quando si costruisce il CaptureRequest, la riga seguente:
captureRequest.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
permette alla telecamera di flash in condizioni di scarsa illuminazione. Tuttavia, sono in perdita su come posso rilevare se la fotocamera è pronta a lampeggiare o meno. Sembra che la letteratura online su questa particolare azione sia piuttosto scarsa.
ho cercato controllando se FLASH_STATE
è in FLASH_STATE_READY
durante l'elaborazione di un partialresult nella fotocamera del CaptureCallback
, ma sembra che la chiave non era disponibile - si continuava a tornare null
. Forse non sto controllando nel posto giusto?
del CaptureCallback
fotocamera, mostrato di seguito (in base al largo campione Camera2Basic
il codice di Google):
private CameraCaptureSession.CaptureCallback mCaptureCallback
= new CameraCaptureSession.CaptureCallback() {
private void process(CaptureResult result) {
switch(mState) {
case STATE_PREVIEW: break;
case STATE_WAITING_LOCK:
// checking if result.get(CaptureResult.FLASH_STATE) ==
// CaptureResult.FLASH_READY over here didn't work because
// null was returned
int afState = result.get(CaptureResult.CONTROL_AF_STATE);
if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) {
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null ||
aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
mState = STATE_WAITING_NON_PRECAPTURE;
captureStillPicture();
} else {
runPrecaptureSequence();
}
}
break;
case STATE_WAITING_PRECAPTURE:
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null ||
aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE ||
aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) {
mState = STATE_WAITING_NON_PRECAPTURE;
}
break;
case STATE_WAITING_NON_PRECAPTURE:
Integer aeState1 = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState1 == null || aeState1 != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) {
mState = STATE_PICTURE_TAKEN;
captureStillPicture();
}
break;
}
}
@Override
public void onCaptureProgressed(CameraCaptureSession session,
CaptureRequest request, CaptureResult partialResult) {
super.onCaptureProgressed(session, request, partialResult);
process(partialResult);
}
@Override
public void onCaptureCompleted(CameraCaptureSession session,
CaptureRequest request, TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
process(result);
}
};
Controllare seguente classe per Flash in Camera2 API, http://stackoverflow.com/questions/27420594/android-5-camera2-use-only-flash/31289731#31289731 –
Per leggere lo stato flash, attendere il risultato della cattura totale invece e controlla lo stato del flash lì; i partial potrebbero non avere ancora tutti i campi (in genere hanno i campi necessari per terminare l'AF, ecc. per la velocità). –