programacion - Android cámara personalizada congelar después de zoom
manual de android en pdf (4)
Tengo una cámara personalizada que funciona bien en algunos dispositivos. Funciona bien en Samsung Galaxy Gran Duos (samsung-gt i9082, Android 4.2.2) pero cuando trato de capturar una imagen, que amplié antes, se congela, no se cuelga, la única forma de salir es presionar botón de retroceso. Esto sucede solo en el Samsung Galaxy Gran Duos.
El código que utilicé para tomar una foto:
Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
try {
} catch (Exception e) {
if (flePicture== null){
Log.d("camera", "Error creating media file, check storage permissions: " +
e.getMessage());
return;
}
}
try {
FileOutputStream fos = new FileOutputStream(flePicture);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.d("camera", "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d("camera", "Error accessing file: " + e.getMessage());
}
}
};
Y el código utilizado para acercar:
private void zoomIn() {
if (pblnInPreview) {
Camera.Parameters parameters = camCamera.getParameters();
if ((parameters.getZoom() + 1) < parameters.getMaxZoom()) {
parameters.setZoom(parameters.getZoom() + 1);
camCamera.setParameters(parameters);
}
}
}
LogCat:
04-07 17:21:14.386: E/BrcmCamera(130): processControlBuffer: Corrupt stream error raised by camera - sensor communication failure
Esta no es una respuesta fuertemente relacionada. Lo sé.
Pero me gustaría decir que Samsung 4.2.2 tiene muchos problemas defectuosos. Tiene un bloqueo de ClipboardManager, un bloqueo de aplicación de ActionBar, etc.
Solo filtre con una simple cláusula if
y salve su vida.
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR1 && Build.MANUFACTURER.toUpperCase().contains("SAMSUNG")){
// ignore
}else{
// your logic on the go
}
¿Otra vez comienzas una vista previa de la cámara después de tomar una foto?
agregue esta camera.startPreview();
Prueba esto
Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
camera.startPreview();
try {
} catch (Exception e) {
if (flePicture== null){
Log.d("camera", "Error creating media file, check storage permissions: " +
e.getMessage());
return;
}
}
try {
FileOutputStream fos = new FileOutputStream(flePicture);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.d("camera", "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d("camera", "Error accessing file: " + e.getMessage());
}
}
};
Creo que debe confirmar que su cámara admite el uso del zoom utilizando camera.isZoomSupported()
luego, si es compatible, debe cancelar el enfoque automático con camera.cancelAutoFocus()
para evitar distorsiones de la imagen. Pero esto solo funcionará si su dispositivo realmente admite el zoom. Si no es así, debe capturar la imagen de espera y acercarla utilizando Bitmap.createBitmap
y la sección que desee.
Es un problema con un tipo específico de kernel.
Prueba este enfoque.
private static final String TAG = Test.class.getSimpleName();
private boolean isPreviewStarted;
private Camera camera;
Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
// check if this needs to stop the preview
if (deviceNeedsStopPreviewToShoot()) {
stopPreview();
}
// save your image
// restart preview if needed.
startPreview();
}
};
public void startPreview() {
if (!isPreviewStarted && camera != null) {
camera.startPreview();
isPreviewStarted = true;
}
}
public void stopPreview() {
if (isPreviewStarted && camera != null) {
camera.stopPreview();
isPreviewStarted = false;
}
}
public static boolean deviceNeedsStopPreviewToShoot() {
String[] oldDevices = {"smdk4210", "aries"};
boolean needs = Arrays.asList(oldDevices).contains(Build.BOARD);
Log.e(TAG, "Device " + Build.BOARD + (needs ? " needs " : " doesn''t need ") + "to stop preview");
return needs;
}