Сфотографируйте через намерение возвращает -1 как код результата - PullRequest
0 голосов
/ 11 октября 2019

Моя цель - сделать снимок с помощью приложения камеры и сохранить его в каталоге. Как и в этом руководстве объясняется: https://developer.android.com/training/camera/photobasics

Однако onActivityResult возвращает -1 в качестве кода возврата на некоторых устройствах. Скорее всего, проблема в том, что приложение камеры не может записать файл фотографии в предоставленный мною URI, но я не понимаю, почему.

Вот результаты моих тестов:

  • Moto Gс Android 7: работает нормально
  • Xiaomi Mi A1 с Android 7.1: не работает
  • Samsung Galaxy A40 с Android 9: не работает

Вот что я делаю:

Объявите провайдера в манифесте (вместе с соответствующими разрешениями)

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.mypackage.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>

Объявите правильный путь к файлу

    <paths>
        <external-path name="my_images"  path="Android/data/com.mypackage/files/Pictures" />
    </paths>

В действии запустите приложение камеры с намерением

        Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->

            takePictureIntent.resolveActivity(requireContext().packageManager)?.also {

                val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.FRANCE).format(Date())

                requireContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES)?.let { storageDir ->

                    File.createTempFile("JPEG_${timeStamp}_", ".jpg", storageDir).also {

                        fileUri = FileProvider.getUriForFile(requireContext(), "com.mypackage.fileprovider", it)
                        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri)
                        startActivityForResult(takePictureIntent, TAKE_PIC_CODE)
                    }
                }
            }
        }

1 Ответ

0 голосов
/ 14 октября 2019
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) 

Когда onActivityResult возвращает -1 в качестве кода возврата , вам на самом деле очень повезло: -1 - не что иное, как Activity.RESULT_OK . На самом деле, с намерением ACTION_IMAGE_CAPTURE вам все равно, какой код возврата;достаточно проверить, не является ли временный файл, который вы открыли в storageDir , не пустым (в вашем приложении создается пустой файл, а изображение сохраняется в приложении Camera).

Этосказал, что я советую использовать <external-files-path name="my_images" path="Pictures" />, чтобы меньше зависеть от деталей реализации getExternalFilesDir () .

Если ваша деятельность имеет только один вызов startActivityForResult(), вы недаже не нужно проверять requestCode .

Наконец, в вашем сценарии requestData , вероятно, будет null . Этот параметр имеет значение только в том случае, если ваше ACTION_IMAGE_CAPTURE намерение не указывает MediaStore.EXTRA_OUTPUT. К счастью, вам не нужна информация, которую requestData Intent может передать вам.

...