【问题标题】:When using Camera TextureView , occur nullpointerExceptipn on android使用 Camera TextureView 时,会在 android 上出现 nullpointerExceptipn
【发布时间】:2018-01-01 05:20:35
【问题描述】:

我的应用相机预览使用TextureView。

现在的情况, 当在我的应用程序中点击 button 启动 wifiapp

Intent intent = getPackageManager().getLaunchIntentForPackage("kr.co.aaa.wifiapp");
startActivity(intent);

此时,拨打onSurfaceTextureDestroyed,onPause

@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
    mCamera.setPreviewCallback(null);
    mCamera.release();
    mCamera = null;
}

在wifiapp中,点击返回button,重启我的应用。

此时,拨打onSurfaceTextureAvailable

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
  try {  
       mCamera.setPreviewTexture(surfaceTexture);  //NPE
       mCamera.startPreview();
  } catch (IOException e) {
      e.printStackTrace();
  }
}

重新启动我的应用程序时,发生 NullPointerException

java.lang.NullPointerException: 尝试调用虚方法 'void android.hardware.Camera.setPreviewTexture(android.graphics.SurfaceTexture)' 在空对象引用上 在 kr.co.iosystem.blackeyeonandroid.video.CameraTextureView.onSurfaceTextureAvailable(CameraTextureView.java:82) 在 android.view.TextureView.getHardwareLayer(TextureView.java:368) 在 android.view.View.updateDisplayListIfDirty(View.java:15157) 在 android.view.View.draw(View.java:15954) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3609) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 在 android.view.View.draw(View.java:16187) 在 android.view.View.updateDisplayListIfDirty(View.java:15180) 在 android.view.View.draw(View.java:15954) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3609) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 在 android.view.View.updateDisplayListIfDirty(View.java:15175) 在 android.view.View.draw(View.java:15954) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3609) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 在 android.view.View.draw(View.java:16187) 在 android.view.View.updateDisplayListIfDirty(View.java:15180) 在 android.view.View.draw(View.java:15954) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3609) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 在 android.view.View.updateDisplayListIfDirty(View.java:15175) 在 android.view.View.draw(View.java:15954) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3609) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 在 android.view.View.updateDisplayListIfDirty(View.java:15175) 在 android.view.View.draw(View.java:15954) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3609) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 在 android.view.View.draw(View.java:16187) 在 com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2690) 在 android.view.View.updateDisplayListIfDirty(View.java:15180) 在 android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:282) 在 android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:288) 在 android.view.ThreadedRenderer.draw(ThreadedRenderer.java:323) 在 android.view.ViewRootImpl.draw(ViewRootImpl.java:2609) 在 android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2428) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2061) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6007) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 在 android.view.Choreographer.doCallbacks(Choreographer.java:670) 在 android.view.Choreographer.doFrame(Choreographer.java:606) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5415) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)

我认为发生 NPE onSurfaceTextureDestroyed mCamera = null; 。

因为当我的应用重新启动时,mCamera 状态为 null 调用 onSurfaceTextureAvailable ,mCamera.setPreviewTexture(surfaceTexture) 为 null。

所以我尝试删除mCamera = null

但出现不同的错误。

java.lang.RuntimeException: 之后正在使用相机 Camera.release() 被调用 在 android.hardware.Camera.setPreviewTexture(本机方法) 在 kr.co.iosystem.blackeyeonandroid.video.CameraTextureView.onSurfaceTextureAvailable(CameraTextureView.java:82) 在 android.view.TextureView.getHardwareLayer(TextureView.java:368) 在 android.view.View.updateDisplayListIfDirty(View.java:15157) 在 android.view.View.draw(View.java:15954) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3609) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 在 android.view.View.draw(View.java:16187) 在 android.view.View.updateDisplayListIfDirty(View.java:15180) 在 android.view.View.draw(View.java:15954) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3609) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 在 android.view.View.updateDisplayListIfDirty(View.java:15175) 在 android.view.View.draw(View.java:15954) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3609) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 在 android.view.View.draw(View.java:16187) 在 android.view.View.updateDisplayListIfDirty(View.java:15180) 在 android.view.View.draw(View.java:15954) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3609) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 在 android.view.View.updateDisplayListIfDirty(View.java:15175) 在 android.view.View.draw(View.java:15954) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3609) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 在 android.view.View.updateDisplayListIfDirty(View.java:15175) 在 android.view.View.draw(View.java:15954) 在 android.view.ViewGroup.drawChild(ViewGroup.java:3609) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399) 在 android.view.View.draw(View.java:16187) 在 com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2690) 在 android.view.View.updateDisplayListIfDirty(View.java:15180) 在 android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:282) 在 android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:288) 在 android.view.ThreadedRenderer.draw(ThreadedRenderer.java:323) 在 android.view.ViewRootImpl.draw(ViewRootImpl.java:2609) 在 android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2428) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2061) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6007) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 在 android.view.Choreographer.doCallbacks(Choreographer.java:670) 在 android.view.Choreographer.doFrame(Choreographer.java:606) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5415) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)

这个错误mCamera.setPrevieTexture(surfaceTexture)

如何解决这个问题?

谢谢。

完整来源

public class CameraTexture extends TextureView implement TextureView.SurfaceTextureListener {
  private Camera mCamera;
  private TextureView mTextureView;

  public CameraTexture(Context context, LiveCamera liveCamera) {
    super(context);

    mCamera = liveCamera.camera;

    mTextureVeiw = (TextureView) activity.findViewById(R.id.live);
    mTextureView.setSurfaceTextureListener(this);
 }

 @Override 
 public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {

   try {
      mCamera.setPreviewTexture(surfaceTexture);
      mCamera.startPreview();
   } catch (IOException e) {
      e.printStackTrace();
   } 
 }

 @Override 
 public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i2) {
 }

 @Override
 public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
       mCamera.setPreviewCallback(null);
       mCamera.release();
       mCamera = null; // if delete this line, occur Camera is being used after Camera.release() was called  error
 }

 @Override
 public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
    Bitmap bitmap = mTextureView.getBitmap();

    int width = bitmap.getWidth();
    int height = bitmap.getHeight();

    int[] pixels = new int[bitmap.getHeight() * bitmap.getWidth()];
    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
 }
 }


public class LiveCamera {
   public Camera camera;
}

如果需要更多信息。请评论。 谢谢!

【问题讨论】:

  • @MCEmperor ,我知道为什么会出现nullpointerException,但是我不知道这个问题..
  • public CameraTextureView(Context context, LiveCamera liveCamera)是这个构造函数吗??
  • @UpendraShah 是的,这是构造函数。更新 LiveCamera 源。谢谢

标签: android textureview


【解决方案1】:

请检查你的类名和构造函数名

public class CameraTexture extends TextureView implement TextureView.SurfaceTextureListener {
  private Camera mCamera;
  private TextureView mTextureView;

  public CameraTexture(Context context, LiveCamera liveCamera) {
    super(context);

    mCamera = liveCamera.camera;

    mTextureVeiw = (TextureView) activity.findViewById(R.id.live);
    mTextureView.setSurfaceTextureListener(this);
 }

//your remain code

}

【讨论】:

  • 对不起,构造函数名称是错字对不起
【解决方案2】:

将surfacetexture对象保存到一个全局变量中,如果它为null,则尝试从全局变量中获取保存的对象..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2017-12-21
    相关资源
    最近更新 更多