自行下載 MP3 檔案後,MediaStore 查詢不到新檔案,必須重開機才會出現在歌曲列表;但系統瀏覽器下載則即時可見。
Android 媒體掃描器(MediaScanner)不會自動偵測應用程式私有目錄或未通過標準下載管道寫入的檔案。系統瀏覽器下載完成後會主動發送廣播通知 MediaScanner 掃描。
// 下載完成後呼叫
MediaScannerConnection.scanFile(
context,
new String[]{ fileAbsolutePath },
new String[]{ "audio/mpeg" }, // MIME 類型
(path, uri) -> Log.d("MediaScan", "Scanned: " + path + " -> " + uri)
);
public class MediaScannerWrapper implements MediaScannerConnection.MediaScannerConnectionClient {
private MediaScannerConnection connection;
private String path;
private String mimeType;
public MediaScannerWrapper(Context context, String mime) {
mimeType = mime;
connection = new MediaScannerConnection(context, this);
}
public void scan(String filePath) {
path = filePath;
if (connection.isConnected()) {
connection.scanFile(path, mimeType);
} else {
connection.connect();
}
}
@Override
public void onMediaScannerConnected() {
connection.scanFile(path, mimeType);
}
@Override
public void onScanCompleted(String path, Uri uri) {
connection.disconnect();
}
}
new MediaScannerWrapper(context, "audio/mpeg").scan("/sdcard/Download/song.mp3");
呼叫後,媒體庫即刻更新,ListView 通過 notifyDataSetChanged() 即可顯示新歌曲。