使用Uri删除文件

4

我尝试以以下方式删除文件:

getContentResolver().delete(uri, null, null)

当uri为content://media/external/video/media/1214时,它适用于视频,但对于音频文件content://media/external/audio/media/1212则不适用。

我需要使用它来删除从相机和录音机接收到的文件,因为目前这些文件在我的应用程序目录和SD卡上。

有人可以帮帮我吗?出了什么问题?


文件 file = new 文件(yourUri); file.delete(); - ak sacha
感谢预先发帖不会得到帮助。 - greenapps
2
当您尝试删除时,是否出现任何错误/异常?该文件可能正在使用中吗? - TripeHound
由于某种原因,我也遇到了同样的问题。我可以删除我在外部目录中创建的图片,但尝试删除我创建的语音文件会导致异常。所以,使用下面的答案,我可以删除它。File(uri.path).delete()。我不能使用File(uri),因为File期望一个Java URI,而我的uri是Android Uri。 - Damn Vegetables
2个回答

7

Kotlin扩展:

fun File.delete(context: Context): Boolean {
   var selectionArgs = arrayOf(this.absolutePath)
   val contentResolver = context.getContentResolver()
   var where: String? = null
   var filesUri: Uri? = null
   if (android.os.Build.VERSION.SDK_INT >= 29) {
      filesUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
      where = MediaStore.Images.Media._ID + "=?"
      selectionArgs = arrayOf(this.name)
   } else {
      where = MediaStore.MediaColumns.DATA + "=?"
      filesUri = MediaStore.Files.getContentUri("external")
   }

   val int = contentResolver.delete(filesUri!!, where, selectionArgs)

   return !this.exists()
}

这样调用:

val file = File(uri.path)
file.delete(applicationContext)

0
以下代码不仅删除图像文件,还会删除在删除图像时留下的0字节文件。我在Android 10中观察到了这种0字节幽灵文件的行为。
    val fileToDelete = File(photoUri.path)
    if (fileToDelete.exists()) {
        if (fileToDelete.delete()) {
            if (fileToDelete.exists()) {
                fileToDelete.canonicalFile.delete()
                if (fileToDelete.exists()) {
                    getApplicationContext().deleteFile(fileToDelete.name)
                }
            }
            Log.e("", "File Deleted " + savedPhotoUri.path)
        } else {
            Log.e("", "File not Deleted " + savedPhotoUri.path)
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接