【问题标题】:Take photo via intent returns -1 as result code通过意图拍照返回 -1 作为结果代码
【发布时间】:2020-02-08 18:22:12
【问题描述】:

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

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

这是我的测试结果:

  • 带有 Android 7 的 Moto G:运行良好
  • 搭载 Android 7.1 的小米米 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>

在 Activity 中,使用 Intent 启动相机应用

        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)
                    }
                }
            }
        }

【问题讨论】:

  • 代替 external-path,尝试
  • @AlexCohn 我仍然有同样的问题
  • 等一下……RESULT_OK == -1
  • 你是对的,做得好:)。我的问题不是因为 resultCode 等于-1。这是因为 resultData 为空。 stackoverflow.com/questions/9890757/… 帮助我处理了这个空结果数据。你让我走上正轨。我会接受你的回答。

标签: android android-intent camera android-fileprovider


【解决方案1】:
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) 

onActivityResult返回-1作为返回码时,你其实很幸运:-1只不过是Activity.RESULT_OK。实际上,对于 ACTION_IMAGE_CAPTURE 意图,您并不关心返回码是什么;检查您在 storageDir 中打开的临时文件是否不为空就足够了(在您的应用中创建一个空文件,并且图像由相机应用存储在那里)。

这就是说,我建议使用&lt;external-files-path name="my_images" path="Pictures" /&gt;,少依赖getExternalFilesDir()的实现细节。

如果您的活动只有一次调用startActivityForResult(),您甚至不需要检查requestCode

最后,在您的场景中,requestData 可能是null。仅当您的 ACTION_IMAGE_CAPTURE 意图未指定 MediaStore.EXTRA_OUTPUT 时,此参数才相关。幸运的是,您不需要 requestData Intent 可以传递给您的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多