点了拍照键没反应,查看AVD里面的相册没有照片。但如果用AVD的camera app拍照是可以存住照片的。
我在几个函数的开头都设置了断点进行单步执行,logcat均没有Error产生。
package com.example.cameraxapp
import android.Manifest
import android.content.ContentValues
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.ImageCapture
import androidx.camera.video.Recorder
import androidx.camera.video.Recording
import androidx.camera.video.VideoCapture
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.example.cameraxapp.databinding.ActivityMainBinding
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.core.Preview
import androidx.camera.core.CameraSelector
import android.util.Log
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.ImageCaptureException
import androidx.camera.core.ImageProxy
import androidx.camera.video.FallbackStrategy
import androidx.camera.video.MediaStoreOutputOptions
import androidx.camera.video.Quality
import androidx.camera.video.QualitySelector
import androidx.camera.video.VideoRecordEvent
import androidx.core.content.PermissionChecker
import java.nio.ByteBuffer
import java.text.SimpleDateFormat
import java.util.Locale
typealias LumaListener = (luma: Double) -> Unit
class MainActivity : AppCompatActivity() {
private lateinit var viewBinding: ActivityMainBinding
private var imageCapture: ImageCapture? = null
private var videoCapture: VideoCapture<Recorder>? = null
private var recording: Recording? = null
private lateinit var cameraExecutor: ExecutorService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
// Request camera permissions
if (allPermissionsGranted()) {
startCamera()
} else {
requestPermissions()
}
// Set up the listeners for take photo and video capture buttons
viewBinding.imageCaptureButton.setOnClickListener { takePhoto() }
viewBinding.videoCaptureButton.setOnClickListener { captureVideo() }
cameraExecutor = Executors.newSingleThreadExecutor()
}
private fun takePhoto() {
// Get a stable reference of the modifiable image capture use case
val imageCapture = imageCapture ?: return
// Create time stamped name and MediaStore entry.
val name = SimpleDateFormat(FILENAME_FORMAT, Locale.US)
.format(System.currentTimeMillis())
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, name)
put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/CameraX-Image")
}
}
// Create output options object which contains file + metadata
val outputOptions = ImageCapture.OutputFileOptions
.Builder(contentResolver,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
contentValues)
.build()
// Set up image capture listener, which is triggered after photo has
// been taken
imageCapture.takePicture(
outputOptions,
ContextCompat.getMainExecutor(this),
object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
Log.e(TAG, "Photo capture failed: ${exc.message}", exc)
}
override fun
onImageSaved(output: ImageCapture.OutputFileResults){
val msg = "Photo capture succeeded: ${output.savedUri}"
Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
Log.d(TAG, msg)
}
}
)
}
private fun captureVideo() {}
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
// Used to bind the lifecycle of cameras to the lifecycle owner
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(viewBinding.viewFinder.surfaceProvider)
}
// Select back camera as a default
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
// Unbind use cases before rebinding
cameraProvider.unbindAll()
// Bind use cases to camera
cameraProvider.bindToLifecycle(
this, cameraSelector, preview)
} catch(exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(this))
}
private fun requestPermissions() {
activityResultLauncher.launch(REQUIRED_PERMISSIONS)
}
private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
ContextCompat.checkSelfPermission(
baseContext, it) == PackageManager.PERMISSION_GRANTED
}
override fun onDestroy() {
super.onDestroy()
cameraExecutor.shutdown()
}
companion object {
private const val TAG = "CameraXApp"
private const val FILENAME_FORMAT = "yyyy-MM-dd-HH-mm-ss-SSS"
private val REQUIRED_PERMISSIONS =
mutableListOf (
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO
).apply {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
}.toTypedArray()
}
private val activityResultLauncher =
registerForActivityResult(
ActivityResultContracts.RequestMultiplePermissions())
{ permissions ->
// Handle Permission granted/rejected
var permissionGranted = true
permissions.entries.forEach {
if (it.key in REQUIRED_PERMISSIONS && it.value == false)
permissionGranted = false
}
if (!permissionGranted) {
Toast.makeText(baseContext,
"Permission request denied",
Toast.LENGTH_SHORT).show()
} else {
startCamera()
}
}
}
android studio版本:Android Studio Meerkat | 2024.3.1 Patch 1
教程地址: https://developer.android.google.cn/codelabs/camerax-getting-started#0
点击运行,logcat中出现的“package:mine level:error”的error如下:
--------- beginning of main
--------- beginning of system
2025-03-25 14:52:04.745 598-1747 AppOps system_server E Operation not started: uid=10222 pkg=com.example.cameraxapp(null) op=CAMERA
2025-03-25 19:39:47.549 6213-6252 BufferQueueProducer pid-6213 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-25 19:39:47.549 6213-6252 BufferQueueProducer pid-6213 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 dequeueBuffer: BufferQueue has been abandoned
2025-03-25 19:39:47.587 6213-6248 BufferQueueProducer pid-6213 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-25 19:39:47.588 6213-6248 BufferQueueProducer pid-6213 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 cancelBuffer: BufferQueue has been abandoned
2025-03-25 19:39:47.588 6213-6248 BufferQueueProducer pid-6213 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 cancelBuffer: BufferQueue has been abandoned
2025-03-25 19:40:18.517 6213-6224 BufferQueueProducer pid-6213 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#3(BLAST Consumer)3 dequeueBuffer: BufferQueue has been abandoned
2025-03-25 19:40:18.519 6213-6256 BufferQueueProducer pid-6213 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#3(BLAST Consumer)3 queueBuffer: BufferQueue has been abandoned
2025-03-25 19:40:18.551 6213-6248 BufferQueueProducer pid-6213 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#3(BLAST Consumer)3 queueBuffer: BufferQueue has been abandoned
2025-03-25 19:40:18.593 6213-6248 BufferQueueProducer pid-6213 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#3(BLAST Consumer)3 queueBuffer: BufferQueue has been abandoned
2025-03-25 19:40:56.540 6349-6395 BufferQueueProducer pid-6349 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 dequeueBuffer: BufferQueue has been abandoned
2025-03-25 19:40:56.588 6349-6395 BufferQueueProducer pid-6349 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-25 19:40:56.642 6349-6358 BufferQueueProducer pid-6349 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-25 19:40:56.646 6349-6358 BufferQueueProducer pid-6349 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 cancelBuffer: BufferQueue has been abandoned
2025-03-25 19:41:23.418 6349-6385 BufferQueueProducer pid-6349 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#3(BLAST Consumer)3 queueBuffer: BufferQueue has been abandoned
2025-03-25 19:41:23.420 6349-6385 BufferQueueProducer pid-6349 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#3(BLAST Consumer)3 cancelBuffer: BufferQueue has been abandoned
2025-03-25 19:41:23.430 6349-6413 BufferQueueProducer pid-6349 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#3(BLAST Consumer)3 cancelBuffer: BufferQueue has been abandoned
2025-03-25 19:41:23.435 6349-6385 BufferQueueProducer pid-6349 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#3(BLAST Consumer)3 cancelBuffer: BufferQueue has been abandoned
2025-03-25 19:53:43.863 598-1860 AppOps system_server E Operation not started: uid=10222 pkg=com.example.cameraxapp(null) op=CAMERA
2025-03-25 19:54:25.763 598-1750 AppOps system_server E Operation not started: uid=10222 pkg=com.example.cameraxapp(null) op=CAMERA
--------- beginning of crash
2025-03-25 20:00:54.287 598-968 AppOps system_server E Operation not started: uid=10222 pkg=com.example.cameraxapp(null) op=CAMERA
2025-03-25 20:02:12.032 598-1619 AppOps system_server E Operation not started: uid=10222 pkg=com.example.cameraxapp(null) op=CAMERA
2025-03-25 20:03:48.155 8049-8085 BufferQueueProducer pid-8049 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-25 20:03:48.163 8049-8085 BufferQueueProducer pid-8049 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 dequeueBuffer: BufferQueue has been abandoned
2025-03-25 20:03:48.213 8049-8085 BufferQueueProducer pid-8049 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-25 20:03:48.214 8049-8085 BufferQueueProducer pid-8049 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 cancelBuffer: BufferQueue has been abandoned
2025-03-25 20:03:48.215 8049-8074 BufferQueueProducer pid-8049 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 cancelBuffer: BufferQueue has been abandoned
2025-03-25 20:09:24.865 598-721 AppOps system_server E Operation not started: uid=10222 pkg=com.example.cameraxapp(null) op=CAMERA
2025-03-25 20:10:58.176 598-625 AppOps system_server E Operation not started: uid=10222 pkg=com.example.cameraxapp(null) op=CAMERA
---------------------------- PROCESS STARTED (9401) for package com.example.cameraxapp ----------------------------
按调试结果来说,代码好像没错误,
但启动运行时会出ERROR,那么这些ERROR出在哪个环节上?
我把生成的apk安装到手机上,运行也是没错误但不能存图。
100%详细的操作记录及Error输出情况:
开机,
运行AndroidStudio,
点run按钮,
app画面出现前出现下面的error:
--------- beginning of main
--------- beginning of system
2025-03-26 21:01:27.893 10998-11041 BufferQueueProducer pid-10998 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:01:27.894 10998-11036 BufferQueueProducer pid-10998 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 dequeueBuffer: BufferQueue has been abandoned
2025-03-26 21:01:27.924 10998-11046 BufferQueueProducer pid-10998 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:01:27.957 10998-11046 BufferQueueProducer pid-10998 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:01:27.960 10998-11046 BufferQueueProducer pid-10998 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 cancelBuffer: BufferQueue has been abandoned
--------- beginning of crash
2025-03-26 21:06:18.462 11347-11369 BufferQueueProducer pid-11347 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:06:18.462 11347-11369 BufferQueueProducer pid-11347 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 dequeueBuffer: BufferQueue has been abandoned
2025-03-26 21:06:18.488 11347-11369 BufferQueueProducer pid-11347 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:06:18.527 11347-11376 BufferQueueProducer pid-11347 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:06:18.557 11347-11376 BufferQueueProducer pid-11347 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:07:09.388 11449-11490 BufferQueueProducer pid-11449 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:07:09.388 11449-11490 BufferQueueProducer pid-11449 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 dequeueBuffer: BufferQueue has been abandoned
2025-03-26 21:07:09.427 11449-11477 BufferQueueProducer pid-11449 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:07:09.428 11449-11477 BufferQueueProducer pid-11449 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 cancelBuffer: BufferQueue has been abandoned
2025-03-26 21:07:09.428 11449-11477 BufferQueueProducer pid-11449 E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 cancelBuffer: BufferQueue has been abandoned
2025-03-26 21:08:40.475 598-1760 AppOps system_server E Operation not started: uid=10222 pkg=com.example.cameraxapp(null) op=CAMERA
app画面出现后无error
点后退按钮退出程序出现如下error:
2025-03-26 21:15:15.311 11848-11875 BufferQueueProducer com.example.cameraxapp E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:15:15.313 11848-11861 BufferQueueProducer com.example.cameraxapp E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 dequeueBuffer: BufferQueue has been abandoned
2025-03-26 21:15:15.331 11848-11861 BufferQueueProducer com.example.cameraxapp E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:15:15.332 11848-11861 BufferQueueProducer com.example.cameraxapp E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 cancelBuffer: BufferQueue has been abandoned
2025-03-26 21:15:15.335 11848-11861 BufferQueueProducer com.example.cameraxapp E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 cancelBuffer: BufferQueue has been abandoned
点stop ‘app’按钮无error出现
点run按钮,无error出现
点stop ‘app’按钮出现如下error:
2025-03-26 21:18:27.863 598-1856 AppOps system_server E Operation not started: uid=10222 pkg=com.example.cameraxapp(null) op=CAMERA
点run按钮,无error出现
点overall按钮(方块键),无error
向右滑动app,出现如下error:
2025-03-26 21:25:19.837 12230-12311 BufferQueueProducer com.example.cameraxapp E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:25:19.841 12230-12241 BufferQueueProducer com.example.cameraxapp E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 dequeueBuffer: BufferQueue has been abandoned
2025-03-26 21:25:19.868 12230-12311 BufferQueueProducer com.example.cameraxapp E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:25:19.908 12230-12311 BufferQueueProducer com.example.cameraxapp E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 queueBuffer: BufferQueue has been abandoned
2025-03-26 21:25:19.909 12230-12311 BufferQueueProducer com.example.cameraxapp E SurfaceView[com.example.cameraxapp/com.example.cameraxapp.MainActivity]#1(BLAST Consumer)1 cancelBuffer: BufferQueue has been abandoned
点击手机界面上的‘clear all’,app画面消失,无error