これは、Android フォーラムでの一般的なユーザーの質問として始まりました。しかし、それは必然的にプログラミングの問題になりました。これが私の問題です。
AndroidにはMediaScannerというサービスがあり、SDカードがマウント解除されて再マウントされるといつでも(私は信じています)バックグラウンドで実行されます。このサービスは、カード上のすべてのメディア ファイルのデータを収集し、音楽アプリケーションからクエリできる SQLite DB を提供します。ほとんどの音楽アプリケーションは、SD カードのスキャンに関連するバッテリーの消耗を抑えるため、このサービスを使用しています。
Androidを使い始めてから、SDカードから削除しても、デバイスに同期したM3UプレイリストがこのSQLite DBに残るという問題が一貫してありました。カードには約10個のm3uファイルしかないにもかかわらず、使用する音楽アプリに約40個のプレイリストのコレクションが表示されるようになりました. 残りのプレイリストは再生されず、空です。音楽アプリから削除することで手動で削除できますが、これを行うのはうんざりです。これらのゴースト プレイリストを削除するには、もっと良い方法が必要です。
Android マーケットには SDRescan と Music Scanner の 2 つのアプリがあります。これらはまさにこれを行うと思われますが、どちらも機能しません。
MediaStore データベースを更新または削除してゼロから始める独自のアプリの作成に着手しましたが、あまり進んでいません。次のコードを実行する Android アプリがあります。
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
SDカードをスキャンする方法としてオンラインでこのコードの例をいくつか見つけましたが、まったく運がありません。任意のヒント?
完全なコード:
package com.roryok.MediaRescan;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
public class MediaRescan extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
setContentView(R.layout.main);
}
//Rescan the sdcard after copy the file
private void rescanSdcard() throws Exception{
Intent scanIntent = new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory()));
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
intentFilter.addDataScheme("file");
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
}