2011-01-31 19 views
7

Estoy intentando codificar una aplicación que usa la cámara. Obtengo una NullPointerException cuando trato de obtener SurfaceHolder que eventualmente paso a la superficieCreated() que inicia la cámara. ¿Hay alguna situación en la que getHolder() devuelva NULL?surfaceView.getHolder no regresa SurfaceHolder

gracias.

package com.tecmark; 

import java.io.IOException; 

import android.app.Activity; 

import android.graphics.PixelFormat; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.Window; 
import android.view.WindowManager; 

public class cameraView extends Activity implements SurfaceHolder.Callback{ 

    SurfaceView mSurfaceView; 
    SurfaceHolder mSurfaceHolder; 
    Camera mCamera; 
    boolean mPreviewRunning; 

/** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     getWindow().setFormat(PixelFormat.TRANSLUCENT); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 

     WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     //setContentView(R.layout.camera_surface); 

     mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera); 
     Log.i("surfaceholder = ", "about to get surface holder"); 
     try{ 
     mSurfaceHolder = mSurfaceView.getHolder(); 
     }catch(Exception e){ 
     e.printStackTrace(); 
     } 

     Log.i("surfaceholder = ", ""+mSurfaceHolder.toString()); 

     mSurfaceHolder.addCallback(this); 

     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     setContentView(R.layout.camera_surface); 

     surfaceCreated(mSurfaceHolder); 







    } 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

    if (mPreviewRunning) { 

    mCamera.stopPreview(); 

    } 

    Camera.Parameters p = mCamera.getParameters(); 

    p.setPreviewSize(w, h); 

    mCamera.setParameters(p); 

    try { 

    mCamera.setPreviewDisplay(holder); 

    } catch (Exception e) { 

    e.printStackTrace(); 

    } 

    mCamera.startPreview(); 

    mPreviewRunning = true; 

    } 






@Override 
public void surfaceCreated(SurfaceHolder holder) { 




    try{ 
    Log.i("camera ", "about to open camera"); 
     mCamera = Camera.open(); 
     Log.i("camera ", " camera opened"); 
     mCamera.getParameters(); 
     mCamera.setPreviewDisplay(holder); 
     mCamera.startPreview(); 
    } catch (IOException e) { 

    e.printStackTrace(); 
    } 
    Log.i("camera ", "ok"); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    mCamera.stopPreview(); 

    mPreviewRunning = false; 

    mCamera.release(); 

} 




}//end of activity 



01-31 15:29:17.773: WARN/System.err(9144): java.lang.NullPointerException 
01-31 15:29:17.778: WARN/System.err(9144):  at com.tecmark.cameraView.onCreate(cameraView.java:42) 
01-31 15:29:17.778: WARN/System.err(9144):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-31 15:29:17.778: WARN/System.err(9144):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
01-31 15:29:17.783: WARN/System.err(9144):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
01-31 15:29:17.783: WARN/System.err(9144):  at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
01-31 15:29:17.783: WARN/System.err(9144):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
01-31 15:29:17.783: WARN/System.err(9144):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-31 15:29:17.783: WARN/System.err(9144):  at android.os.Looper.loop(Looper.java:123) 
01-31 15:29:17.783: WARN/System.err(9144):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
01-31 15:29:17.783: WARN/System.err(9144):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-31 15:29:17.788: WARN/System.err(9144):  at java.lang.reflect.Method.invoke(Method.java:521) 
01-31 15:29:17.788: WARN/System.err(9144):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
01-31 15:29:17.788: WARN/System.err(9144):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
01-31 15:29:17.788: WARN/System.err(9144):  at dalvik.system.NativeStart.main(Native Method) 
01-31 15:29:17.793: DEBUG/AndroidRuntime(9144): Shutting down VM 
01-31 15:29:17.793: WARN/dalvikvm(9144): threadid=3: thread exiting with uncaught exception (group=0x4001b180) 
01-31 15:29:17.793: ERROR/AndroidRuntime(9144): Uncaught handler: thread main exiting due to uncaught exception 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tecmark/com.tecmark.cameraView}: java.lang.NullPointerException 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.os.Looper.loop(Looper.java:123) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at java.lang.reflect.Method.invoke(Method.java:521) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at dalvik.system.NativeStart.main(Native Method) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144): Caused by: java.lang.NullPointerException 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at com.tecmark.cameraView.onCreate(cameraView.java:47) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  ... 11 more 

Respuesta

15

Comenzando una nueva respuesta para ser más claro. De nuevo, creo que la raíz del problema es la cantidad de cosas que estás haciendo en onCreate vs. onResume.

Creo que el problema principal que tiene es que algunas partes del ciclo de vida de la vista/actividad deben seguir su curso antes de comenzar a tratar con el SurfaceView y comenzar a prevew con él.

No estoy seguro de eso, pero aquí está el desglose de los diversos lugares que tratan de diversas cámara y la superficie vista de la materia en una aplicación de realidad aumentada que funciona:

onCreate() 
{ 
    // just set content view. do nothing with the camera or surfaceView yet 
    setContentView(R.layout.main); 
} 

onResume() 
{ 
     // open camera 
    mCamera = Camera.open(); 

    // init surface view 
    sv = (SurfaceView)this.findViewById(R.id.SurfaceView01); 
      mHolder = sv.getHolder(); 
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
      mHolder.setSizeFromLayout(); 
      mHolder.addCallback(this); 
} 

surfaceChanged(SurfaceHolder holder, int format, int w, int h) 
{ 
    mCamera.setPreviewDisplay(holder); 
    // set any cam params you need... 

    mCamera.startPreview(); 
} 

Pruebe la reestructuración de su código para hacer semejante . Mis ojos se abrieron con cara tratando de contar en el que los NPE estaba pasando de su fuente, pero creo que algunos problemas son:

  • que parecen estar tratando de conseguir referencia a la SurfaceView ANTES has llamado setContentView()
  • está llamando directamente al método surfaceCreated, en lugar de dejar que se llame a través de la devolución de llamada.

Espero que ayude. Ya sabremos esto!

+0

Hola muchas gracias, realmente aprecio tu ayuda. La cámara ahora está funcionando. Intento que la aplicación incluya reconocimiento facial, así que echemos un vistazo a eso ahora. Necesito ver mejor las clases de devolución de llamada y de superficie para entender qué métodos necesitan implementarse y dónde colocar mi código. Otra vez muchas gracias – turtleboy

+0

si quiero publicar el nuevo código ¿cómo puedo hacer eso? ¿Necesito editar la pregunta de origen o puedo publicar el código en un comentario? gracias – turtleboy

+0

increíble !!! No me puedo imaginar que este error pueda solucionarse así. gracias :) – hqt

0

De la parte superior de mi cabeza, pienso que usted tiene que hacer las cosas SurfaceView en onResume en lugar de en onCreate, de lo contrario se ve bien.

Además, debe intentar llamar:

mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
mSurfaceHolder.setSizeFromLayout(); 

justo después de obtener una referencia al titular, pero antes de comenzar la vista previa.

+0

bien, he puesto la superficie en onResume(); sigue sin funcionar. He registrado el objeto surfaceholder y surfaceview y se han instanciado. El método camera.open() se registra como correcto. Recibo errores que indican que no puedo conectarme al servicio de la cámara, la aplicación pasó el servicio nulo y la superficie aún no está configurada. también hay una superficie.OutOfResourcesException. parece que la superficie no se establece desde el xml – turtleboy

+0

ver la respuesta actualizada sobre PUSH_BUFFERS. Si eso no funciona, examinaré más a fondo y compararé algunas aplicaciones de AR que tengo trabajando. – mmeyer

+0

ok lo intenté antes con respecto a setSizeFromLayout(). esto es lo que la depuración está escupiendo. Gracias. – turtleboy

Cuestiones relacionadas