我一直在为我的应用程序实现CameraView,它在几周前就可以运行,但是现在它只是显示黑屏,这意味着未显示预览。结果,似乎正在录制的视频也没有被保存。
有人可以更正我的代码吗?
清单:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
build.gradle(app)
def camerax_version = "1.0.0-beta07"
implementation "androidx.camera:camera-core:$camerax_version"
implementation "androidx.camera:camera-camera2:$camerax_version"
implementation "androidx.camera:camera-lifecycle:$camerax_version"
implementation "androidx.camera:camera-view:1.0.0-alpha14"
xml
<androidx.camera.view.CameraView
android:id="@+id/CameraView_cameraPreview"
android:layout_width="match_parent"
android:layout_height="500dp"
app:captureMode="mixed"
app:flash="auto"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.4"
app:lensFacing="back"
app:pinchToZoomEnabled="true"
app:scaleType="fitCenter" />
**p.s: I have implemented this button in build.gradle**
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/Button_cameraRecord"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/camera_record_vector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/CameraView_cameraPreview"
app:layout_constraintVertical_bias="0.5" />
科特琳活动
package com.example.iambeta.camera
import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import android.os.SystemClock
import android.util.Log
import android.view.View
import android.widget.SeekBar
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.CameraSelector
import androidx.camera.core.VideoCapture
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.example.iambeta.R
import com.example.iambeta.storage.UploadActivity
import kotlinx.android.synthetic.main.activity_camera.*
import java.io.File
//variables for requesting permission
private const val REQUEST_CODE_PERMISSION = 101
var CAMERA_PERMISSION = Manifest.permission.CAMERA
var RECORD_AUDIO_PERMISSION = Manifest.permission.RECORD_AUDIO
private val REQUIRED_PERMISSION = arrayOf(CAMERA_PERMISSION, RECORD_AUDIO_PERMISSION)
val TAG = Camera::class.java.simpleName
class Camera : AppCompatActivity() {
//declaring variables for camera
private var recordingStatus: recordingState? = null
override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_camera)
//initializing variables for camera
recordingStatus = recordingState.NOTRECORDING
//if record button is clicked
Button_cameraRecord.setOnClickListener{
if(recordingStatus == recordingState.NOTRECORDING) {
recordingStatus = recordingState.RECORDING
startRecord()
}else if(recordingStatus == recordingState.RECORDING){
recordingStatus = recordingState.NOTRECORDING
stopRecord()
}
}
}
//start recording
fun startRecord(){
//variable for storing the video/recording
val fileStorage = "${System.currentTimeMillis()}.mp4"
CameraView_cameraPreview.startRecording(File(externalMediaDirs.first(), fileStorage), ContextCompat.getMainExecutor(this), object: VideoCapture.OnVideoSavedCallback {
override fun onVideoSaved(file: File) {
Log.d(TAG, "onVideoSaved $fileStorage")
}
override fun onError(videoCaptureError: Int, message: String, cause: Throwable?) {
Toast.makeText(applicationContext, "Recording Failed", Toast.LENGTH_SHORT).show()
Log.e(TAG, "onError $videoCaptureError $message")
}
})
}
//stop recording
fun stopRecord(){
CameraView_cameraPreview.stopRecording()
Toast.makeText(this, "Saved to /internalstorage/Android/media/...", Toast.LENGTH_SHORT).show()
Log.i(TAG, "Video File Stopped")
}
//returns the result of requesting permission (i.e. failed obtaining permission)
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_CODE_PERMISSION) {
if (allPermissionsGranted()) {
openCamera()
} else {
Toast.makeText(this, "Permissions not granted by the user.", Toast.LENGTH_SHORT)
.show()
finish()
}
}
}
//checking if all permissions are granted
private fun allPermissionsGranted(): Boolean {
for (permission in REQUIRED_PERMISSION) {
if (ContextCompat.checkSelfPermission(
this,
permission
) != PackageManager.PERMISSION_GRANTED
) {
return false
}
}
return true
}
//starting camera
private fun openCamera(){
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
CameraView_cameraPreview.bindToLifecycle(this)
}
}
//Enum class to see if the record button is recording or not
enum class recordingState{
RECORDING, NOTRECORDING
}
override fun onStart() {
super.onStart()
//check if all permission has been give, else request permission
if(allPermissionsGranted()){
openCamera()
}else{
ActivityCompat.requestPermissions(this, REQUIRED_PERMISSION, REQUEST_CODE_PERMISSION)
}
}
}
答案 0 :(得分:0)
更新:我已通过以下解决方案解决了该问题
在我的函数openCamera()
中,我这样做的目的是,如果要检查的权限不等于授予的权限,它将绑定预览。但是,我可以将其设置为 equal (相等),以便一旦被授予它就可以绑定。
因此,而不是像这样的代码:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
CameraView_cameraPreview.bindToLifecycle(this)
}
它应该像这样:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
CameraView_cameraPreview.bindToLifecycle(this)
}