Ошибка при получении изображения с камеры Kotlin, вылетает приложение
Никак не могу запустить камеру, нигде не нашел ответа на данную проблему.
Сама ошибка:
2022-04-17 23:33:45.233 4652-4652/? E/libprocessgroup: Failed to write '4652' to /sys/fs/cgroup/uid_10225/pid_4652/cgroup.procs: Permission denied
2022-04-17 23:33:45.233 4652-4652/? E/Zygote: createProcessGroup(10225, 0) failed: Permission denied
2022-04-17 23:33:47.520 4652-4652/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 4652
java.lang.AbstractMethodError: abstract method "androidx.camera.core.impl.Config androidx.camera.core.impl.UseCaseConfigFactory.getConfig(androidx.camera.core.impl.UseCaseConfigFactory$CaptureType, int)"
at androidx.camera.core.Preview.getDefaultConfig(Preview.java:472)
at androidx.camera.core.internal.CameraUseCaseAdapter.getConfigs(CameraUseCaseAdapter.java:483)
at androidx.camera.core.internal.CameraUseCaseAdapter.addUseCases(CameraUseCaseAdapter.java:208)
at androidx.camera.lifecycle.LifecycleCamera.bind(LifecycleCamera.java:206)
at androidx.camera.lifecycle.LifecycleCameraRepository.bindToLifecycleCamera(LifecycleCameraRepository.java:278)
at androidx.camera.lifecycle.ProcessCameraProvider.bindToLifecycle(ProcessCameraProvider.java:532)
at androidx.camera.lifecycle.ProcessCameraProvider.bindToLifecycle(ProcessCameraProvider.java:360)
at com.example.myapplication.MainActivity.startCamera$lambda-2(MainActivity.kt:76)
at com.example.myapplication.MainActivity.$r8$lambda$1EpLcM5u7cid15NBPMsr6OOvSP0(Unknown Source:0)
at com.example.myapplication.MainActivity$$ExternalSyntheticLambda0.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7839)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Вот код:
package com.example.myapplication
import android.Manifest
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.camera.core.CameraSelector
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import kotlinx.android.synthetic.main.activity_main.*
import java.lang.ClassCastException
import java.lang.Exception
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
class MainActivity : AppCompatActivity() {
private lateinit var cameraExecutor: ExecutorService
//lateinit var binding: ActivityMainBinding
companion object{
private const val TAG = "Camera"
private val PERMISSION = arrayOf(Manifest.permission.CAMERA)
private const val PERMISSION_CODE =10
}
private fun permissonGrant() = PERMISSION.all {
ContextCompat.checkSelfPermission(baseContext, it) == PackageManager.PERMISSION_GRANTED
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if(permissonGrant()){
startCamera()
}else{
ActivityCompat.requestPermissions(
this,
PERMISSION,
PERMISSION_CODE
)
}
cameraExecutor = Executors.newSingleThreadExecutor()
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PERMISSION_CODE){
if (permissonGrant()){
startCamera()
}else{
Toast.makeText(this, "Не получилось получить разрешение", Toast.LENGTH_SHORT).show()
finish()
}
}
}
private fun startCamera(){
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(
Runnable {
val cameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder().build()
.also {
it.setSurfaceProvider(pv_camera.surfaceProvider)
}
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try{
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this,
cameraSelector,
preview
)
}catch (e: Exception){
Log.e(TAG, "Bind error", e)
}
},
ContextCompat.getMainExecutor(this))
}
override fun onDestroy() {
super.onDestroy()
cameraExecutor.shutdown()
}
}
Вот Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<uses-feature android:name="android.hardware.camera.any"/>
<uses-permission android:name="android.permission.CAMERA"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Так же build.gradle:
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
}
android {
compileSdk 31
buildFeatures {
viewBinding true
}
defaultConfig {
applicationId "com.example.myapplication"
minSdk 21
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
//camera
def camerax_version = "1.1.0-beta01"
implementation "androidx.camera:camera-camera2:$camerax_version"
implementation "androidx.camera:camera-lifecycle:$camerax_version"
implementation "androidx.camera:camera-view:1.1.0-beta03"
}
и activity_main:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.camera.view.PreviewView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/pv_camera"/>
</FrameLayout>
Все делал по данному уроку на youtube: https://www.youtube.com/watch?v=fCe4UZA3Qyo (на 33 минуте у него уже запускается камера)
Прошу Вас мне помочь, может где то ошибся может что то пропустил или может есть более простой и лучший способ вывести изображение с камеры на экран.
Ответы (1 шт):
Автор решения: Шарип Хаджаров
→ Ссылка
Нашел проблему А все дело в
def camerax_version = "1.0.0"
implementation "androidx.camera:camera-camera2:$camerax_version"
implementation "androidx.camera:camera-lifecycle:$camerax_version"
implementation "androidx.camera:camera-view:1.0.0-alpha24"
Где я указал вместо версии 1.0.0 последнюю 1.0.2 кажется. Все же непонятно почему в новой версии не запускается.