Android Camera Intent 在 OnePlus 设备中不起作用

Android Camera Intent not working in OnePlus devices

我试图使用 Android 设备中预装的本机相机应用程序来为我的应用程序捕获图像。为此,我一直在使用此代码:

当用户点击按钮时调用函数

take_img_btn.setOnClickListener {
    dispatchTakePictureIntent()
}

该函数应该这样做:

    private fun dispatchTakePictureIntent() {
        Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
            // Ensure that there's a camera activity to handle the intent
            takePictureIntent.resolveActivity(packageManager)?.also {
                // Create the File where the photo should go
                val photoFile: File? = try {
                    createImageFile()
                } catch (ex: IOException) {
                    // Error occurred while creating the File
                    ex.printStackTrace()
                    null
                }
                // Continue only if the File was successfully created
                photoFile?.also {
                    val photoURI: Uri = FileProvider.getUriForFile(
                        this,
                        "com.example.android.fileprovider",
                        it
                    )
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
                    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
                }
            }
        }
    }


    private fun createImageFile(): File {
        // Create an image file name
        val timeStamp: String = SimpleDateFormat("yy-MM-dd-HH-mm-ss-SS",Locale.getDefault()).format(System.currentTimeMillis())
        val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        return File.createTempFile(
            "FNL_${timeStamp}_",
            ".jpg",
            storageDir /* directory */
        ).apply {
            // Save a file: path for use with ACTION_VIEW intents
            currentPhotoPath = absolutePath
            currentPhotoName = name
        }
    }

并且 FileProvider 在 Manifest 中是这样配置的

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

我还要求清单中的相机功能

<manifest>
    ...
    <uses-feature
        android:name="android.hardware.camera"
        android:required="true" />
    ...
</manifest>

当我在 android 设备 (Realme 6 Pro) 上 运行 这个应用程序并点击按钮时:

  1. The app opens the native camera app
  2. I can capture the image
  3. The image is saved to the location where it was specified

但是当在 OnePlus 设备(在我们的例子中是 OnePlus Nord)上部署同一个应用程序并点击按钮时,没有任何反应。感觉按钮没有编程。

此代码取自此处:https://developer.android.com/training/camera/photobasics

如果有人帮助,那将是非常有帮助的。

检查 AndroidManifest.xml 以进行后续更改

<manifest ... >
    <uses-feature android:name="android.hardware.camera"
                  android:required="true" />
    ...
</manifest>

确保在打开相机之前征得相机许可。

尝试询问 运行 时间权限。

免责声明:本人不善解释

按照@CommonsWare的建议,我就是这么做的。

我基本上避免使用 resolveActivity() 并以我自己的风格来做,而不是从 官方 Google 文档 [=14 中复制粘贴=]

这是我对相机应用的最后呼吁:

    private fun dispatchTakePictureIntent() {
        val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        val photoFile: File? = try {
            createImageFile()
        } catch (ex: IOException) {
            // Error occurred while creating the File
            ex.printStackTrace()
            null
        }

        if (photoFile != null){
            val photoURI: Uri = FileProvider.getUriForFile(
                this,
                "com.example.android.fileprovider",
                photoFile
            )
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
            startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE)
        }
    }


    private fun createImageFile(): File {
        // Create an image file name
        val timeStamp: String = SimpleDateFormat("yy-MM-dd-HH-mm-ss-SS",Locale.getDefault()).format(System.currentTimeMillis())
        val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        return File.createTempFile(
            "FNL_${timeStamp}_",
            ".jpg",
            storageDir /* directory */
        ).apply {
            // Save a file: path for use with ACTION_VIEW intents
            currentPhotoPath = absolutePath
            currentPhotoName = name
        }
    }

最后,非常感谢@CommonsWare

在 Oneplus nord 等更高版本的设备中,android 11 或 12 相机意图不起作用我添加了这段代码,它对我有用

AndroidManifest.xml

中添加这一行
<queries>
        <intent>
            <action android:name="android.media.action.IMAGE_CAPTURE" />
        </intent>
    </queries>

并添加相机所需的其他权限