Problema con la cámara personalizada de Android en algunos dispositivos

Hola, tengo una cámara personalizada donde tengo clic botón, al hacer clic en que captura la imagen … Todo está bien, pero en algunos dispositivos de la vista previa se está estirando y también la vista previa se superpone la mitad de la pantalla y parpadeo … algo extraño indeseado efecto. ¿Cómo arreglar esto?

Este es mi código:

Cámara Actividad:

preview = new Preview(this, (SurfaceView) findViewById(R.id.surfaceView)); preview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); ((FrameLayout) findViewById(R.id.preview)).addView(preview); preview.setKeepScreenOn(true); buttonClick = (Button) findViewById(R.id.buttonClick); buttonClick.setOnClickListener(new OnClickListener() { public void onClick(View v) { // preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); camera.takePicture(shutterCallback, rawCallback, jpegCallback); // camera.setDisplayOrientation(90); } }); 

Clase de vista previa:

 class Preview extends ViewGroup implements SurfaceHolder.Callback { private final String TAG = "Preview"; SurfaceView mSurfaceView; SurfaceHolder mHolder; Size mPreviewSize; List<Size> mSupportedPreviewSizes; Camera mCamera; @SuppressWarnings("deprecation") Preview(Context context, SurfaceView sv) { super(context); mSurfaceView = sv; // addView(mSurfaceView); mHolder = mSurfaceView.getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void setCamera(Camera camera) { mCamera = camera; if (mCamera != null) { // get Camera parameters Camera.Parameters params = mCamera.getParameters(); mSupportedPreviewSizes = params.getSupportedPreviewSizes(); requestLayout(); List<String> focusModes = params.getSupportedFocusModes(); if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) { // set the focus mode params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); // set Camera parameters mCamera.setParameters(params); } } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // We purposely disregard child measurements because act as a // wrapper to a SurfaceView that centers the camera preview instead // of stretching it. final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); setMeasuredDimension(width, height); if (mSupportedPreviewSizes != null) { mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if (changed && getChildCount() > 0) { final View child = getChildAt(0); final int width = r - l; final int height = b - t; int previewWidth = width; int previewHeight = height; if (mPreviewSize != null) { previewWidth = mPreviewSize.width; previewHeight = mPreviewSize.height; } // Center the child SurfaceView within the parent. if (width * previewHeight > height * previewWidth) { final int scaledChildWidth = previewWidth * height / previewHeight; child.layout((width - scaledChildWidth) / 2, 0, (width + scaledChildWidth) / 2, height); } else { final int scaledChildHeight = previewHeight * width / previewWidth; child.layout(0, (height - scaledChildHeight) / 2, width, (height + scaledChildHeight) / 2); } } } public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, acquire the camera and tell it where // to draw. try { if (mCamera != null) { mCamera.setPreviewDisplay(holder); } } catch (IOException exception) { Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); } } public void surfaceDestroyed(SurfaceHolder holder) { // Surface will be destroyed when we return, so stop the preview. if (mCamera != null) { mCamera.stopPreview(); } } private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { final double ASPECT_TOLERANCE = 0.1; double targetRatio = (double) w / h; if (sizes == null) return null; Size optimalSize = null; double minDiff = Double.MAX_VALUE; int targetHeight = h; // Try to find an size match aspect ratio and size for (Size size : sizes) { double ratio = (double) size.width / size.height; if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } // Cannot find the one match the aspect ratio, ignore the requirement if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Size size : sizes) { if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } } return optimalSize; } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { if (mCamera != null) { Camera.Parameters parameters = mCamera.getParameters(); parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); requestLayout(); mCamera.setParameters(parameters); mCamera.startPreview(); } } } 

2 Solutions collect form web for “Problema con la cámara personalizada de Android en algunos dispositivos”

Hay un error conocido que ocurre en algunos dispositivos para las capturas de imagen descritas aquí: https://code.google.com/p/android/issues/detail?id=1480

No estoy seguro si su problema es el mismo, pero usted debe intentar el código explicado en esta respuesta de otra pregunta: https://stackoverflow.com/a/1932268/2206688

McAfee Antivirus puede ser el culpable en este caso .

En ese caso, la desinstalación debe resolver el problema.

  • Android adb velocidad usb
  • Estado emergente directamente desde coldstart
  • Mejores Prácticas de Android - Comunicación entre Actividad y Fragmentos
  • El menú deslizante de Android bloquea la interfaz de usuario
  • ¿Importa en qué orden llamo finish () y startActivity ()?
  • Problema "La prueba del repositorio tiene un error" al intentar importar el proyecto de bitbucket al android studio
  • Android - ¿Cómo puedo medir el rendimiento de ListView y otras vistas?
  • Honeycomb Android emulador es perro lento - se manejará antes del lanzamiento oficial?
  • Explicitamente liberando Mat con opencv 2.0
  • ¿Es mejor usar múltiples SpanObjects o múltiples TextViews en Android?
  • ¿Robotium es confiable para probar cuán rápido comienzan las actividades y fragmentos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.