Это началось как общий пользовательский вопрос на форумах Android. Однако он стал, по необходимости, вопросом программирования. Вот моя проблема.
Android имеет сервис - MediaScanner - который работает в фоновом режиме в любое время (я считаю), SD-карта не смонтирована и снова установлена. Эта служба собирает данные обо всех медиафайлах на карте и предоставляет SQLite DB, которые могут быть запрошены музыкальными приложениями. Большинство музыкальных приложений используют эту услугу, поскольку она экономит заряд батареи, связанный с сканированием SD-карты.
Поскольку я начал использовать android, у меня постоянно возникала проблема, при которой плейлисты M3U, синхронизированные с устройством, остаются в этой SQLite DB даже после удаления с SD-карты. Это дошло до того, что теперь у меня есть коллекция из примерно 40 списков воспроизведения, которые появляются в любом музыкальном приложении, которое я использую, несмотря на то, что на карте есть только около 10 м3u файлов. Остальные плейлисты не играют, и они пусты. Я могу удалить их вручную, удалив их из музыкального приложения, но мне это надоело. Должен быть лучший способ удалить эти плейлисты с призраками.
На Android Market есть два приложения - SDRescan и Music Scanner, которые, предположительно, делают именно это, но ни один из них не работает.
Я начал писать собственное приложение, чтобы обновить или удалить базу данных 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())));
}
}