【问题标题】:Can't delete file in Android无法在 Android 中删除文件
【发布时间】:2014-12-18 13:08:05
【问题描述】:

我希望删除音乐文件夹中存储在手机(没有 SD 卡)中的音乐文件。我有文件路径,File.exists() 说是真的。接下来,File.delete() 也说对了,但文件留在原处。但! “删除”后我不能再播放这个文件,编辑名称,也不能复制它。但我可以手动删除它。

我设置了android.permission.WRITE_EXTERNAL_STORAGE。操作系统 4.4.4 GPE

我的错误在哪里?任何建议,谢谢。

    File file = new File(Path);
    if (file.exists()){
        file.setWritable(true, false);
        return file.delete();
    }

【问题讨论】:

  • “我不能再播放这个文件,编辑名称也不能复制它”——用什么? “但我可以手动删除它”——使用什么?
  • @CommonsWare 使用 Windows 文件资源管理器)

标签: android android-file android-permissions


【解决方案1】:

Windows 不直接查看外部存储。它正在查看您的 Android 设备上的媒体传输协议 (MTP) 服务器提供的数据。反过来,它使用的是MediaStore 索引,而不是实际的文件系统。

如果您对外部存储进行任何更改,例如删除文件,则需要更新MediaStore。即兴发挥,我不记得如何对已删除的文件执行此操作,但我会考虑尝试使用 MediaScannerConnection and scanFile() 来扫描包含已删除文件的目录。

【讨论】:

  • 谢谢,我使用了context.getContentResolver().delete(),它似乎有效。但后来我尝试使用StatFs 获取可用空间值,它没有改变,保持不变。请问你知道怎么更新吗?
  • @konopko:我希望当您实际删除文件时磁盘空间会增加。我不太清楚您对ContentResolver 使用了什么,但这可能只是删除了MediaStore 条目,而不是文件。如果是这样,您不仅不会恢复磁盘空间,而且当它定期扫描所有外部存储时,文件将在MediaStore 中显示备份。
【解决方案2】:

所以,我的最终解决方案似乎可行:

public Boolean deleteTrack(String key){
    MusicTrack track = getAlbum(0).getTrackByKey(key);
    if (track == null) return false;

    File file = new File(track.getData().Path);
    if (file.exists()){
        file.setWritable(true, false);
        String where = MediaStore.Audio.Media.DATA +"=\""+ track.getData().Path +"\"";
        if (context.getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, where, null) == 1){
            if (file.exists()){
                Boolean d = file.delete();
                context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
                return d;
            }
            return true;
        }
    }
    return false;
}

【讨论】:

  • 你能解释一下这里的关键是什么吗? track.getData().Path ?
  • @ErumHannan 这是一个文件路径
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 2018-04-05
  • 2015-10-12
相关资源
最近更新 更多