我的任务是从相机获取预览帧,处理它们并更新布局中的 TextView。我引用了 google 的camera2示例代码,并成功使用 OnImageAvailableListener 的 OnImageAvailable()
方法获取帧,但我无法在 OnImageAvailable()
定义中更新 TextView 的内容(应用程序崩溃)。我对 Android 编程和 java 相当陌生。获取每一帧后更新我的 TextView 的任何方法。
OnImageAvailable 的定义( fragment 的一部分,不是 CameraActivity,如 google 的示例):
public final ImageReader.OnImageAvailableListener mOnImageAvailableListener
= new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = null;
try {
image = reader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] imageBytes = new byte[buffer.remaining()];
buffer.get(imageBytes);
final Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
textView.append("a"); // crashes here
} finally {
if (image != null) {
image.close();
}
}
}
};
来自 Android Monitor 的崩溃日志:
03-19 13:14:12.384 13895-14107/com.example.android.camera2basic E/AndroidRuntime: FATAL EXCEPTION: CameraBackground
Process: com.example.android.camera2basic, PID: 13895
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6462)
at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:932)
at android.view.ViewGroup.invalidateChild(ViewGroup.java:4692)
at android.view.View.invalidateInternal(View.java:11806)
at android.view.View.invalidate(View.java:11770)
at android.view.View.invalidate(View.java:11754)
at android.widget.TextView.checkForRelayout(TextView.java:6867)
at android.widget.TextView.setText(TextView.java:4063)
at android.widget.TextView.setText(TextView.java:3921)
at android.widget.TextView.append(TextView.java:3627)
at android.widget.TextView.append(TextView.java:3617)
at com.example.android.camera2basic.Camera2BasicFragment$6.onImageAvailable(Camera2BasicFragment.java:760)
at android.media.ImageReader$ListenerHandler.handleMessage(ImageReader.java:548)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.os.HandlerThread.run(HandlerThread.java:61)
最佳答案
您需要将其放入可运行/线程中。我不太熟悉它,但也许这可能有帮助,但如果没有,我非常确定它指向解决方案的正确方向
public final ImageReader.OnImageAvailableListener mOnImageAvailableListener
= new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(final ImageReader reader) {
Image image = null;
try {
image = reader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] imageBytes = new byte[buffer.remaining()];
buffer.get(imageBytes);
final Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
YourClassNameHere.this.runOnUIThread(new Runnable() {
@Override
public void run() {
textView.append("a"); // crashes here
});
} finally {
if (image != null) {
image.close();
}
}
}
}
};
关于java - 在ImageReader的OnImageAvailable中更新MainActivity的TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42883971/