Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – surfaceView.getHolder没有返回SurfaceHolder大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写使用相机的应用程序.在尝试获取我最终传递给启动摄像头的surfaceCreated()的surfaceHolder时,我得到一个NullPointerException. getHolder()返回NULL时有什么情况吗?

谢谢.

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.to@R_696_10495@ng());

        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

解决方法

开始一个新的答案,希望更清楚.同样,我认为根本问题是你在onCreate和onResume上做的事情的数量.

我认为您遇到的根本问题是视图/活动生命周期的某些部分需要在开始处理surfaceView并开始使用它之前运行它们的过程.

我不确定这一点,但是这里有各种各样的地方的故障,我在一个增强现实应用程序中处理各种相机和表面视图的东西:

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 h)
{
    mCamera.setPreviewDisplay(holder);
    // set any cam params you need...

    mCamera.startPreview();
}

尝试重构代码以执行类似操作.我的眼睛变得闷闷不乐试图从你的来源算出NPE的发生地点,但我认为有一些问题是:

>你似乎试图在调用setContentView()之前尝试引用surfaceview@H_618_19@>你直接调用surfaceCreated方法,而不是让它通过回调调用.

希望有所帮助.我们还能解决这个问题!

大佬总结

以上是大佬教程为你收集整理的android – surfaceView.getHolder没有返回SurfaceHolder全部内容,希望文章能够帮你解决android – surfaceView.getHolder没有返回SurfaceHolder所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。