如何使用 Kotlin 从 Android 设备存储中删除文件?

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

我正在开发一个Android应用程序,它将车辆图像(从设备的相机拍摄)存储在设备存储中(/data/files/image1.jpg、/data/files/image2.jpg等),这是正确完成的,但是当我不再需要特定图像时我无法删除它们(例如:我从 SQLite 数据库中删除车辆)。所有车辆均“呈现”在 Jetpack Compose 屏幕中,其中包含“Card”可组合项和“LazyColumn”可组合项。每张卡都有一个“删除”按钮,效果很好,它确实删除了卡,并且状态更改正确更新了 UI,除非我删除另外两张卡之间的卡,删除后的卡会显示已删除卡的照片自己的照片。我读过它可能与尝试删除正在使用的文件有关,但我首先删除数据库记录(其中有一个文本类型的“imagepath”字段),所以我不会使用现在,理论上,我应该能够从设备存储中删除该图像文件。

我在 ViewModel 中创建了一个函数,它可以删除记录和图像文件,但是执行 file.delete() 不会删除它,因为它仍然出现在设备资源管理器中。如果您有任何建议,请告诉我,因为几个月来我一直在努力解决这个问题。

这是我的 ViewModel 中的函数:

  fun deleteVehicle(id:Int,fileName:String){


    viewModelScope.launch{

        val directory = context.filesDir
        val file = File(directory, fileName)

        try{

            repository.deleteVehicle(id)

            if(file.exists()){

                file.delete()

            }
        }catch(e:Exception){

            Log.e("ViewModel:","Error while trying to delete the vehicle: ${e.message}")

        }

    }

    }

提前非常感谢您。

android image kotlin sqlite
1个回答
0
投票

抱歉,正确的路径是“/data/data/com.alberto.autocontrol2/files”(取自Android Studio的设备资源管理器)。这是从相机拍摄照片并将其保存到设备存储的代码。该代码取自单独的“PantallaRegistrarVehiculo.kt”屏幕(英文为 VehicleRegistrationScreen.kt):

 val lanzador = rememberLauncherForActivityResult(
  contract = ActivityResultContracts.TakePicturePreview()

) { 位图:位图? -> if (位图!= null) { val file = File(contexto.filesDir, "${viewModel.listaVehiculos.value.size}.jpg") // 或 .png 尝试 { FileOutputStream(文件).use { 输出 -> bitmap.compress(Bitmap.compressFormat.JPEG, 100, out) // 或 PNG } imageBitmap = 位图.asImageBitmap() } catch (e: IOException) { e.printStackTrace() } } }

© www.soinside.com 2019 - 2024. All rights reserved.