首页 文章

使用Camera TextureView时,在android上发生nullpointerExceptipn

提问于
浏览
0

我的app相机预览使用 TextureView .

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

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

这时,请致电 onSurfaceTextureDestroyedonPause

@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:尝试在kr.co.iosystem.blackeyeonandroid.video.CameraTextureView.onSurfaceTextureAvailable(CameraTextureView)上的空对象引用上调用虚拟方法'void android.hardware.Camera.setPreviewTexture(android.graphics.SurfaceTexture)' .java:82)在Android.view.View.View.draw(View.java:15954)的android.view.TextureView.getHardwareLayer(TextureView.java:368)android.view.View.updateDisplayListIfDirty(View.java:15157)在Android.view上的android.view.View.Davatch:事件处的android.view.View.Dav(:View.java:16187)的android.view.ViewGroup.drawChild(ViewGroup.java:3609) . 在android.view.View.D.David(View.java:15180)上的android.view.View.Go.(View.java:15954)在android.view.ViewGroup.DispatchDraw(ViewGroup.java:3609) .java:3399)在android.view.View.View.David(View.java:15175)上的android.view.View.View.David(View.java:15175)在android.view.ViewGroup.drawChild(ViewGroup.jav) a:3609)在Android.view.View.View.David(View.java:15180)上的android.view.View.Dis上的android.view.View.DavatchDraw(View.java:3318)上的android.view.View. android.view.view.draw(View.java:15954)在Android.view.View.View的View.View.View上的android.view.ViewGroup.DavatchDraw(ViewGroup.java:3399)的android.view.ViewGroup.drawChild(ViewGroup.java:3609)位于android.view.View.D.David(View.java:15175)的android.view.View.draw(View.java:15954)位于android.view.ViewGroup.DavatchDraw上的android.view.ViewGroup.drawChild(ViewGroup.java:3609)上的.updateDisplayListIfDirty(View.java:15175) java:3399)在android.view.View.View.Start(View.java:15954)的android.view.View.View.Start(View.java:15954)上的android.view.View.View.View( . View.java:15954)处的android.view.View.updateDisplayListIfDirty(View.java:15175)在android.view.View.draw(View.java:16187)的android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)com.android.internal.policy.PhoneWindow $ DecorView.draw(PhoneWindow.java:2690)在android.view.ThreadedRenderer的android.view.View.updateDisplayListIfDirty(View.java:15180) . 位于android.view.ThredeRerIrer.draw(ViewRootImpl.java)android.view.ThreadedRenderer.draw(ThreadedRenderer.java:323)的android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:288)的updateViewTreeDisplayList(ThreadedRenderer.java:282) :2609)android.view.ViewRootImpl.performDvers(ViewRootImpl.java:2428)在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)的android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2061) .view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:6007)在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:858)的android.view.Choreographer.doCallbacks(Choreographer.java:670) . 在android.view.Handler的android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:844)的android.O. .dispatchMessage(Handler.java:95)在android.app.ActivityThrea的android.os.Looper.loop(Looper.java:148) d.main(ActivityThread.java:5415)位于com.android的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:745)的java.lang.reflect.Method.invoke(Native Method)中 . internal.os.ZygoteInit.main(ZygoteInit.java:635)

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

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

所以我试着删除 mCamera = null

但会出现不同的错误 .

java.lang.RuntimeException:在kr.co.iosystem.blackeyeonandroid.video.CameraTextureView.onSurfaceTextureAvailable(CameraTextureView.java:)的android.hardware.Camera.setPreviewTexture(Native Method)中调用Camera.release()之后正在使用Camera . 82)在android.view.TextureView.getHardwareLayer(TextureView.java:368)的android.view.View.View.David(View.java:15157)安卓android.view.View.David(View.java:15154) . 在android.view.View.View.DavidDisplayListIfDirty的android.view.View.draw(View.java:16187)的android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)上查看.ViewGroup.drawChild(ViewGroup.java:3609) (View.java:15180)在Android.view.View.DavatchDraw(ViewGroup.java)上的android.view.View.draw(View.java:15954)处于android.view.ViewGroup.drawChild(ViewGroup.java:3609) 3399)在android.view.View.View.David(View.java:15954)上的android.view.View.View.Start(View.java:15954)安卓android.view.view.draw((View.java:15954) . view.ViewGro up.dispatchDraw(ViewGroup.java:3399)在android.view.View.draw(View.java:16187)的android.view.View.updateDisplayListIfDirty(View.java:15180)at atandroid.view.view.draw(View.java:15954)在Android.view.View.View的View.View.View上的android.view.ViewGroup.DavatchDraw(ViewGroup.java:3399)的android.view.ViewGroup.drawChild(ViewGroup.java:3609)位于android.view.View.D.David(View.java:15175)的android.view.View.draw(View.java:15954)位于android.view.ViewGroup.DavatchDraw上的android.view.ViewGroup.drawChild(ViewGroup.java:3609)上的.updateDisplayListIfDirty(View.java:15175) java:3399)在android.view.View.View.Start(View.java:15954)的android.view.View.View.Start(View.java:15954)上的android.view.View.View.View( . View.java:15954)处的android.view.View.updateDisplayListIfDirty(View.java:15175)在android.view.View.draw(View.java:16187)的android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)com.android.internal.policy.PhoneWindow $ DecorView.draw(PhoneWindow.java:2690)在Android.view上的android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:282)的android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:288)的android.view.View.updateDisplayListIfDirty(View.java:15180) . ThreadedRenderer.draw(THRE adedRenderer.java:323)在Android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2061)的android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2428)的android.view.ViewRootImpl.draw(ViewRootImpl.java:2609) )在android.view.ViewRootImpl上的android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107),在android.view.Choreographer $ TraversalRunnable.run(ViewRootImpl.java:6007)$ CallbackRecord.run(Choreographer.java:858)在android.view.Chocographer.doCallbacks(Choreographer.java:670)的android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:844)上的android.view.Choreographer.doFrame(Choreographer.java:606) . os.Handler.handleCallback(Handler.java:739)位于android.app.AutT.read上的android.O.Roper.loop(Looper.java:148)的android.os.Handler.dispatchMessage(Handler.java:95) (ActivityThread.java:5415)位于com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:745)的com.andr上的java.lang.reflect.Method.invoke(Native Method) oid.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;
}

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

2 回答

  • 0

    请检查您的 class 名称和构造函数名称

    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
    
    }
    
  • 0

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

相关问题