android - 为什么内容解析器在android中找到已删除的音频文件

标签 android android-contentprovider android-cursor

我正在尝试开发一个简单的音乐播放器,我使用 Content Resolver 以及 URICursor 来定位所有音乐格式安卓设备。

但是在测试时,我发现即使从设备中删除了一首歌曲,它们仍然存在于歌曲 array !.

这是为音频文件迭代设备的代码:

            ContentResolver musicResolver = getContentResolver();
            Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);


        if(musicCursor!=null && musicCursor.moveToFirst()){
            //get columns

            int songArtist = musicCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
            int songName = musicCursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME);
            int songAlbum = musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
            int songDuration = musicCursor.getColumnIndex(MediaStore.Audio.Media.DURATION);
            int songSource = musicCursor.getColumnIndex(MediaStore.Audio.Media._ID);
            int source = musicCursor.getColumnIndex(MediaStore.Audio.Media.DATA);//not used yet

//            int gg = musicCursor.getColumnIndex(MediaStore.I)

            //add songs to list
            do {
                long id = musicCursor.getLong(songSource);
                String paths = musicCursor.getString(source);
                String title = musicCursor.getString(songName);
                String artist = musicCursor.getString(songArtist);
                String album = musicCursor.getString(songAlbum);
                long duration = musicCursor.getLong(songDuration);

                songs.add(new Song(id, title, artist, album, duration, paths));
            }
            while (musicCursor.moveToNext());
        }

这是包含每首歌曲详细信息的 Song 类:

package andy.propaganda;
import java.io.Serializable;

public class Song implements /*Parcelable*/ Serializable {

    private String album;
    private String author;
    private String artist;
    private String name;
    private long dataSource;
    private long duration;
    private String genre;
    private String bitRate;
    private byte[] image;

    public Song(){
        image = null;
    }

    public Song(long id, String name, String artist, String album, long duration, String tmp){
        this.album = album;
        this.name = name;
        this.artist = artist;
        this.duration = duration;
        this.dataSource = id;
        image = null;
        this.bitRate = tmp;
    }

    public String getArtist() {
        return artist;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getDataSourse() {
        return dataSource;
    }

    public void setDataSourse(long dataSource) {
        this.dataSource = dataSource;
    }

    public String getGenre() {
        return genre;
    }

    public void setGenre(String genre) {
        this.genre = genre;
    }

    public String getBitRate() {
        return bitRate;
    }

    public void setBitRate(String bitRate) {
        this.bitRate = bitRate;
    }

    public byte[] getImage() {
        return image;
    }

    public void setImage(byte[] image) {
        this.image = image;
    }

    public long getDuration() {
        return duration;
    }

    public void setDuration(long duration) {
        this.duration = duration;
    }

}

最佳答案

删除文件时,需要使用MediaScannerConnection 对其进行扫描。然后文件删除实际上通过 ContentResolver

反射(reflect)在你的下一个查询中

例如,对于删除 mp3 文件,这样的行可以解决问题: MediaScannerConnection.scanFile(getContext(), new String[]{file.getPath()}, new String[]{"mp3/*"}, null);

关于android - 为什么内容解析器在android中找到已删除的音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35290959/

相关文章:

android - 我们可以将一个数据库用于两个或多个应用程序吗?

Android SQLite - 光标和内容值

java - 如何访问firebase数组

java - 从回调函数将对象从 android ViewModel 返回到 fragment

Android - 将 Dao 模式与 contentProvider 结合使用

android - 在两个应用程序之间共享数据库

android - 将 SQLite 列转换为行

java - Android - 你能为 SQLite 结果更新 Cursor 吗?

Android:如何将 map View 的缩放级别设置为当前位置周围 1 公里半径?

android - xamarin 形式的本地化