Приложение вылетает при запуске камеры для съемки на Redmi 7A

Мое приложение автоматически падает, когда я запускаю камеру, чтобы сделать снимок на Redmi 7A. Ниже приведены журналы сбоев:

   E/CAM_CameraIntentManager: checkCallerLegality: Unknown caller: com.qikcircle.eclinic

Пожалуйста, помогите, это действительно не показывает, в чем именно проблема.

Мой код активности

class CaptureImageActivity : AppCompatActivity() {

    private lateinit var mToolbar: Toolbar
    private lateinit var mImage: ImageView
    private var mBitmap: Bitmap? = null

    private val getCameraAndStoragePermission = registerForActivityResult(
            ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
        if (hasAllPermissionsGranted(permissions)) {
            dispatchTakePictureIntent()
        } else {
            Toast.makeText(
                    this,
                    resources.getString(R.string.allow_camera_permission),
                    Toast.LENGTH_SHORT)
                    .show()
            finish()
        }
    }

    private val takePicture =
            registerForActivityResult(ActivityResultContracts.TakePicture()) { success ->
        if (success) {
            photoURI.let {
                mBitmap = getBitmap(this, photoURI)
                mImage.setImageBitmap(mBitmap)
                goBack()
            }
        } else {
            Toast.makeText(
                    this,
                    resources.getString(R.string.something_went_wrong),
                    Toast.LENGTH_SHORT)
                    .show()
            finish()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_capture_image)

        setupToolbar()

        mImage = findViewById(R.id.image)
        val mSend = findViewById<ImageButton>(R.id.send)
        mSend.setOnClickListener {
            goBack()
        }

        checkCameraPermission()
    }

    private fun setupToolbar() {
        mToolbar = findViewById(R.id.toolbar)
        val title: TextView = findViewById(R.id.title)
        title.text = resources.getString(R.string.app_name)
        setSupportActionBar(mToolbar)
        showBackButton()
    }

    private fun showBackButton() {
        if (supportActionBar != null) {
            supportActionBar!!.setDisplayHomeAsUpEnabled(true)
            supportActionBar!!.setDisplayShowHomeEnabled(true)
        }
        mToolbar.setNavigationOnClickListener {
            super.onBackPressed()
        }
    }

    private fun checkCameraPermission() {
        val permissions = arrayOf(
                Manifest.permission.CAMERA,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        )
        if (!hasPermissions(this, *permissions)) {
            getCameraAndStoragePermission.launch(permissions)
            return
        }
        dispatchTakePictureIntent()
    }

    private fun goBack() {
        val intent = Intent()
        intent.data = photoURI
        setResult(Activity.RESULT_OK, intent)
        finish()
    }

    private lateinit var currentPhotoPath: String

    @Throws(IOException::class)
    private fun createImageFile(): File {
        // Create an image file name
        val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date())
        val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        return File.createTempFile(
                "JPEG_${timeStamp}_", /* prefix */
                ".jpg", /* suffix */
                storageDir /* directory */
        ).apply {
            // Save a file: path for use with ACTION_VIEW intents
            currentPhotoPath = absolutePath
        }
    }

    private lateinit var photoURI: Uri

    private fun dispatchTakePictureIntent() {
        val photoFile: File? = try {
            createImageFile()
        } catch (ex: IOException) {
            // Error occurred while creating the File
            null
        }
        // Continue only if the File was successfully created
        photoFile?.also {
            photoURI = FileProvider.getUriForFile(
                    this,
                    "com.qikcircle.eclinic.fileprovider",
                    it
            )
            takePicture.launch(photoURI)
        }
    }
}

Кроме того, приложение вылетает не каждый раз, а только несколько раз.


person Krishna Meena    schedule 31.07.2020    source источник
comment
Если ваше приложение действительно дает сбой, в журналах должна быть трассировка стека.   -  person Michael    schedule 31.07.2020
comment
Да, я полностью согласен, но это не дает никакой трассировки стека. очень странный. Затем я не установил фильтр в Logcat, после чего узнал об упомянутой выше ошибке. Кроме того, это не совсем сбой, но мой процесс приложения отображается как Dead, а камера остается открытой.   -  person Krishna Meena    schedule 31.07.2020
comment
Чтобы добавить выше, я не уверен, но, возможно, камера убивает процесс моего приложения.   -  person Krishna Meena    schedule 31.07.2020
comment
Урок первый: ОС Android может убить вашу активность в любой момент, если это не основная активность. В вашем случае приложение «Камера» находится сверху, и ваша активность действительно может быть убита.   -  person blackapps    schedule 31.07.2020
comment
private lateinit var mToolbar: Toolbar private lateinit var mImage: ImageView private var mBitmap: Bitmap? = null Попробуйте сделать их локальными.   -  person blackapps    schedule 31.07.2020
comment
Сделал, но все равно та же ошибка   -  person Krishna Meena    schedule 31.07.2020
comment
Для дальнейшего добавления информации Мое приложение имеет функцию нескольких модулей. Из динамического модуля 1 я вызываю CaptureImageActivity, который находится в базовом модуле.   -  person Krishna Meena    schedule 31.07.2020


Ответы (1)


У меня такая же проблема на моем Redmi Note 8t (MIUI Global 11.04.1). А вот на Redmi Note 8 Pro (MIUI Global 12.0.2) все работает нормально. Похоже, это проблема Xiaomi MIUI. Один из способов решения — попробовать установить другой MIUI или перепрошить чистый Android без какой-либо оболочки.

person Velord    schedule 02.09.2020
comment
У меня такая же проблема в Redmi Note 7 MIUI Global 11.0.1. не могли бы вы рассказать нам больше о «перепрошивке чистого Android без оболочки»? я не понимаю этого - person Alexa289; 04.11.2020
comment
Я просто понимаю, что все приложения, которым нужно снимать изображение с камеры, имеют одну и ту же проблему. Я думаю, что проблема в моем телефоне (Redmi Note 7 MIUI Global 11.0.1), и, к сожалению, нового обновления для MIUI нет. - person Alexa289; 04.11.2020
comment
@ Alexa289, я имею в виду установку чистого Android через root на свой телефон. Любое такое решение вы можете найти по ссылке. Кроме того, после перехода на последнюю версию «реализации (androidx.fragment:fragment:1.3.0-beta01)» эта проблема возникает редко. Есть что-то особенное неопределенное поведение пользовательского интерфейса в MIUI (11 и 12) с пользовательским тостом, например ссылка. Так что виноват не только Android SDK. - person Velord; 09.11.2020
comment
@Velort, спасибо, велорд, я наконец-то использовал библиотеку Camera X от Google вместо использования Intent для съемки. он очень хорошо работает в Redmi to Android L, вообще без ошибок. возможно, это понадобится другим разработчикам: codelabs.developers.google.com/codelabs /camerax-getting-start/ - person Alexa289; 13.11.2020