【问题标题】:Android 8.1 - Why I can't delete song file?Android 8.1 - 为什么我不能删除歌曲文件?
【发布时间】:2018-12-28 12:57:16
【问题描述】:

我正在尝试通过此代码从内存手机内存中删除歌曲文件:

private void deleteSongs(){
    String path = song.getPath();
    File songFile = new File(path);

    Log.d(TAG, "Song exists: " + songFile.exists());
    Log.d(TAG, "Song is directory: " + songFile.isDirectory());
    Log.d(TAG, "Song path: " + songFile.getPath());
    Log.d(TAG, "Song name: " + songFile.getName());

    if(songFile.delete())
        Log.d(TAG, "Song deleted successfully by File.delete()");
    else{
        Log.d(TAG, "Can't delete file by File.delete()");
        if(getActivity().deleteFile(songFile.getName()))
            Log.d(TAG, "Song deleted successfully by Activity.deleteFile()");
        else
            Log.d(TAG, "Can't delete file by Activity.deleteFile()");
    }
}

但它不起作用。 Logcat 说:

D/DeleteSongDialog: Song exists: true
D/DeleteSongDialog: Song is directory: false
D/DeleteSongDialog: Song path: /storage/emulated/0/Download/2 sekundowy film-20.m4a
D/DeleteSongDialog: Song name: 2 sekundowy film-20.m4a
D/DeleteSongDialog: Can't delete file by File.delete()
D/DeleteSongDialog: Can't delete file by Activity.deleteFile()

带有 FileProvider 的 solution 不适用于 Android >= 8.0,但适用于例如 Android 7.0。也许有人知道我应该在我的或@CodeToLife 代码中更改什么?

提前致谢。

【问题讨论】:

  • 为了确保你做的一切都是正确的,你能检查一下“songFile.exists()”和“songFile.isDirectory()”的输出吗?
  • @HirasawaYui,我发布了 Logcat。

标签: java android file delete-file android-8.1-oreo


【解决方案1】:

getActivity().deleteFile(songFile.getName()) 替换为songFile.delete()。另外,请确保您拥有WRITE_EXTERNAL_STORAGE 权限,包括在运行时在 Android 6.0+ 上请求该权限。

【讨论】:

  • 我正在尝试删除 getActivity().deleteFile(songFile.getName())songFile.delete() 的这首歌 - 它不起作用。是的,我有权限。
  • @Oktawian: deleteFile() 不适用于任意位置的文件。 delete() 应该可以工作,我不确定为什么它不适合您的情况。
  • 在 Android 7.0 上一切正常。我的 Android 8.1 出现问题 - 它需要另一种解决方案。
  • @Oktawian 这是因为song.getPath(); 没有给你任何真实的文件系统路径
  • 那么在这种情况下我该怎么办?
【解决方案2】:

@CommonsWare 帮我找到了解决方案。我不得不更改此代码:

Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, song.getId());
getActivity().getContentResolver().delete(uri, null, null);

希望对你也有帮助

【讨论】:

    猜你喜欢
    • 2018-01-24
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多