MediaScanner 이벤트 용 BroadcastReceiver를 등록하고 Intent.ACTION_MEDIA_SCANNER_FINISHED 의도를 수신 할 때마다 목록을 새로 고칠 수 있습니다. 당신이 받아야하므로
IntentFilter scanFileReceiverFilter= new IntentFilter();
scanFileReceiverFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
scanFileReceiverFilter.addDataScheme("file");
BroadcastReceiver scanFileReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
Uri uri = intent.getData();
String path = null;
if (uri != null) {
path = uri.getPath();
}
//TODO:refresh list in path
}
}
};
getActivity().registerReceiver(scanFileReceiver, scanFileReceiverFilter);
변경 후 미디어 스캐너를 실행 할 것으로 예상된다 로컬 데이터를 삭제되는 모든 응용 프로그램, 미디어 DB를 동기화합니다.
그러나 이것은 응용 프로그램이 실행되는 동안에 만 작동합니다. 백그라운드를 삭제하려면 매니페스트에 등록해야합니다.
DB를 사용하여 재생 목록 항목을 저장하는 경우 새로 고침을 위해 수신 된 LIKE 경로 경로가있는 모든 파일을 확인할 수 있으므로 효율적입니다.
기기에 엄청난 양의 콘텐츠가있어이 이벤트가 늦게 수신되는 경우가 있습니다.
uri MediaStore.Audio.Media.getContentUri ("external")와 함께 registerContentObserver를 호출하는 ContentObserver를 사용할 수도 있습니다. 모든 미디어 공급자는 오디오보기가 있으므로 효율적으로 작동해야합니다.
나는 내 애플 리케이션 중 하나에서 아주 비슷한 것을 구현했다. 나는 그것이 당신이 원하는 것인지 모른다. 기본적으로 목록의 모든 시작 부분에 노래를 다시로드하고 재생 목록, 대기열 등을 반복하고 더 이상 목록에없는 노래를 찾아서 제거합니다. 나는 가장 좋은 해결책이 아니라는 것을 알고 있지만 나를 위해 일했다. 왜냐하면 평균 장치에있는 노래의 수가 아주 적기 때문에 재 장전해도 성능에 많은 영향을 미치지 않기 때문이다. –
@ HarjotSinghOberai- 감사합니다. 나는 비슷한 접근법을 가졌지 만, 주로 모든 노래가 대기열/재생 목록에있는 경우 앱 시작 속도가 느려집니다. – Libin
나는 내 마음 속에 또 다른 접근법을 가졌지 만 구현하지 않았다. 앱 시작시 아무 것도하지 말고 노래가 재생 될 때마다 MediaPlayer에서 데이터 소스를 설정하기 전에 경로를 확인하십시오. 경로가 없으면 노래가 삭제되어 다음 노래로 건너 뛰고 백그라운드에서 노래가 재생 목록 또는 목록에있는 다른 장소에서 삭제된다는 것을 알고 있습니다. –