Android中扫描多媒体文件操作详解

这篇文章从系统源代码分析,讲述如何将程序创建的多媒体文件加入系统的媒体库,如何从媒体库删除,以及大多数程序开发者经常遇到的无法添加到媒体库的问题等。本人将通过对源代码的分析,一一解释这些问题。

Android中的多媒体文件扫描机制

Android提供了一个很棒的程序来处理将多媒体文件加入的媒体库中。这个程序就是MediaProvider,现在我们简单看以下这个程序。首先看一下它的Receiver

    <receiver android:name="MediaScannerReceiver">

        <intent-filter>

            <action android:name="android.intent.action.BOOT_COMPLETED" />

        </intent-filter>

        <intent-filter>

            <action android:name="android.intent.action.MEDIA_MOUNTED" />

            <data android:scheme="file" />

        </intent-filter>

        <intent-filter>

            <action android:name="android.intent.action.MEDIA_UNMOUNTED" />

            <data android:scheme="file" />

        </intent-filter>

        <intent-filter>

            <action android:name="android.intent.action.MEDIA_SCANNER_SCAN_FILE" />

            <data android:scheme="file" />

        </intent-filter>

    </receiver>

MediaScannerReceiver只接收符合action和数据规则正确的intent。

MediaScannerReciever如何处理Intent

1.当且仅当接收到action android.intent.action.BOOT_COMPLETED才扫描内部存储(非内置和外置sdcard)

2.除了action为android.intent.action.BOOT_COMPLETED 的以外的intent都必须要有数据传递。

3.当收到 Intent.ACTION_MEDIA_MOUNTED intent,扫描Sdcard

4.当收到 Intent.ACTION_MEDIA_SCANNER_SCAN_FILE intent,检测没有问题,将扫描单个文件。

MediaScannerService如何工作

实际上MediaScannerReceiver并不是真正处理扫描工作,它会启动一个叫做MediaScannerService的服务。我们继续看MediaProvider的manifest中关于service的部分。

 <service android:name="MediaScannerService" android:exported="true">

        <intent-filter>

            <action android:name="android.media.IMediaScannerService" />

        </intent-filter>

    </service>

MediaScannerService中的scanFile方法

private Uri scanFile(String path, String mimeType) {

    String volumeName = MediaProvider.EXTERNAL_VOLUME;

    openDatabase(volumeName);

    MediaScanner scanner = createMediaScanner();

    return scanner.scanSingleFile(path, volumeName, mimeType);

}

MediaScannerService中的scan方法

private void scan(String[] directories, String volumeName) {

    // don't sleep while scanning

    mWakeLock.acquire();

    ContentValues values = new ContentValues();

    values.put(MediaStore.MEDIA_SCANNER_VOLUME, volumeName);

    Uri scanUri = getContentResolver().insert(MediaStore.getMediaScannerUri(), values);

    Uri uri = Uri.parse("file://" + directories[0]);

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_STARTED, uri));

    try {

        if (volumeName.equals(MediaProvider.EXTERNAL_VOLUME)) {

            openDatabase(volumeName);

        }

        MediaScanner scanner = createMediaScanner();

        scanner.scanDirectories(directories, volumeName);

    } catch (Exception e) {

        Log.e(TAG, "exception in MediaScanner.scan()", e);

    }

    getContentResolver().delete(scanUri, null, null);

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_FINISHED, uri));

    mWakeLock.release();

}

以上是 Android中扫描多媒体文件操作详解 的全部内容, 来源链接: utcz.com/z/330468.html

回到顶部