Hyun Chul's Utopia

Media Scanning 수행시키기 본문

프로그래밍/Android

Media Scanning 수행시키기

디프시다루핀 2013. 1. 7. 14:32

 별 내용이 없습니다. 제목 그대로.. Media Scanning 작업을 수행합니다. Media Scanning작업은 직접 제어한다기 보다는 Android System에게 요청을 하고, 요청을 받은 Android System이 Media Scanning를 수행하는 구조로 이루어져 있습니다.


 해당 요청은 Intent를 이용하여 Broadcast를 날려주면 됩니다. 간단히 만들어 본 예제는.. 외장 메모리 전체를 수행하도록 하는 기능과, 파일 하나를 단독으로 수행하도록 하는 방법입니다. Intent의 Action값을 바꿔주기만 하면 됩니다.


// 외장 메모리 전체 MediaScanning
public static void startExtMediaScan(Context mContext){
	mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}

// 선택된 파일에 대한 MediaScanning
public static void startFileMediaScan(Context mContext, String path){
	mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));
}



 Media Scanning작업의 과정을 보다 자세히 알고 싶다면.. 간단한 수정으로 가능할 듯 하네요.. 시작 시점과 종료 시점을 알고 싶다는 전제하에 만든 예제 코드는 다음과 같습니다.


// MediaScanning 시작과 끝 판별.
public static void mediaScanner(Context mContext, onMediaScannerLisenter lisenter){
	mediaScanner(mContext, lisenter, "/" + Environment.getExternalStorageDirectory().toString());
}

// MediaScanning 시작과 끝 판별.
public static void mediaScanner(final Context mContext, final onMediaScannerLisenter lisenter, String dirPath){
	BroadcastReceiver broadcast = new BroadcastReceiver() {
		public void onReceive(Context context, Intent intent) {
			if(intent.getAction().equals(Intent.ACTION_MEDIA_SCANNER_STARTED)){
				//Toast.makeText(mContext, intent.getData().getPath()+"media scann start!", Toast.LENGTH_SHORT).show();
				if(lisenter != null)
					lisenter.onScanStart(context, intent);
			}else if (intent.getAction().equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
				//Toast.makeText(mContext, intent.getData().getPath()+"media scann finish!", Toast.LENGTH_SHORT).show();
				if(lisenter != null)
					lisenter.onScanFinish(context, intent);
			}
		}
	};

	IntentFilter inFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
	inFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
	inFilter.addDataScheme("file");
	mContext.registerReceiver(broadcast, inFilter);

	if(lisenter != null)
		lisenter.onScanCreate();
		
	Log.i("MediaScanning", "mediaScanner :: dirPath :: file:/" + dirPath);
	mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file:/" + dirPath)));
}
	
public interface onMediaScannerLisenter {
	public void onScanCreate();
	public void onScanStart(Context context, Intent intent);
	public void onScanFinish(Context context, Intent intent);
}


 폴더 단위로 가능한지는 좀 더 테스트를 해봐야 겠네요..


--- 내용 추가 2014. 3. 4.

 단일 파일에 대하여 미디어 스캐닝을 수행할 때.. 위의 방법보다 보다 심플한 방법이 있었네요.. 왜 이런걸 몰랐는지... API문서좀 찾아볼걸 그랬네요..


아래와 같이 클래스 하나 생성해 주고....

public class MediaScanning implements MediaScannerConnectionClient{
	
	private MediaScannerConnection mConnection;
	private File mTargetFile;
	
	public MediaScanning(Context mContext, File targetFile) {
		this.mTargetFile = targetFile;
		
		mConnection = new MediaScannerConnection(mContext, this);
		mConnection.connect();
	}

	@Override
	public void onMediaScannerConnected() {
		mConnection.scanFile(mTargetFile.getAbsolutePath(), null);
	}

	@Override
	public void onScanCompleted(String path, Uri uri) {
		mConnection.disconnect();
	}
}



이렇게 사용하면 끝..

MediaScanning scanning = new MediaScanning(getContext(), targetFile);



문제없이 동작하는 것 같습니다.




Comments