通过意图拍照返回-1作为结果代码

问题描述 投票:0回答:1

我的目标是通过相机应用程序拍摄照片并将其保存到目录中。就像本教程解释的一样:https://developer.android.com/training/camera/photobasics

但是,在某些设备上,onActivityResult返回-1作为返回码。问题很可能是相机应用无法将照片文件写入我提供的URI,但我不明白为什么。

这是我的测试结果:

  • 带有Android 7的Moto G:效果很好
  • 带有Android 7.1的小米Mi A1:失败
  • 带有Android 9的三星Galaxy A40:失败

这是我的工作:

清单中的声明提供者(以及适当的权限)

        <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)
                    }
                }
            }
        }
android android-intent camera android-fileprovider
1个回答
0
投票
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意向可以传递给您的信息。
© www.soinside.com 2019 - 2024. All rights reserved.