使用从MediaStore.Audio.Media.DATA中提取的uri删除文件

时间:2018-01-10 19:33:37

标签: android mediastore

在将此问题标记为重复之前,我想说我曾访问过许多类似的问题,但没有一个问题解决了我的问题。所以,我使用MediaStore从内部存储中提取了所有音频文件,并以字符串形式存储其Uri但后来当我尝试使用该Uri删除音频时使用file.delete,前者返回false。 下面是用于提取歌曲uri及其正常工作的代码:

    Uri uri= MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String selection=MediaStore.Audio.Media.IS_MUSIC+"!=0";
    Cursor c=getContentResolver().query(uri,null,selection,null,null);
    if(c!=null)
    {
        c.moveToFirst();

        do {
            String audioName=c.getString(c.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
            String artist=c.getString(c.getColumnIndex(MediaStore.Audio.Media.ARTIST));
            String album=c.getString(c.getColumnIndex(MediaStore.Audio.Media.ALBUM));
            String url=c.getString(c.getColumnIndex(MediaStore.Audio.Media.DATA));
            String size=c.getString(c.getColumnIndex(MediaStore.Audio.Media.SIZE));

            audioInfoArrayList.add(new AudioInfo(url,audioName,artist,album));

        }while (c.moveToNext());

        c.close();

这里,我已经在自定义类型的arrayList中存储了有关音频的所有检索信息,该自定义类型也以字符串形式存储上面提取的uri,可以使用getUrl()方法提取。 以下是我试图删除它的代码:

Uri uri= Uri.parse(audioInfo.get(position).getUrl()); //its actually returning the url stored above in string form
deleteFile(uri.getPath());
Log.i("logText","uri.getPath() : "+uri.getPath());
Log.i("logText","audioInfo.get(position).getUrl() : "+audioInfo.get(position).getUrl());

deleteFile函数:

public void deleteFile(String filePath){
    if(filePath.startsWith("content://")){
        ContentResolver contentResolver = context.getContentResolver();
        contentResolver.delete(Uri.parse(filePath), null, null);
    }else {
        File file = new File(filePath);
        if(file.exists()) {
            if (file.delete()) {
                Log.e("logText", "File deleted."); //condition 0
            }else {
                Log.e("logText", "Failed to delete file!");  //condition 1
            }
        }else {
            Log.e("logText", "File not exist!"); //condition 2
        }
    }
} 

最后我的logcat是一个示例音频文件:

01-11 13:52:34.257 19982-19982/com.example.hp.myplayer E/logText: Failed to delete file!
01-11 13:52:34.257 19982-19982/com.example.hp.myplayer I/logText: uri.getPath() : /storage/emulated/0/bluetooth/Copy Copy Fireflies-Owl_City[www.Mp3MaD.Com].mp3
01-11 13:52:34.257 19982-19982/com.example.hp.myplayer I/logText: audioInfo.get(position).getUrl() : /storage/emulated/0/bluetooth/Copy Copy Fireflies-Owl_City[www.Mp3MaD.Com].mp3

注意:在调用deleteFile()时,执行条件1不是2或0,根据我的意思是使用存储库中的uri定位文件,但不能删除文件。 delete()返回false。

1 个答案:

答案 0 :(得分:0)

对于Android 6及更高版本,请求在清单中读取和写入外部存储权限是不够的。

您应该添加代码,要求您的应用用户确认所请求的权限。

Google获取运行时权限。