java - 当我在 Android 应用程序中创建图像时拍照时,会在 DCIM/Camera 中生成副本

标签 java android kotlin

我想用我的 Android 应用程序获取一张照片并将其放在自定义文件夹中,这是创建的,但它会在“... DCIM/Camera”文件夹中生成一个副本。我不需要额外的副本。

我的基础来自https://developer.android.com/training/camera/photobasics

模拟器中不会出现这种情况,我尝试的手机版本是: LG-Q& 安卓:8.1.0

代码:

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

    image = photo_image_v
    image.setOnClickListener {
        dispatchTakePictureIntent("sample", "sample")
    }

}

private fun dispatchTakePictureIntent(name: String, path: String) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && (ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) != PackageManager.PERMISSION_GRANTED)
    ) {
        requestPermissions(arrayOf(Manifest.permission.CAMERA), CAMERA_PERMISSION)
    } else {
        Intent(MediaStore.ACTION_IMAGE_CAPTURE).also {
            if (it.resolveActivity(this.packageManager) != null) {
                // Create the File where the photo should go
                var file = createImageFile(name, this, path)
                this@MainActivity.file = file
                var uri = FileProvider.getUriForFile(
                    this@MainActivity,
                    BuildConfig.APPLICATION_ID + ".provider", file
                )

                Log.i(this::class.java.canonicalName, "The url to save: $uri")
                it.putExtra(MediaStore.EXTRA_OUTPUT, uri)

                this@MainActivity.startActivityForResult(it, CAMERA_PERMISSION)
                }
        }

    }
}

private fun createImageFile(name: String, activity: Activity, imagePath: String): File {
    // Create an image file name
    var storageDir = File(activity.filesDir, "images/${imagePath}")
    if (!storageDir.exists()) {
        storageDir = File(activity.filesDir, "images/${imagePath}")
        storageDir.mkdirs()
    }
    var file = File(storageDir, "${name}.png")
    file.createNewFile()

    Log.i(this::class.java.canonicalName, "Image created: ${file.exists()}")
    return file

}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (resultCode == RESULT_OK) {
        when (requestCode) {
            CAMERA_PERMISSION -> {
                //imageBitmap = data!!.extras!!.get(MediaStore.EXTRA_OUTPUT) as String
                var photo = file.absolutePath
                if (resultCode == Activity.RESULT_OK) {
                    Glide.with(this)
                        .load(photo)
                        .diskCacheStrategy(DiskCacheStrategy.NONE)
                        .skipMemoryCache(true)
                        .into(image)

                }

            }
        }
    }
}

证据:

图像在desire文件夹中 enter image description here 将图像复制到不需要的文件夹中 enter image description here

最佳答案

在 createImageFile() 中,您调用“getExternalFilesDir(Environment.DIRECTORY_PICTURES)”,这将在 DCIM/Camera 文件夹中创建一个副本。

只需将其更改为您要保存文件的位置即可。
引用https://developer.android.com/training/data-storage/app-specific#java

请注意,Android 10 对各个目录中的文件有不同的处理方式。 https://developer.android.com/training/data-storage

关于java - 当我在 Android 应用程序中创建图像时拍照时,会在 DCIM/Camera 中生成副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60783447/

相关文章:

c# - xamarin 广播接收器访问 View 模型

android - 如何将内部类的值返回给外部类?

android - 单元测试 CoroutineExceptionHandler

android - 如何将变量从可观察值返回到另一种可观察类型

kotlin - 如何避免 ConcurrentModificationException kotlin

java - 如何优化小型 Java 命令行程序的启动时间?

java - LibGDX True Type 字体在按钮中的使用

java - Java GAE 数据存储上的子查询

android - 安卓 :How to set lib path for aapt command?

java - 将 XSLT 2.0 函数 iri-to-uri 替换为来自通过 Java 传入的参数的 URI 列表