使用Camera TextureView时,在android上出现nullpointerExceptipn
使用使用Camera TextureView时,在android上出现nullpointerExceptipn,android,textureview,Android,Textureview,使用TextureView进行我的应用程序摄像头预览 现在情况,, 在我的应用程序中单击按钮时启动wifiapp Intent intent = getPackageManager().getLaunchIntentForPackage("kr.co.aaa.wifiapp"); startActivity(intent); 此时,在surfacetexturedemployed上调用,onPause @Override public boolean onSurfaceTextureDestr
TextureView
进行我的应用程序摄像头预览
现在情况,,
在我的应用程序中单击按钮时
启动wifiapp
Intent intent = getPackageManager().getLaunchIntentForPackage("kr.co.aaa.wifiapp");
startActivity(intent);
此时,在surfacetexturedemployed上调用,onPause
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
mCamera.setPreviewCallback(null);
mCamera.release();
mCamera = null;
}
在wifiapp中,单击后退按钮
,重新启动我的应用程序
此时,在SurfaceTextureAvailable上调用
@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.CameratextureReview.onSurfaceTextureAvailable上(CameratextureReview.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)
我认为在surfacetexturedemployed上出现NPEonsurfacetexturedemployed
mCamera=null代码>
因为当我的应用程序重新启动时,mCamera状态为null callonSurfaceTextureAvailable
,mCamera.setPreviewTexture(surfaceTexture)
为null
所以我尝试删除mCamera=null
但会出现不同的错误
java.lang.RuntimeException:摄影机在
调用了Camera.release()
在android.hardware.Camera.setPreviewTexture(本机方法)
在kr.co.iosystem.blackeyeonandroid.video.CameratextureReview.onSurfaceTextureAvailable上(CameratextureReview.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)上
在安卓。
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;
}
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
}