Я хотел бы сначала обратиться к этому вопросу .
У меня та же проблема, и этот вопрос никогда не был решен. Предложенное решение не работает, и я полностью озадачен.
Любая помощь будет принята с благодарностью.
Исключение выдается, когда я пытаюсь изменить макет текущего действия, в частности, на okButton.setVisibility (View.VISIBLE), я убежден, что это проблема в потоке:
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Log.i(TAG, "Saving a bitmap to file");
Toast.makeText(context,"Not Starting New Activity. Look at me now error!",Toast.LENGTH_LONG).show();;
//attempt to export all this to JavaCameraView, i have a feeling that there is a conflict with his thread....maybe that will help
buttonManager(data);
}
private void buttonManager(byte[] data) {
//find buttons
final byte[] img_data = data;
final int width = this.getWidth();
final int height = this.getHeight();
okButton.setVisibility(View.VISIBLE);
retryButton.setVisibility(View.VISIBLE);
captureImageButton.setVisibility(View.GONE);
okButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent startImgProc = new Intent(context,ImageProcessing.class);
startImgProc.putExtra("image",img_data);
startImgProc.putExtra("width",width);
startImgProc.putExtra("height",height);
disconnectCamera();
context.startActivity(startImgProc);
((Activity) context).finish();
}
});
retryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
captureImageButton.setVisibility(View.VISIBLE);
okButton.setVisibility(View.GONE);
retryButton.setVisibility(View.GONE);
}
});
}
Соответствующий код на холсте:
protected void deliverAndDrawFrame(CvCameraViewFrame frame) {
Mat modified;
if (mListener != null) {
modified = mListener.onCameraFrame(frame);
} else {
modified = frame.rgba();
}
boolean bmpValid = true;
if (modified != null) {
try {
Utils.matToBitmap(modified, mCacheBitmap);
} catch(Exception e) {
Log.e(TAG, "Mat type: " + modified);
Log.e(TAG, "Bitmap type: " + mCacheBitmap.getWidth() + "*" + mCacheBitmap.getHeight());
Log.e(TAG, "Utils.matToBitmap() throws an exception: " + e.getMessage());
bmpValid = false;
}
}
if (bmpValid && mCacheBitmap != null) {
Canvas canvas = getHolder().lockCanvas();
if (canvas != null) {
canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);
Log.d(TAG, "mStretch value: " + mScale);
if (mScale != 0) {
canvas.drawBitmap(mCacheBitmap, new Rect(0, 0, mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
new Rect((int) ((canvas.getWidth() - mScale * mCacheBitmap.getWidth()) / 2),
(int) ((canvas.getHeight() - mScale * mCacheBitmap.getHeight()) / 2),
(int) ((canvas.getWidth() - mScale * mCacheBitmap.getWidth()) / 2 + mScale * mCacheBitmap.getWidth()),
(int) ((canvas.getHeight() - mScale * mCacheBitmap.getHeight()) / 2 + mScale * mCacheBitmap.getHeight())), null);
} else {
canvas.drawBitmap(mCacheBitmap, new Rect(0, 0, mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
new Rect((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,
(canvas.getHeight() - mCacheBitmap.getHeight()) / 2,
(canvas.getWidth() - mCacheBitmap.getWidth()) / 2 + mCacheBitmap.getWidth(),
(canvas.getHeight() - mCacheBitmap.getHeight()) / 2 + mCacheBitmap.getHeight()), null);
}
if (mFpsMeter != null) {
mFpsMeter.measure();
mFpsMeter.draw(canvas, 20, 30);
}
getHolder().unlockCanvasAndPost(canvas);
}
}
это код с потоком, который управляет вышеуказанным кодом
private class CameraWorker implements Runnable {
@Override
public void run() {
do {
boolean hasFrame = false;
synchronized (JavaCameraView.this) {
try {
while (!mCameraFrameReady && !mStopThread) {
JavaCameraView.this.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
if (mCameraFrameReady)
{
mChainIdx = 1 - mChainIdx;
mCameraFrameReady = false;
hasFrame = true;
}
}
if (!mStopThread && hasFrame) {
if (!mFrameChain[1 - mChainIdx].empty())
deliverAndDrawFrame(mCameraFrame[1 - mChainIdx]);
}
} while (!mStopThread);
Log.d(TAG, "Finish processing thread");
}
}
и трассировка стека
E/SurfaceHolder: Exception locking surface
java.lang.IllegalArgumentException
at android.view.Surface.nativeLockCanvas(Native Method)
at android.view.Surface.lockCanvas(Surface.java:267)
at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:973)
at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:941)
at org.opencv.android.CameraBridgeViewBase.deliverAndDrawFrame(CameraBridgeViewBase.java:405)
at org.opencv.android.JavaCameraView$CameraWorker.run(JavaCameraView.java:308)
at java.lang.Thread.run(Thread.java:818)