SuperficieCreada () Nunca llamado
He visto problemas similares a los que estoy teniendo, pero todavía no puedo encontrar una solución. Soy muy nuevo en el desarrollo de Android, así que estoy teniendo problemas para rastrear mi problema. De todos modos, estoy tratando de crear una vista previa de la cámara usando una clase CameraSurfaceView que creé que extiende SurfaceView y implementa SurfaceHolder.Callback. No importa lo que intento en mi clase StartCamera, el método surfaceCreated () nunca se llama, por lo tanto mi cámara nunca empieza. ¡Cualquier ayuda sería genial, gracias!
StartCamera.java
- ¿Cómo se anima un cambio en el relleno de una vista?
- Android - Cómo dibujar en vista
- Android: Cómo poner elementos personalizados en un círculo / destino
- Crear ImageView de forma programática sin diseño
- Anular onDraw () o draw ()?
import net.peterd.zombierun.R; import android.hardware.Camera; import android.os.Bundle; import android.widget.FrameLayout; public class StartCamera extends BaseActivity { private Camera mCamera; private CameraSurfaceView mView; public void onCreate(Bundle state) { // TODO Auto-generated constructor stub super.onCreate(state); setContentView(R.layout.start_camera); } public void onResume() { super.onResume(); mView = new CameraSurfaceView(this); FrameLayout preview = (FrameLayout) findViewById(R.id.cPreview); preview.addView(mView); } public void onPause() { mCamera.stopPreview(); mCamera.release(); } }
CameraSurfaceView.java
import java.io.IOException; import android.content.Context; import android.hardware.Camera; import android.view.SurfaceHolder; import android.view.SurfaceView; public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder holder; private Camera camera; public CameraSurfaceView(Context context) { super(context); //Initiate the Surface Holder properly this.holder = this.getHolder(); this.holder.addCallback(this); this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public void surfaceCreated(SurfaceHolder holder) { try { //Open the Camera in preview mode this.camera = Camera.open(); this.camera.setPreviewDisplay(this.holder); } catch(IOException ioe) { ioe.printStackTrace(System.out); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // Now that the size is known, set up the camera parameters and begin // the preview. Camera.Parameters parameters = camera.getParameters(); parameters.setPreviewSize(width, height); camera.setParameters(parameters); camera.startPreview(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // Surface will be destroyed when replaced with a new screen //Always make sure to release the Camera instance camera.stopPreview(); camera.release(); camera = null; } public Camera getCamera() { return camera; } }
Start_camera.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <FrameLayout android:id="@+id/cPreview" android:layout_weight="1" android:layout_width="fill_parent" android:layout_height="fill_parent"> </FrameLayout> </LinearLayout>
- Cómo agregar un marcador pin en la vista de la imagen en android
- Imagen de Android vista de la gravedad
- Cómo tener un ImageButton transparente: Android
- Configurar la tipografía de la sugerencia en TextEdit
- Lista de posición de los puntos repetidos en getview
- Vista previa de la cámara Android estirada
- Colocación / superposición (índice-z) una vista encima de las pestañas de la barra de acciones
- ¿Centrar el texto verticalmente independientemente de la altura de la vista?
Aparentemente esto se debe a que FrameLayout está vacío y por lo tanto no está creando ningún tipo de SurfaceView. Puede intentar forzar la altura y el ancho del parámetro LinearLayout padre manualmente o simplemente agregar una imageView dentro del FrameLayout. Dado que FrameLayout puede contener muchos widgets, pero solo muestra el último de ellos, puede colocar un ImageView dentro del FrameLayout mostrando una pequeña imagen sólo para que se cree el SurfaceView.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <FrameLayout android:id="@+id/cPreview" android:layout_weight="1" android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- Adding small dummy image --> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" src="@drawable/small_picture"> </FrameLayout> </LinearLayout>
He tenido el mismo problema. Para mí fue porque el tamaño de vista se estaba estableciendo en 0, y por lo tanto la superficie nunca se creó. Comprobé esto mediante el establecimiento de un tamaño específico, y de repente las llamadas se llamaron. (Lo mismo, aparentemente, se mantiene si la vista se presenta fuera de la pantalla).
@ Jvnane He probado su código, funciona, con un error menor.
surfaceChanged
se llama sin problema. ¿De qué manera cree que no funciona? Intente agregar el mensaje de depuración y verlo en LogCat:
@Override public void surfaceCreated(final SurfaceHolder holder) { Log.i("Camera Test", "It works!"); try { //Open the Camera in preview mode this.camera = Camera.open(); this.camera.setPreviewDisplay(this.holder); } catch(final IOException ioe) { ioe.printStackTrace(System.out); } }
surfaceDestroyed
menor: el objeto de Camera
se libera en surfaceDestroyed
para que no sea necesario liberarlo de nuevo en la onPause
la actividad. Además, es necesario llamar a super.onPause()
al sobreponer el método onPause()
.
Tenía errores de esta línea en el método surfaceChanged
, surfaceChanged
:
camera.setParameters(parameters);
Funcionó bien una vez me comentó que fuera.
- ¿Cómo puedo crear un diseño con pestañas completamente en XML?
- HTML5 Webapp como icono o aplicación regular en iPhone y Android.