我的app相机预览使用 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:尝试在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状态为空调用 onSurfaceTextureAvailable
, mCamera.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 回答
请检查您的 class 名称和构造函数名称
将surfacetexture对象保存为全局变量,如果为null,则尝试从全局变量中获取保存的对象 .