Let me clarify the code, the post from last night was in sheer
exhaustion after having looked at it for hours on end.
Now, I have the mediascanner invoked from inside a thread to pick up
the new metadata and art that has been written to the file
Thread thread = new Thread()
{
@Override
public void run() {
List<String>
mTrackUris = getListOfChangedFiles();
if
(mTrackUris != null && !mTrackUris.isEmpty()) {
final Iterator iter = mTrackUris.iterator();
SingleMediaScanner singleFileScanner = new
SingleMediaScanner(FetchResultDetailActivity.this,
mTrackUris.size());
while(iter.hasNext()) {
final String track = (String) iter.next();
if (track != null) {
if (Consts.DEBUG) {
Log.i(TAG, String.format("Kicking the mediascanner for
track: %s", track));
}
//
This clears off the entry out of the audio_meta, albums and album_art
tables. This is expected, so that is good
int
rowsUpdated =
getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
"_data = '" + track + "'", null);
singleFileScanner.setFilepath(track);
singleFileScanner.startScan();
}
}
}
And, this is my mediascanner class
private class SingleMediaScanner implements
MediaScannerConnectionClient {
private MediaScannerConnection mMediaScanner;
private String mFilepath;
private int mNumFilesToScan;
public SingleMediaScanner(Context context, int numFilesToScan) {
mNumFilesToScan = numFilesToScan;
mMediaScanner = new MediaScannerConnection(context, this);
}
@Override
public void onMediaScannerConnected() {
if (Consts.DEBUG) {
Log.i(TAG, String.format("Scan starting for:
%s", mFilepath));
}
mMediaScanner.scanFile(mFilepath, null);
}
@Override
public void onScanCompleted(String path, Uri uri) {
if (Consts.DEBUG) {
Log.i(TAG, String.format("Scan finished for:
%s, uri: %s", path,
uri.toString()));
}
mMediaScanner.disconnect();
if (--mNumFilesToScan == 0) {
h.sendEmptyMessageDelayed(SAVE_ART2, 10);
}
}
public void startScan() {
mMediaScanner.connect();
}
/**
* @param mFilepath the mFilepath to set
*/
public void setFilepath(String filepath) {
this.mFilepath = filepath;
}
}
Hopefully this is a lot clearer than the earlier post, please share
any ideas you have.
After the scanner runs, if I pull the database file from the phone out
and view it, only the "audio_meta" entry seems recreated, the albums
and album_art entries are not.
Thanks !
On Mar 28, 10:58 pm, androidmediadeveloper <[email protected]>
wrote:
> I have spent 2 entire days on this but havent been able to figure out,
> if someone has any ideas, please please share.
>
> I am basically trying to update the album_art on a user's music
> collection. So, when a user is playing a track, he/she can make a "get
> art" request. I fetch art from an external source and then actually
> write the art and metadata to the mp3 file. All this is working great,
> the file is accurately written with the new art.
>
> My problem however is this, since the player uses the android
> medialibrary to display metadata and art (MedisStore.Audio.Media),
> this database does not seem to reflect the new art even after a
> mediascannerconnection.scanFile. I found out that behind the content
> provider for media, there is a sqlite database which has 3 tables of
> interest, a "audio_meta" table, an "albums" table and yet another
> "album_art". This never seems to get refreshed after the new art is
> written to the file, even with a scanFile.
>
> So, thinking I have to somehow flush the media cache, I issed a
> follwing delete query into the activity, So, this code runs, and it
> cleans up the tables accurately (blows the entry from audio_meta,
> albums),
>
> Here's the delete code
>
> WinampApp.getInstance().getContentResolver().delete(MediaStore.Audio.Media.
> EXTERNAL_CONTENT_URI,
> String.[); and this works great
>
> The code that exercises the oceancily
>
> Thread thread = new Thread() {
> @Override
> public void run() {
> // set the
> appropriate flags based on checkbox selection in the
> UI
> NError
> replicantSaveResult = AutoTagAlbum.save(mResultMetadata,
> true, true);
> if
> (replicantSaveResult == NError.Success) {
> Log.i(TAG,
> "Successfully applied the metadata to the file");
> setResult(
> FetcherActivity.RESULTS_APPLIED_SUCCESSFULLY );
> if
> (mTrackUris != null && !mTrackUris.isEmpty()) {
> //
> explicitly write the media library database
> //
> not to rely solely on the mediascanner
> final
> Iterator iter = mTrackUris.iterator();
>
>
> SingleMediaScanner singleFileScanner = new
> SingleMediaScanner(FetchResultDetailActivity.this, mTrackUris.size());
>
>
> }
> }
>
> Please help ! The old art is no matter what '
>
> Thanks
> ego
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en