您的位置:首页 > 其它

MediaScan流程(一) MediaScannerReceiver

2016-08-20 00:00 260 查看
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));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MediaScannerReceiver