http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/5.1.1_r1/com/android/providers/media/MediaScannerReceiver.java#MediaScannerReceiver
MediaScannerReceiver :接收广播,启动MediaScannerService
MediaScannerReceiver接收三种广播:
- Intent.ACTION_BOOT_COMPLETED : 开机完成
- Intent.ACTION_MEDIA_MOUNTED:媒体挂载
- Intent.ACTION_MEDIA_SCANNER_SCAN_FILE:扫描单个文件
1.扫描内部设备和外部设备
2. 获取广播intent携带的数据 uri,若 uri.getScheme().equals("file") ,扫描外部设备
3. 通过uri获取文件路径,若文件路径为外部设备路径(path.startsWith(externalStoragePath + "/")),扫描指定文件
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
final Uri uri = intent.getData();
if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
// Scan both internal and external storage
scan(context, MediaProvider.INTERNAL_VOLUME);
scan(context, MediaProvider.EXTERNAL_VOLUME);
} else {
if (uri.getScheme().equals("file")) {
// handle intents related to external storage
String path = uri.getPath();
String externalStoragePath = Environment.getExternalStorageDirectory().getPath();
String legacyPath = Environment.getLegacyExternalStorageDirectory().getPath();
try {
path = new File(path).getCanonicalPath();
} catch (IOException e) {
Log.e(TAG, "couldn't canonicalize " + path);
return;
}
if (path.startsWith(legacyPath)) {
path = externalStoragePath + path.substring(legacyPath.length());
}
Log.d(TAG, "action: " + action + " path: " + path);
if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) {
// scan whenever any volume is mounted
scan(context, MediaProvider.EXTERNAL_VOLUME);
} else if (Intent.ACTION_MEDIA_SCANNER_SCAN_FILE.equals(action) &&
path != null && path.startsWith(externalStoragePath + "/")) {
scanFile(context, path);
}
}
}
}
scan() 方法:启动MediaScannerService,并传入volume名
scanFile() 方法:启动MediaScannerService,并传入filePath
private void scan(Context context, String volume) {
Bundle args = new Bundle();
args.putString("volume", volume);
context.startService(
new Intent(context, MediaScannerService.class).putExtras(args));
}
private void scanFile(Context context, String path) {
Bundle args = new Bundle();
args.putString("filepath", path);
context.startService(
new Intent(context, MediaScannerService.class).putExtras(args));
}