android - 捕获图像动作有时仅在没有明确原因的情况下有效
问题描述
我正在使用 cameraKit 来处理我的相机活动。我现在的问题是,有时它工作得很好,有时它根本就不行。正如您在下面的代码中看到的那样,我插入了一堆日志打印。有时它会遍历所有日志,有时只会打印“单击按钮”。
无法弄清楚为什么它不一致:
*我已经尝试运行并重新运行它大约 0 次,以便在不更改任何内容的情况下进行检查,但结果并不一致。
class CameraFragment : Fragment() {
lateinit var cameraKitView: CameraKitView
private lateinit var localImageViewModel: LocalImageViewModel
override fun onAttach(context: Context) {
super.onAttach(context)
activity?.let {
localImageViewModel = ViewModelProviders.of(this).get(LocalImageViewModel::class.java)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(co.getdere.R.layout.fragment_camera, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val mActivity = activity as CameraActivity
cameraKitView = view.findViewById(co.getdere.R.id.camera_view)
cameraKitView.aspectRatio = 0.8f
val captureButton = view.findViewById<ImageButton>(co.getdere.R.id.camera_btn)
captureButton.setOnClickListener {
Log.d("photoActivity", "button clicked")
cameraKitView.captureImage { _, image ->
Log.d("photoActivity", "image captured")
val timeStamp = System.currentTimeMillis().toString()
val fileName = "Dere$timeStamp.jpg"
val path =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() + File.separator + "Dere"
val outputDir = File(path)
outputDir.mkdir()
val savedPhoto = File(path + File.separator + fileName)
Log.d("photoActivity", "new file created")
try {
val outputStream = FileOutputStream(savedPhoto.path)
outputStream.write(image)
outputStream.close()
mActivity.sendBroadcast(Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(savedPhoto)))
Log.d("photoActivity", "Image saved to file and system rescaned the device")
Glide.with(this).load(savedPhoto).into(mActivity.photoEditorFragment.view!!.findViewById(R.id.photo_editor_image))
Log.d("photoActivity", "image loaded into new fragment")
mActivity.switchVisibility(1)
Log.d("photoActivity", "visibility switched")
val localImagePost = LocalImagePost(2343, savedPhoto.path)
Log.d("photoActivity", "Took photo")
localImageViewModel.insert(localImagePost)
} catch (e: java.io.IOException) {
e.printStackTrace()
Log.d("photoActivity", "failed to take photo")
}
}
}
}
override fun onStart() {
super.onStart()
cameraKitView.onStart()
}
override fun onResume() {
super.onResume()
cameraKitView.onResume()
}
override fun onPause() {
cameraKitView.onPause()
super.onPause()
}
override fun onStop() {
cameraKitView.onStop()
super.onStop()
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
cameraKitView.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
override fun onDetach() {
super.onDetach()
stopRepeatingTask()
}
companion object {
fun newInstance(): CameraFragment = CameraFragment()
}
}
解决方案
如果您将它用于其他应用程序,我确实为您提供建议。使用非测试版。完美运行。当前版本:v0.13.4 文档虽然已经过时。
新用法:
cameraKit.addCameraKitListener(object : CameraKitEventListener {
override fun onVideo(video: CameraKitVideo?) {
Log.i("camera", "onVideo")
}
override fun onEvent(event: CameraKitEvent?) {
Log.i("camera", "onEvent: $event")
}
override fun onImage(capturedImage: CameraKitImage?) {
Log.i("camera", "onImage")
capturedImage?.let { image ->
cameraViewModel.saveAndCompressImage(image.jpeg)
}
}
override fun onError(e: CameraKitError?) {
Log.i("camera", "onError: ${e?.exception}")
}
})
推荐阅读
- python - 机器学习编码分类数据回归的潜在问题
- c++ - C++ Google 代码风格询问接口
- java - Do-While 循环不循环 - Java
- python - ModuleNotFoundError:没有名为“数据”的模块
- sql - 即使没有价值,也用未来日期填充行
- reactjs - 使用 useImperativeHandle 控制子状态是一种不好的做法吗?
- python - IndexError:索引 n 超出轴 1 的范围,大小为 n
- postgresql - 如何使用外部客户端提供的任意 JSONB 查询字符串防止 SQL 注入?
- java - 如何回答这个Java面试问题:解释服务器如何知道文件上传完成
- c# - 如何让一段代码每 x 秒重复一次?