- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以,我目前正在尝试转换使用 CameraView 拍摄的照片使用 OpenCV 转换为灰度。拍照后我用Anko为了异步处理它。处理完成后,我将图像写入 MediaStore。该 Activity 有一个 CameraView 和一个用于拍照的 Button。
但是,当我按下按钮时,出现以下异常:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:200)
at android.os.Handler.<init>(Handler.java:114)
at com.otaliastudios.cameraview.CameraUtils.decodeBitmap(CameraUtils.java:101)
at com.otaliastudios.cameraview.CameraUtils.decodeBitmap(CameraUtils.java:83)
at com.example.joao.waterprototype.MainActivity$onCreate$2$onPictureTaken$1.invoke(MainActivity.kt:55)
at com.example.joao.waterprototype.MainActivity$onCreate$2$onPictureTaken$1.invoke(MainActivity.kt:46)
at org.jetbrains.anko.AsyncKt$doAsync$1.invoke(Async.kt:143)
at org.jetbrains.anko.AsyncKt$doAsync$1.invoke(Async.kt)
at org.jetbrains.anko.AsyncKt$sam$java_util_concurrent_Callable$0.call(Async.kt)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
上述问题发生的地方在以下 fragment 中描述:
camera.addCameraListener(object : CameraListener() {
override fun onPictureTaken(jpeg: ByteArray?) {
Toast.makeText(applicationContext, "Image Taken", Toast.LENGTH_SHORT).show()
doAsync() {
lateinit var result : Bitmap
CameraUtils.decodeBitmap(jpeg) {
val mat = Mat()
val bmp32 = it.copy(Bitmap.Config.ARGB_8888, true)
Utils.bitmapToMat(bmp32, mat)
val greyMat = Mat()
cvtColor(mat, greyMat, COLOR_BGRA2GRAY)
result = Bitmap.createBitmap(greyMat.cols(), greyMat.rows(), Bitmap.Config.ARGB_8888)
Utils.matToBitmap(greyMat, result)
}
uiThread {
val title = "${UUID.randomUUID()}.jpg"
val savedImageURL = MediaStore.Images.Media.insertImage(
contentResolver,
result,
title,
"Image of $title"
)
val uri = Uri.parse(savedImageURL)
Toast.makeText(applicationContext, "Image Created at ${uri.path}", Toast.LENGTH_SHORT).show()
}
}
}
})
这些异常的一个共同主题是在使用 Async 上下文时使用 Toasts,但我已经仔细检查过它,并且我很小心不要在那里使用它们。事实上,上述错误发生在 decodeBitmap 调用上。这很奇怪,因为 CameraView 文档坚持说该函数是在工作线程上调用的。你们中的任何人都可以向我解释发生了什么以及如何解决它吗?
为了让它更容易复现,这里是完整的 MainActivity.kt:
package com.example.joao.waterprototype
import android.graphics.Bitmap
import android.net.Uri
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.WindowManager
import android.widget.Toast
import com.otaliastudios.cameraview.CameraListener
import com.otaliastudios.cameraview.CameraUtils
import com.otaliastudios.cameraview.Gesture
import com.otaliastudios.cameraview.GestureAction
import kotlinx.android.synthetic.main.activity_main.*
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.uiThread
import org.opencv.android.OpenCVLoader
import org.opencv.android.Utils
import org.opencv.core.Mat
import org.opencv.imgproc.Imgproc.COLOR_BGRA2GRAY
import org.opencv.imgproc.Imgproc.cvtColor
import java.util.*
class MainActivity : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
camera.setLifecycleOwner(this)
take_photo.setOnClickListener {
camera.capturePicture()
}
camera.mapGesture(Gesture.PINCH, GestureAction.ZOOM); // Pinch to zoom!
camera.mapGesture(Gesture.TAP, GestureAction.FOCUS_WITH_MARKER); // Tap to focus!
camera.mapGesture(Gesture.LONG_TAP, GestureAction.CAPTURE); // Long tap to shoot!
camera.addCameraListener(object : CameraListener() {
override fun onPictureTaken(jpeg: ByteArray?) {
Toast.makeText(applicationContext, "Image Taken", Toast.LENGTH_SHORT).show()
doAsync() {
lateinit var result : Bitmap
CameraUtils.decodeBitmap(jpeg) {
val mat = Mat()
val bmp32 = it.copy(Bitmap.Config.ARGB_8888, true)
Utils.bitmapToMat(bmp32, mat)
val greyMat = Mat()
cvtColor(mat, greyMat, COLOR_BGRA2GRAY)
result = Bitmap.createBitmap(greyMat.cols(), greyMat.rows(), Bitmap.Config.ARGB_8888)
Utils.matToBitmap(greyMat, result)
}
uiThread {
val title = "${UUID.randomUUID()}.jpg"
val savedImageURL = MediaStore.Images.Media.insertImage(
contentResolver,
result,
title,
"Image of $title"
)
val uri = Uri.parse(savedImageURL)
Toast.makeText(applicationContext, "Image Created at ${uri.path}", Toast.LENGTH_SHORT).show()
}
}
}
})
}
companion object {
// Used to load the 'native-lib' library on application startup.
init {
if (!OpenCVLoader.initDebug()) {
Log.e("OpenCV", "Cannot connect to OpenCV Manager")
} else {
Log.e("OpenCV", "Connected Successfully")
}
}
}
}
这是 activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.otaliastudios.cameraview.CameraView
android:id="@+id/camera"
android:keepScreenOn="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/take_photo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Take Photo"
android:textAlignment="center"/>
</LinearLayout>
最佳答案
我相信有一个假设 decodeBitmmap 是从 UI 线程启动的,即使实际工作是在工作线程上完成的。这是有问题的代码......在调用者线程上执行(第 101 行):
final Handler ui = new Handler();
关于类似的问题有一点讨论here
关于android - Kotlin/Anko/OpenCV/CameraView 无法创建处理程序,因为线程尚未调用 Looper.prepare(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52719738/
我打算使用 BeyondAR 框架开发一个安卓应用程序。我尝试在屏幕的前半部分使用 CameraView 组件(应用仅在纵向模式下运行),但是当我将相机旋转 90 度时,图像会拉伸(stretch)并
在我的场景中,我试图创建一个自定义CameraView。在这里,捏合放大和缩小不起作用。我该如何解决这个问题? 下面是我的代码: @IBAction func pinchToZoom(_ send
在阅读本教程后,我写了一个小相机应用程序: http://www.brighthub.com/mobile/google-android/articles/43414.aspx 在模拟器中一切正常(好
我正在查看消息应用程序 Signal 的 Android 代码,并尝试查看捕获的图像字节发送到的位置。 public void takePicture(final Rect previewRect
camerax cameraView 和 previewView 有什么区别?因为我找不到关于比较 2 个 View 以预览 camerax 的资源或文章 最佳答案 PreviewView 是一个自定
我尝试开发一个移动纸板应用程序,它将 3d 对象渲染到相机 View 中(某种 ar)。 我使用了这个项目并尝试在相机中渲染一个简单的立方体: https://github.com/Sveder/Ca
本文整理了Java中com.zx.zxutils.views.CameraView.ZXCameraView类的一些代码示例,展示了ZXCameraView类的具体用法。这些代码示例主要来源于Gith
我有一个副项目,其中包含链接下方的此屏幕。重要的是我想在相机 View 中创建这个屏幕,而不是在图片中。 我正在考虑为此与 Metal 打交道。我该如何编写这段代码,任何建议将不胜感激。谢谢。 htt
我需要从屏幕的所需部分捕获图像。从相机 捕捉图像。 当时其他屏幕内容。 这怎么可能? 最佳答案 尝试使用 Surface View 来创建动态 相机 View 并在您需要的部分进行设置。 下面的代码试
我需要捕获图像 从 屏幕的所需部分。 从相机捕获图像。 当时其他屏幕内容。 这怎么可能? 最佳答案 尝试使用 Surface View 来创建动态 相机 View 并设置在您需要的部分。 下面的代码试
目前 Compose 中没有相当于 CameraView(和 PreviewView)的功能。是否可以将其包装并以组合布局显示? 最佳答案 仍然没有可组合的 CameraX。您需要使用 Android
我正在尝试在干净的 Android 应用程序中包含 CameraView 组件(来自 CameraX jetpack),如下所示: https://medium.com/@hitherejoe/exp
我刚刚解决了这个问题。感谢一些出色的帮助让我走上正轨。 这是我现在拥有的代码。 基本上,我现在可以从绘制的叠加层和 cameraPreview 中制作图像。但还不能将它们结合起来。我能找到的有用代码似
我正在尝试运行这个 example of face detection with the firebase MLkit在安卓系统上。我没有使用内置的 CameraView,而是使用库 CameraVi
所以,我目前正在尝试转换使用 CameraView 拍摄的照片使用 OpenCV 转换为灰度。拍照后我用Anko为了异步处理它。处理完成后,我将图像写入 MediaStore。该 Activity 有
我在我的 android 应用程序中使用 opencv 人脸检测。我面临的问题如下。我实现“PictureCallback”的类在“onPictureTaken”中获取 byte[] 数据,但它与我在
我正在尝试按照 this video 中应用的步骤进行操作实现“实时使用 Firebase ML 的 QR 码阅读器”。 在依赖项中添加这一行时, implementation 'com.ot
我是一名优秀的程序员,十分优秀!