【问题标题】:How to delete a file using uri in android如何在android中使用uri删除文件
【发布时间】:2020-07-20 11:34:26
【问题描述】:

我是 android 应用程序开发的新手,我正在构建一个音乐播放器应用程序。我正在使用 Content Resolver 查询歌曲。我想实现一个从设备中永久删除歌曲的功能。我正在使用以下代码,但无法实现。

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

        File file = new File(uri.getPath());

        if(file.delete()){
            Log.d("MUSIC SERVICE DELETE","SUCCESS");
        }
        else {
            Log.d("MUSIC SERVICE DELETE","FAILED");
        }

【问题讨论】:

  • 您的 uri 不能使用 File 类。而且您没有告诉您使用的是 Android Q 还是更低版本。看看这里开始:stackoverflow.com/questions/20719198/…
  • 我使用的是 android R 或更低版本。在那篇文章中使用了 MediaStore.MediaColumns.DATA 已被弃用,并且使用 ContentResolver.delete(uri,null,null) 不会删除文件。
  • 如果您有 uri,那么您不需要 .DATA 列进行删除。在 Q+ 上有 .RELATIVE_PATH。但是您不需要删除 uri。
  • 在 Q+ 上从 MediaStore 中删除就是您所要做的。在 Q 以下,您也必须删除文件本身(我认为确实使用 .DATA)。
  • 我要删除文件系统中的物理文件

标签: android android-file


【解决方案1】:

感谢 blackapps 的 cmets,我终于弄明白了怎么做。 这是我用来实现删除的代码

ContentResolver contentResolver = getContentResolver();
        Song song = songsSet.get(songPosition);
        Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,songsSet.get(songPosition).getId());
        if(contentResolver.delete(uri,null,null) > 0){
            Log.d("DATABASE DELETE","SUCCESS");

            if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q){
                File file = new File(song.getData());
                if(file.delete()){
                    Log.d("DELETE","SUCCESS");
                }
                else {
                    Log.d("DELETE","FAILED");
                }
            }

            songsSet.remove(song);
        }
        else {
            Log.d("DATABASE DELETE","FAILED");
        }

在 android Q 中,您不能在 MediaStore 中使用 DATA,而使用 ContentResolver.delete() 会删除 ContentProvider 条目和文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2019-11-24
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多