ContentObserver onChange вызывается дважды - PullRequest
0 голосов
/ 27 марта 2020

Когда я пытаюсь обновить информацию об аудиофайле, метод onChange() в моем ContentObserver вызывается дважды по какой-то причине.

Я регистрирую Observer в своей функции MainActivity, и он наблюдает изменения в MediaStore.Audio.Media.EXTERNAL_CONTENT_URI

Мой класс ContentObserver

public class MediaStoreObserver extends ContentObserver {
    public MediaStoreObserver(Handler handler) {
        super(handler);
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
    }

    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange, uri);
        Log.d("MediaStoreObserver", "Change detected!");
    }
}

OnChange вызывается дважды, когда я вызываю этот метод

public void changeMp3Tags(Context c, long songID, long albumID,
                              String title, String artist, String album, String file_path, String year) throws Exception {
        try {

            final Uri musicUri      = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

            final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
            Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, albumID);

            ContentResolver resolver = c.getContentResolver();

            String currentTitle     = MediaStore.Audio.Media.TITLE;
            String currentArtist    = MediaStore.Audio.Media.ARTIST;
            String currentAlbumID   = MediaStore.Audio.Media.ALBUM_ID;
            String currentAlbum     = MediaStore.Audio.Media.ALBUM;
            String currentAlbumData = MediaStore.Audio.Media.DATA;
            String currentYear      = MediaStore.Audio.Media.YEAR;

            ContentValues values = new ContentValues();
            values.put(currentTitle, title);
            values.put(currentArtist, artist);
            values.put(currentAlbum, album);
            values.put(currentYear, year);

            ContentValues valuesAlbum = new ContentValues();
            valuesAlbum.put(currentAlbumID, albumID);
            valuesAlbum.put(currentAlbumData, file_path);

            //Update song info.
            String where = MediaStore.Audio.Media._ID + "=?";
            String[] whereVal = {Long.toString(songID)};
            resolver.update(musicUri, values, where, whereVal);

            //Update albumArt.
            resolver.delete(albumArtUri, null,null);
            resolver.insert(sArtworkUri, valuesAlbum);

        }catch (Exception e){
            Log.e(TAG, "Exception caught when changing MP3 tags!", e);
            throw new Exception();
        }  
}

РЕДАКТИРОВАТЬ

Я нашел причину, по которой он вызывается дважды, потому что я также удаляю значение и вставляю его для обновления обложки альбома.

Как я могу отфильтровать это в мой обозреватель, чтобы onChange() не вызывали дважды?

 //Update albumArt.
 resolver.delete(albumArtUri, null,null);
 resolver.insert(sArtworkUri, valuesAlbum);
...