【问题标题】:Updating MainActivity's TextView in ImageReader's OnImageAvailable在 ImageReader 的 OnImageAvailable 中更新 MainActivity 的 TextView
【发布时间】:2017-03-19 18:07:09
【问题描述】:

我的任务是从相机获取预览帧,处理它们并在我的布局中更新 TextView。我指的是 google 的 camera2 示例代码,并已设法使用 OnImageAvailableListener 的 OnImageAvailable() 方法获取帧,但我无法更新我的 TextView 在OnImageAvailable() 定义中的内容(应用程序崩溃)。我对 Android 编程和 java 还很陌生。获取每一帧后更新我的 TextView 的任何方式。

OnImageAvailable的定义(片段的一部分,不是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)

【问题讨论】:

  • 将您的详细代码放入“OnImageAvailable()”
  • 也发布崩溃

标签: java android android-camera2


【解决方案1】:

你需要把它放在一个可运行/线程中。我不太熟悉它,但也许这可能会有所帮助,但如果没有,我非常确定它指向了解决方案的正确方向

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();
                }
            }
            }

    }
    };

【讨论】:

  • OnImageAvailable() 定义在一个片段中,而不是在主活动中。我试过 getactivity().runOnUIThread() 并且它有效。非常感谢。
猜你喜欢
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
相关资源
最近更新 更多