本文介绍了surfaceView.getHolder没有返回SurfaceHolder的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想code使用摄像头的应用程序。我得到一个试图让我最终传递给surfaceCreated(的surfaceHolder时启动相机NullPointerException异常)。有什么状况的时候,getHolder()返回NULL?

感谢。

 包com.tecmark;

进口java.io.IOException异常;

进口android.app.Activity;

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

公共类cameraView扩展活动实现SurfaceHolder.Callback {

    SurfaceView mSurfaceView;
    SurfaceHolder mSurfaceHolder;
    相机mCamera;
    布尔米previewRunning;

 / **第一次创建活动时调用。 * /
    @覆盖
    公共无效的onCreate(包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 =,即将获得表面的持有人);
        尝试{
        mSurfaceHolder = mSurfaceView.getHolder();
        }赶上(例外五){
         e.printStackTrace();
        }

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

        mSurfaceHolder.addCallback(本);

        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        的setContentView(R.layout.camera_surface);

        surfaceCreated(mSurfaceHolder);







    }

 @覆盖
 公共无效surfaceChanged(SurfaceHolder持有人,INT格式,INT W,INT高){

  如果(M previewRunning){

   mCamera.stop preVIEW();

   }

   Camera.Parameters p值= mCamera.getParameters();

   P.SET previewSize(W,H);

   mCamera.setParameters(对);

   尝试 {

   mCamera.set previewDisplay(保持器);

   }赶上(例外五){

   e.printStackTrace();

   }

   mCamera.start preVIEW();

   米previewRunning = TRUE;

   }






 @覆盖
 公共无效surfaceCreated(SurfaceHolder持有者){




  尝试{
   Log.i(相机,即将开启相机);
         mCamera = Camera.open();
         Log.i(相机,摄像头打开);
         mCamera.getParameters();
         mCamera.set previewDisplay(保持器);
         mCamera.start preVIEW();
   }赶上(IOException异常E){

    e.printStackTrace();
   }
  Log.i(相机,OK);
 }

 @覆盖
 公共无效surfaceDestroyed(SurfaceHolder持有者){
  mCamera.stop preVIEW();

  米previewRunning = FALSE;

  mCamera.release();

 }




活动} //结束



01-31 15:29:17.773:WARN / System.err的(9144):显示java.lang.NullPointerException
01-31 15:29:17.778:WARN / System.err的(9144):在com.tecmark.cameraView.onCreate(cameraView.java:42)
01-31 15:29:17.778:WARN / System.err的(9144):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-31 15:29:17.778:WARN / System.err的(9144):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
01-31 15:29:17.783:WARN / System.err的(9144):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
01-31 15:29:17.783:WARN / System.err的(9144):在android.app.ActivityThread.access $ 2200(ActivityThread.java:119)
01-31 15:29:17.783:WARN / System.err的(9144):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1863)
01-31 15:29:17.783:WARN / System.err的(9144):在android.os.Handler.dispatchMessage(Handler.java:99)
01-31 15:29:17.783:WARN / System.err的(9144):在android.os.Looper.loop(Looper.java:123)
01-31 15:29:17.783:WARN / System.err的(9144):在android.app.ActivityThread.main(ActivityThread.java:4363)
01-31 15:29:17.783:WARN / System.err的(9144):在java.lang.reflect.Method.invokeNative(本机方法)
01-31 15:29:17.788:WARN / System.err的(9144):在java.lang.reflect.Method.invoke(Method.java:521)
01-31 15:29:17.788:WARN / System.err的(9144):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)
01-31 15:29:17.788:WARN / System.err的(9144):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
01-31 15:29:17.788:WARN / System.err的(9144):在dalvik.system.NativeStart.main(本机方法)
01-31 15:29:17.793:DEBUG / AndroidRuntime(9144):关闭虚拟机
01-31 15:29:17.793:WARN / dalvikvm(9144):主题ID = 3:线程退出与未捕获的异常(组= 0x4001b180)
01-31 15:29:17.793:ERROR / AndroidRuntime(9144):未捕获的处理程序:螺纹主力退出,由于未捕获的异常
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):java.lang.RuntimeException的:无法启动的活动ComponentInfo {com.tecmark / com.tecmark.cameraView}:显示java.lang.NullPointerException
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在android.app.ActivityThread.access $ 2200(ActivityThread.java:119)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1863)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在android.os.Handler.dispatchMessage(Handler.java:99)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在android.os.Looper.loop(Looper.java:123)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在android.app.ActivityThread.main(ActivityThread.java:4363)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在java.lang.reflect.Method.invokeNative(本机方法)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在java.lang.reflect.Method.invoke(Method.java:521)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:860)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在dalvik.system.NativeStart.main(本机方法)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):由:显示java.lang.NullPointerException
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在com.tecmark.cameraView.onCreate(cameraView.java:47)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
01-31 15:29:17.803:ERROR / AndroidRuntime(9144):11 ...更多
 

解决方案

开始一个新的答案,希望能够更加清晰。同样,我认为根本的问题是东西您选择的在做的onCreate与onResume量。

我觉得您选择具有根本的问题是,鉴于/活动周期的某些部分需要在开始处理surfaceView和启动prevew与它之前自生自灭。

我不能肯定的说,但这里的许多地方我处理各种相机和表面观的东西,在增强现实应用程序,工程的划分:

 的onCreate()
{
    //只是设置内容视图。做什么用相机或surfaceView还
    的setContentView(R.layout.main);
}

onResume()
{
        // 开放式摄像头
    mCamera = Camera.open();

    //初始化表面观
    SV =(SurfaceView)this.findViewById(R.id.SurfaceView01);
            mHolder = sv.getHolder();
            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            mHolder.setSizeFromLayout();
            mHolder.addCallback(本);
}

surfaceChanged(SurfaceHolder持有人,INT格式,INT W,INT高)
{
    mCamera.set previewDisplay(保持器);
    PARAMS需要//设置任何凸轮...

    mCamera.start preVIEW();
}
 

尝试调整你的code做类似的。我的眼睛得到睡眼惺忪试图算哪里出了NPE是从源发生,但我觉得有几个问题是:

  • 您似乎在试图让参考surfaceview之前你已叫的setContentView()
  • 在您选择直接调用surfaceCreated方法,而不是让它可以通过回调调用。

希望有所帮助。我们会得到这个想通了呢!

I'm trying to code an app that uses the camera. I'm getting a NullPointerException when trying to get the surfaceHolder that i eventually pass to the surfaceCreated() that starts up the camera. is there any situation when the getHolder() returns NULL?

thanks.

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
解决方案

Starting a new answer to hopefully be more clear. Again, I think the root issue is the amount of stuff youre doing in onCreate vs. onResume.

I think the root issue youre having is that some parts of the view/activity lifecycle need to run their course before you start dealing with the surfaceView and starting prevew with it.

I'm not certain of that but here's the breakdown of the various places I deal with various camera and surface view stuff in an augmented reality app that works:

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();
}

Try restructuring your code to do similar. My eyes got bleary trying to count out where the NPE was happening from your source but I think a few problems are:

  • you seem to be trying to get reference to the surfaceview BEFORE youve called setContentView()
  • youre directly calling the surfaceCreated method, rather than letting it be called via the callback.

Hope that helps. We'll get this figured out yet!

这篇关于surfaceView.getHolder没有返回SurfaceHolder的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-27 02:53