Я работаю с дополненной реальностью, и хочу нарисовать линию, которая соединяет два подвижных объекта на верхней части камеры. Однако я получаю это исключениеЛиния холста на холсте Android на камеру
Process: test.job.reality.augument.job.com.augumentrealitytest, PID: 15056
java.lang.IllegalArgumentException
at android.view.Surface.nativeLockCanvas(Native Method)
at android.view.Surface.lockCanvas(Surface.java:266)
at custom.MyCameraView$MyThread.run(MyCameraView.java:447)
Вот мой код, как вы можете видеть, что я начинаю свою нить в surfaceCreted
методе. Я думаю, что я не могу заблокировать Canvas, потому что это: готово заблокировано камерой, я прав? Однако я рисовать линию возможно (я использую beyondAR
augumented библиотеку реальности)
public class MyCameraView extends SurfaceView implements SurfaceHolder.Callback, Camera.PictureCallback {
private MyThread thread;
public MyCameraView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
@SuppressWarnings("deprecation")
private void init(Context context) {
mIsPreviewing = false;
mHolder = getHolder();
mHolder.addCallback(this);
configureCamera();
if (Build.VERSION.SDK_INT <= 10) {// Android 2.3.x or lower
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
thread=new MyThread(getHolder(),this);
getHolder().addCallback(this);
setFocusable(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, acquire the camera and tell it where
// to draw.
thread.startrun(true);
thread.start();
try {
if (mCamera == null) {
init(getContext());
if (mCamera == null) {
return;
}
}
mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
if (mCamera != null) {
mCamera.release();
}
mCamera = null;
Logger.e(TAG, "CameraView -- ERROR en SurfaceCreated", exception);
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
thread.startrun(false);
thread.stop();
}
public class MyThread extends Thread{
private SurfaceHolder msurfaceHolder;
private MyCameraView mSurfaceView;
private boolean mrun =false;
public MyThread(SurfaceHolder holder, MyCameraView mSurfaceView) {
this.msurfaceHolder = holder;
this.mSurfaceView=mSurfaceView;
}
public void startrun(boolean run) {
mrun=run;
}
@SuppressLint("WrongCall")
@Override
public void run() {
super.run();
Canvas canvas;
while (mrun) {
canvas=null;
try {
canvas = msurfaceHolder.lockCanvas();
synchronized (msurfaceHolder) {
mSurfaceView.onDraw(canvas);
}
} finally {
if (canvas != null) {
msurfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
}