如何使用此代码做得更好,我尝试使用asyncTask类但返回相同的错误。
代码退出错误:此行上的JavaNullPointer addContentView(surface,new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT));
private SurfaceView cameraView;
private String barcodeInfo;
private CameraSource cameraSource;
private Renderer renderer;
private RajawaliSurfaceView surface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//--------------------------------------------------------
//--------------------------------------------------------
cameraView = (SurfaceView) findViewById(R.id.cameraView);
//barcodeInfo = (TextView) findViewById(R.id.infoTextView);
BarcodeDetector detector = new BarcodeDetector.Builder(this).setBarcodeFormats(Barcode.QR_CODE).build();
cameraSource = new CameraSource.Builder(this, detector).setRequestedPreviewSize(640, 480).build();
cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
cameraSource.start(cameraView.getHolder());
} catch (IOException e) {
Log.e("CAMERA SOURCE", e.getMessage());
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
cameraSource.stop();
}
});
detector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() {
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
release();
final SparseArray<Barcode> barcodes = detections.getDetectedItems();
if (barcodes.size() == 1) {
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
muestraMono();
}
});
}
}
});
}
public void muestraMono(){
setContentView(R.layout.activity_main);
RajawaliSurfaceView surface = new RajawaliSurfaceView(this);
surface.setFrameRate(60.0);
surface.setRenderMode(IRajawaliSurface.RENDERMODE_WHEN_DIRTY);
surface.setTransparent(true);
addContentView(surface, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT));
renderer = new Renderer(this);
surface.setSurfaceRenderer(renderer);
}
E / AndroidRuntime:致命异常:主要 处理:com.dsinteg.lectorqr,PID:2822 显示java.lang.NullPointerException 在android.opengl.GLSurfaceView.onResume(GLSurfaceView.java:567) 在 org.rajawali3d.surface.RajawaliSurfaceView.onResume(RajawaliSurfaceView.java:106) 在 org.rajawali3d.surface.RajawaliSurfaceView.onAttachedToWindow(RajawaliSurfaceView.java:125) 在android.view.View.dispatchAttachedToWindow(View.java:12618) 在android.view.ViewGroup.addViewInner(ViewGroup.java:3621) 在android.view.ViewGroup.addView(ViewGroup.java:3435) 在android.view.ViewGroup.addView(ViewGroup.java:3411) 在 com.android.internal.policy.impl.PhoneWindow.addContentView(PhoneWindow.java:321) 在android.app.Activity.addContentView(Activity.java:2016) 在com.dsinteg.lectorqr.MainActivity.muestraMono(MainActivity.java:93) 在com.dsinteg.lectorqr.MainActivity $ 2 $ 1.run(MainActivity.java:81) 在android.os.Handler.handleCallback(Handler.java:733) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:136) 在android.app.ActivityThread.main(ActivityThread.java:5336) at java.lang.reflect.Method.invokeNative(Native Method) 在java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:871) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) 在dalvik.system.NativeStart.main(本地方法)
答案 0 :(得分:0)
试试这个,
getWindow().addContentView(surface, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT));
发生错误,因为活动不知道父母。
答案 1 :(得分:0)
SetContentView
将覆盖布局,并将其替换为新布局。通常,您只想在onCreate
中执行此操作一次。你可以做得更多,但它涉及重新绘制整个布局,所以尝试删除这一行
setContentView(R.layout.activity_main);
使用muestraMono
方法。
<强>更新强>
像这样创建方法
public void muestraMono(){
surface = new RajawaliSurfaceView(this); // make RajawaliSurfaceView a class variable
surface.setFrameRate(60.0);
surface.setRenderMode(IRajawaliSurface.RENDERMODE_WHEN_DIRTY);
surface.setTransparent(true);
addContentView(surface, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT));
renderer = new Renderer(this);
surface.setSurfaceRenderer(renderer);
}
然后在onCreate
中调用此方法,在扫描QR码后再次调用此方法