promocional play para pantalla imagenes gráfico google facil easy capturar captura botones app aplicacion android android-camera

android - play - screenshot easy



Captura de imagen sin intención, da salida diferente en diferentes dispositivos (3)

Mi requisito no es mostrar la vista previa de la cámara ni utilizar la intención de la cámara para la captura de imágenes.

Allí encuentro una forma que funciona para mi primer dispositivo de prueba (Galaxy tab 7 ").

Mi función CaptureImage es la siguiente

private void CaptureImage() { int FrontCameraFound = getCameraID(); if (FrontCameraFound != -1) { mCamera = Camera.open(FrontCameraFound); parameters = mCamera.getParameters(); mCamera.setParameters(parameters); mCamera.startPreview(); Camera.PictureCallback mCall = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { bmp = BitmapFactory.decodeByteArray(data, 0, data.length); // set bitmap tp image view just to check // if image capture proper, testing purpose iv_image.setImageBitmap(bmp); mCamera.stopPreview(); mCamera.release(); mCamera = null; } }; mCamera.takePicture(null, null, mCall); } }

y la función getCameraID como abajo

private int getCameraID() { Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); camIdx++) { Camera.getCameraInfo(camIdx, cameraInfo); // for capture image from back camera // If want to capture from front // then change it to CAMERA_FACING_FRONT if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { try { return camIdx; } catch (RuntimeException e) { } } } return -1; }

Ahora estoy enfrentando dificultades para ejecutar con éxito el código anterior en diferentes dispositivos.

  • Samsung Galaxy S + (2.3.6): la cámara frontal siempre devuelve la imagen verde, pero la codificación de la cámara trasera funciona bien.
  • Samsung Galaxy Nexus (4.1): la codificación no funciona Ni para la parte frontal ni para la cámara trasera y falla "takePicture".
  • LG Optimus Net (2.3.4): solo la cámara trasera está ahí y funciona bien.
  • Samsung Galaxy Tab 7 "(2.3.3): ambas cámaras funcionan bien.
  • Motorola Xoom (3.1): ambas cámaras funcionan bien.

Logcat de Samsung Galaxy Nexus:

09-21 09:37:42.125: E/AndroidRuntime(4647): Caused by: java.lang.RuntimeException: takePicture failed 09-21 09:37:42.125: E/AndroidRuntime(4647): at android.hardware.Camera.native_takePicture(Native Method) 09-21 09:37:42.125: E/AndroidRuntime(4647): at android.hardware.Camera.takePicture(Camera.java:1061) 09-21 09:37:42.125: E/AndroidRuntime(4647): at android.hardware.Camera.takePicture(Camera.java:1006) 09-21 09:37:42.125: E/AndroidRuntime(4647): at fortyonepost.com.pwop.TakePictureDemoActivity.CaptureImage(TakePictureDemoActivity.java:63) 09-21 09:37:42.125: E/AndroidRuntime(4647): at fortyonepost.com.pwop.TakePictureDemoActivity.onCreate(TakePictureDemoActivity.java:36) 09-21 09:37:42.125: E/AndroidRuntime(4647): at android.app.Activity.performCreate(Activity.java:5008) 09-21 09:37:42.125: E/AndroidRuntime(4647): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 09-21 09:37:42.125: E/AndroidRuntime(4647): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)

No es posible verificar el código de todos los dispositivos, solo pruebo mi código en 5 dispositivos y 2 dispositivos causan problemas, así que hay alguna forma estándar de obtener imágenes de la cámara sin intención y vista previa.

Tenga en cuenta que incluyo en el manifiesto y establezco la versión mínima de sdk en 9

Actualización: En 4.1 Nexus Galaxy takePicture Failed desde el número de línea 1061 en la clase Camera.java, aquí está el enlace de la clase que me da información que native_takePicture(msgType); function in Camera.java native_takePicture(msgType); function in Camera.java que


Debe usar el método Camera.setOneShotPreviewCallback y luego procesar la imagen

Intente usar YuvImage y comprímalo antes de pasarlo al bitmapfactory, así:

YuvImage yuvimage = new YuvImage(byteArr, ImageFormat.NV21, width, height, null); Rect rect = new Rect(0, 0, width, height); ByteArrayOutputStream outstr = new ByteArrayOutputStream(); yuvimage.compressToJpeg(rect, 100, outstr); Bitmap bm = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());

EDITAR:

Debe usar una vista de superficie, pero la vista de superficie se puede ocultar debajo de otra vista, por lo que no se puede ver en la pantalla pero aún existe y está activa.


Después de varias búsquedas, encontré que la vista previa de la cámara es necesaria y me pregunto cómo funciona bien mi código en algunos dispositivos, incluso si está defectuoso.

Cualquier forma de solución es que,

Exigimos que la vista previa de la cámara se mantenga en la vista de superficie y podemos ocultar esa vista de superficie detrás de cualquier otra vista, tomo la vista de superficie en framelayout (sé que está obsoleta) y encima de ella tomo la vista de imagen, para la vista de superficie solo tomo 80 * 80 Vista de superficie de dp porque la vista de superficie pequeña como 30 * 30 dp no funcionó y nuevamente por error.


El manejo de la cámara en dispositivos Android es PITA importante: diferentes dispositivos (e incluso versiones de Android en el mismo dispositivo) pueden y ciertamente se comportarán de manera diferente. Básicamente estás hablando con algún proceso demoníaco en el dispositivo, y son diferentes entre sí.

No tengo solución para todos los problemas, pero aquí están mis conclusiones hasta ahora

  • No todas las resoluciones funcionan correctamente, incluso si están anunciadas en los parámetros de la cámara. Tienes que probarlos al configurar la cámara en caso de que haya problemas
  • los datos de vista previa llegan a usted a través de la región de memoria mmapped
  • El formato NV21 siempre se suministra y será el predeterminado, pero consultaría la configuración de la cámara. Cuando abre la cámara, puede tener algunas configuraciones de otra aplicación que usó la cámara antes. (en ninguna parte se dice que la cámara se restablecerá a los valores predeterminados cuando la abra)

He desarrollado algunas cosas de administración de cámaras desarrolladas para el proyecto JavaOCR, y funciona en la mayoría de los dispositivos. Siéntase libre de usar esto como inspiración:

http://sourceforge.net/p/javaocr/code/240/tree/trunk/demos/camera-utils/src/main/java/net/sf/javaocr/demos/android/utils/camera/CameraManager.java