Ошибка CameraX в Android: невозможно открыть камеру «0» без разрешения камерыAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка CameraX в Android: невозможно открыть камеру «0» без разрешения камеры

Сообщение Anonymous »

Я разрабатывал приложение, в котором пытаюсь реализовать приложение камеры с помощью плагина CameraX, и получаю следующую ошибку:

Код: Выделить всё

FATAL EXCEPTION: CameraX- Process: es.paytef.paytefmobile, PID: 2747 java.lang.SecurityException: validateClientPermissionsLocked:931: Caller "es.paytef.paytefmobile" (PID 10048, UID 2747) cannot open camera "0" without camera permission at android.hardware.camera2.CameraManager.throwAsPublicException(CameraManager.java:733) at android.hardware.camera2.CameraManager.openCameraDeviceUserAsync(CameraManager.java:410) at android.hardware.camera2.CameraManager.openCameraForUid(CameraManager.java:553) at android.hardware.camera2.CameraManager.openCamera(CameraManager.java:514) at androidx.camera.camera2.impl.Camera.openCameraDevice(Camera.java:488) at androidx.camera.camera2.impl.Camera.open(Camera.java:144) at androidx.camera.camera2.impl.Camera.addOnlineUseCase(Camera.java:408) at androidx.camera.camera2.impl.Camera$10.run(Camera.java:395) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:164) at android.os.HandlerThread.run(HandlerThread.java:65) Caused by: android.os.ServiceSpecificException: validateClientPermissionsLocked:931: Caller "es.paytef.paytefmobile" (PID 10048, UID 2747) cannot open camera "0"  without camera permission (code 1) at android.os.Parcel.readException(Parcel.java:2027) at android.os.Parcel.readException(Parcel.java:1959) at android.hardware.ICameraService$Stub$Proxy.connectDevice(ICameraService.java:339) at android.hardware.camera2.CameraManager.openCameraDeviceUserAsync(CameraManager.java:374)
Что касается конфигурации, то следующее:
build.gradle(app)

Код: Выделить всё

def camerax_version = "1.0.0-alpha01"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
Что касается использования в моей деятельности, то это:

Код: Выделить всё

class CameraActivity : ListenerCompatActivity(), ActivityCompat.OnRequestPermissionsResultCallback{
companion object {
const val TAKE_PICTURE = 200
}

private val useCase = Application.useCaseManager.camera
private lateinit var ui: ActivityCameraBinding
private var lensFacing = CameraX.LensFacing.BACK
private var imageCapture: ImageCapture? = null
private var flashMode: FlashMode = FlashMode.OFF
private val filename = "image.png"
private val sd = Environment.getExternalStorageDirectory()
private val dest = File(sd, filename)

private var resultSent = false
override fun getActivityID(): ActivityID = ActivityID.Camera

override fun isKeepScreenOn() = true

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ui = ActivityCameraBinding.inflate(layoutInflater)
setContentView(ui.root)
setListeners()
bindCamera()
}

private fun setListeners() {
runOnUiThread {
ui.btCancelCamera.setOnClickListener {
//TODO: Check what to do
}
// Changes the flash mode when the button is clicked
ui.btSwitchFlashlight.setOnClickListener {
val flashMode = imageCapture?.flashMode
if (flashMode == FlashMode.ON) imageCapture?.flashMode = FlashMode.OFF
else imageCapture?.flashMode = FlashMode.ON
}
ui.viewFinder.setOnClickListener {
imageCapture?.takePicture(dest,
object : ImageCapture.OnImageSavedListener {
override fun onError(
error: ImageCapture.UseCaseError,
message: String, exc: Throwable?
) {
Log.e("Image", error.toString())
sendResult(
ApiCameraResponse(
ApiCameraResponse.Result(
success = true,
message = applicationContext.getString(R.string.camera_save_succesfully),
imageContent = Convert.bytesToBase64(dest.readBytes()),
imageType = "image/png",
)
)
)
}

override fun onImageSaved(file:  File) {
Log.v("Image", "Successfully saved image")
sendResult(
ApiCameraResponse(
ApiCameraResponse.Result(
success = true,
message = applicationContext.getString(R.string.camera_save_succesfully),
imageContent = Convert.bytesToBase64(dest.readBytes()),
imageType = "image/png",
)
)
)
}
})
}

}
}

override fun onStart() {
super.onStart()

// Check and request permissions
if (hasNoPermissions()) {
checkCameraPermissions(applicationContext)
}
}

private fun startCameraIntent() {
/*************************** Camera Intent Start  */
// Standard Intent action that can be sent to have the camera
// application capture an image and return it.
val request = useCase.getCameraRequest()
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
if (intent.resolveActivity(packageManager) != null) startActivityForResult(
intent,
TAKE_PICTURE
)

/*************************** Camera Intent End  */
}

private fun sendCancelResult() {
sendResult(
ApiCameraResponse().also { it.setFailed(Messages.CANCEL_BY_USER) }
)
}

private fun sendResult(result: ApiCameraResponse) {
logger.info("Sending result = $result")
resultSent = true
useCase.setResult(result)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode != TAKE_PICTURE) {
logger.error("Another request not configured received, request: $requestCode, result: $resultCode")
super.onActivityResult(requestCode, resultCode, intent)
return
}

if (resultCode != Activity.RESULT_OK || data == null) {
logger.error("Another result received, request: $requestCode, result: $resultCode")
sendCancelResult()
return
}
try {
logger.info("Request Code:$requestCode")
logger.info("Request Code:$requestCode")
/*********** Load Captured Image And Data Start  */
//imageFilePath image path which you pass with intent
val bitmap = intent.extras?.get("data") as Bitmap
logger.info("Camera bitmap: $bitmap")
val byteArray = convertBitmapToByteArray(bitmap)
?: throw Exception("NULL camera bitmap captured")
logger.info("Camera byteArray: $byteArray")
val result = ApiCameraResponse(
ApiCameraResponse.Result(
success = true,
message = applicationContext.getString(R.string.camera_save_succesfully),
imageContent = Convert.bytesToBase64(byteArray),
imageType = "image/png",
)
)
sendResult(result)
logger.info("image: $bitmap")
/*********** Load Captured Image And Data End  */
} catch (ex:  Throwable) {
logger.error("Error capturing camera image", ex)
super.onActivityResult(requestCode, resultCode, intent)
return
}
}

/**
* Bind the Camera to the lifecycle
*/
private fun bindCamera() {
CameraX.unbindAll()

// Preview config for the camera
val previewConfig = PreviewConfig.Builder()
.setLensFacing(lensFacing)
.build()

val preview = Preview(previewConfig)

// Image capture config which controls the Flash and Lens
val imageCaptureConfig = ImageCaptureConfig.Builder()
.setTargetRotation(windowManager.defaultDisplay.rotation)
.setLensFacing(lensFacing)
.setFlashMode(flashMode)
.build()

imageCapture = ImageCapture(imageCaptureConfig)

// Handles the output data of the camera
preview.setOnPreviewOutputUpdateListener { previewOutput ->
// Displays the camera image in our preview view
ui.viewFinder.setSurfaceTexture(previewOutput.surfaceTexture)
}

// Bind the camera to the lifecycle
CameraX.bindToLifecycle(this as LifecycleOwner, imageCapture, preview)
}

/**
* Check if the app has all permissions
*/
private fun hasNoPermissions(): Boolean {
return ContextCompat.checkSelfPermission(
this,
Manifest.permission.READ_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
this,
Manifest.permission.CAMERA
) != PackageManager.PERMISSION_GRANTED
}

/**
* Request all permissions
*/
fun checkCameraPermissions(context: Context?) {
if (ContextCompat.checkSelfPermission(context!!, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED
) {
// Permission is not granted
Log.d("checkCameraPermissions", "No Camera Permissions")
ActivityCompat.requestPermissions(
this, arrayOf(Manifest.permission.CAMERA),
100
)
}
}

override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array,
grantResults: IntArray
) {
when(PermissionChecker.isGranted(
requestCode,
grantResults
)){
true ->{
logger.info("permission granted")
}
else ->{
logger.info("Permission not been granted")
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
Я проверяю по какой-то ссылке, что ошибка связана с разрешением приложения, но в моем случае у меня уже есть все, что есть нужно: Если вы столкнулись с такой проблемой и можете предложить решение, заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/781 ... permission
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Python opencv: невозможно захватить видео с веб-камеры со страницы веб-сайта – невозможно открыть камеру по индексу
    Anonymous » » в форуме Python
    0 Ответы
    47 Просмотры
    Последнее сообщение Anonymous
  • Как правильно закрыть камеру с помощью Android Camerax API во фрагменте синхронно?
    Гость » » в форуме Android
    0 Ответы
    27 Просмотры
    Последнее сообщение Гость
  • Как увеличить камеру с помощью Android CameraX API?
    Anonymous » » в форуме Android
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • Как масштабировать камеру с помощью API Android Camerax API?
    Anonymous » » в форуме Android
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Как переключиться на фронтальную камеру на CameraX?
    Гость » » в форуме Android
    0 Ответы
    36 Просмотры
    Последнее сообщение Гость

Вернуться в «Android»