Loading media/java/android/media/MediaScanner.java +24 −15 Original line number Diff line number Diff line Loading @@ -488,6 +488,7 @@ public class MediaScanner implements AutoCloseable { private int mCompilation; private boolean mIsDrm; private boolean mNoMedia; // flag to suppress file from appearing in media tables private boolean mScanSuccess; private int mWidth; private int mHeight; Loading @@ -502,6 +503,7 @@ public class MediaScanner implements AutoCloseable { mFileType = 0; mFileSize = fileSize; mIsDrm = false; mScanSuccess = true; if (!isDirectory) { if (!noMedia && isNoMediaFile(path)) { Loading Loading @@ -623,14 +625,6 @@ public class MediaScanner implements AutoCloseable { if (noMedia) { result = endFile(entry, false, false, false, false, false); } else { String lowpath = path.toLowerCase(Locale.ROOT); boolean ringtones = (lowpath.indexOf(RINGTONES_DIR) > 0); boolean notifications = (lowpath.indexOf(NOTIFICATIONS_DIR) > 0); boolean alarms = (lowpath.indexOf(ALARMS_DIR) > 0); boolean podcasts = (lowpath.indexOf(PODCAST_DIR) > 0); boolean music = (lowpath.indexOf(MUSIC_DIR) > 0) || (!ringtones && !notifications && !alarms && !podcasts); boolean isaudio = MediaFile.isAudioFileType(mFileType); boolean isvideo = MediaFile.isVideoFileType(mFileType); boolean isimage = MediaFile.isImageFileType(mFileType); Loading @@ -642,13 +636,22 @@ public class MediaScanner implements AutoCloseable { // we only extract metadata for audio and video files if (isaudio || isvideo) { processFile(path, mimeType, this); mScanSuccess = processFile(path, mimeType, this); } if (isimage) { processImageFile(path); mScanSuccess = processImageFile(path); } String lowpath = path.toLowerCase(Locale.ROOT); boolean ringtones = mScanSuccess && (lowpath.indexOf(RINGTONES_DIR) > 0); boolean notifications = mScanSuccess && (lowpath.indexOf(NOTIFICATIONS_DIR) > 0); boolean alarms = mScanSuccess && (lowpath.indexOf(ALARMS_DIR) > 0); boolean podcasts = mScanSuccess && (lowpath.indexOf(PODCAST_DIR) > 0); boolean music = mScanSuccess && ((lowpath.indexOf(MUSIC_DIR) > 0) || (!ringtones && !notifications && !alarms && !podcasts)); result = endFile(entry, ringtones, notifications, alarms, music, podcasts); } } Loading Loading @@ -816,16 +819,18 @@ public class MediaScanner implements AutoCloseable { return genreTagValue; } private void processImageFile(String path) { private boolean processImageFile(String path) { try { mBitmapOptions.outWidth = 0; mBitmapOptions.outHeight = 0; BitmapFactory.decodeFile(path, mBitmapOptions); mWidth = mBitmapOptions.outWidth; mHeight = mBitmapOptions.outHeight; return mWidth > 0 && mHeight > 0; } catch (Throwable th) { // ignore; } return false; } public void setMimeType(String mimeType) { Loading Loading @@ -878,7 +883,7 @@ public class MediaScanner implements AutoCloseable { } } else if (MediaFile.isImageFileType(mFileType)) { // FIXME - add DESCRIPTION } else if (MediaFile.isAudioFileType(mFileType)) { } else if (mScanSuccess && MediaFile.isAudioFileType(mFileType)) { map.put(Audio.Media.ARTIST, (mArtist != null && mArtist.length() > 0) ? mArtist : MediaStore.UNKNOWN_STRING); map.put(Audio.Media.ALBUM_ARTIST, (mAlbumArtist != null && Loading @@ -894,6 +899,10 @@ public class MediaScanner implements AutoCloseable { map.put(Audio.Media.DURATION, mDuration); map.put(Audio.Media.COMPILATION, mCompilation); } if (!mScanSuccess) { // force mediaprovider to not determine the media type from the mime type map.put(Files.FileColumns.MEDIA_TYPE, 0); } } return map; } Loading Loading @@ -1001,7 +1010,7 @@ public class MediaScanner implements AutoCloseable { Uri tableUri = mFilesUri; MediaInserter inserter = mMediaInserter; if (!mNoMedia) { if (mScanSuccess && !mNoMedia) { if (MediaFile.isVideoFileType(mFileType)) { tableUri = mVideoUri; } else if (MediaFile.isImageFileType(mFileType)) { Loading Loading @@ -1071,7 +1080,7 @@ public class MediaScanner implements AutoCloseable { values.remove(MediaStore.MediaColumns.DATA); int mediaType = 0; if (!MediaScanner.isNoMediaPath(entry.mPath)) { if (mScanSuccess && !MediaScanner.isNoMediaPath(entry.mPath)) { int fileType = MediaFile.getFileTypeForMimeType(mMimeType); if (MediaFile.isAudioFileType(fileType)) { mediaType = FileColumns.MEDIA_TYPE_AUDIO; Loading Loading @@ -1890,7 +1899,7 @@ public class MediaScanner implements AutoCloseable { } private native void processDirectory(String path, MediaScannerClient client); private native void processFile(String path, String mimeType, MediaScannerClient client); private native boolean processFile(String path, String mimeType, MediaScannerClient client); private native void setLocale(String locale); public native byte[] extractAlbumArt(FileDescriptor fd); Loading media/jni/android_media_MediaScanner.cpp +7 −6 Original line number Diff line number Diff line Loading @@ -264,7 +264,7 @@ android_media_MediaScanner_processDirectory( env->ReleaseStringUTFChars(path, pathStr); } static void static jboolean android_media_MediaScanner_processFile( JNIEnv *env, jobject thiz, jstring path, jstring mimeType, jobject client) Loading @@ -275,17 +275,17 @@ android_media_MediaScanner_processFile( MediaScanner *mp = getNativeScanner_l(env, thiz); if (mp == NULL) { jniThrowException(env, kRunTimeException, "No scanner available"); return; return false; } if (path == NULL) { jniThrowException(env, kIllegalArgumentException, NULL); return; return false; } const char *pathStr = env->GetStringUTFChars(path, NULL); if (pathStr == NULL) { // Out of memory return; return false; } const char *mimeTypeStr = Loading @@ -293,7 +293,7 @@ android_media_MediaScanner_processFile( if (mimeType && mimeTypeStr == NULL) { // Out of memory // ReleaseStringUTFChars can be called with an exception pending. env->ReleaseStringUTFChars(path, pathStr); return; return false; } MyMediaScannerClient myClient(env, client); Loading @@ -305,6 +305,7 @@ android_media_MediaScanner_processFile( if (mimeType) { env->ReleaseStringUTFChars(mimeType, mimeTypeStr); } return result != MEDIA_SCAN_RESULT_ERROR; } static void Loading Loading @@ -421,7 +422,7 @@ static const JNINativeMethod gMethods[] = { { "processFile", "(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)V", "(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)Z", (void *)android_media_MediaScanner_processFile }, Loading Loading
media/java/android/media/MediaScanner.java +24 −15 Original line number Diff line number Diff line Loading @@ -488,6 +488,7 @@ public class MediaScanner implements AutoCloseable { private int mCompilation; private boolean mIsDrm; private boolean mNoMedia; // flag to suppress file from appearing in media tables private boolean mScanSuccess; private int mWidth; private int mHeight; Loading @@ -502,6 +503,7 @@ public class MediaScanner implements AutoCloseable { mFileType = 0; mFileSize = fileSize; mIsDrm = false; mScanSuccess = true; if (!isDirectory) { if (!noMedia && isNoMediaFile(path)) { Loading Loading @@ -623,14 +625,6 @@ public class MediaScanner implements AutoCloseable { if (noMedia) { result = endFile(entry, false, false, false, false, false); } else { String lowpath = path.toLowerCase(Locale.ROOT); boolean ringtones = (lowpath.indexOf(RINGTONES_DIR) > 0); boolean notifications = (lowpath.indexOf(NOTIFICATIONS_DIR) > 0); boolean alarms = (lowpath.indexOf(ALARMS_DIR) > 0); boolean podcasts = (lowpath.indexOf(PODCAST_DIR) > 0); boolean music = (lowpath.indexOf(MUSIC_DIR) > 0) || (!ringtones && !notifications && !alarms && !podcasts); boolean isaudio = MediaFile.isAudioFileType(mFileType); boolean isvideo = MediaFile.isVideoFileType(mFileType); boolean isimage = MediaFile.isImageFileType(mFileType); Loading @@ -642,13 +636,22 @@ public class MediaScanner implements AutoCloseable { // we only extract metadata for audio and video files if (isaudio || isvideo) { processFile(path, mimeType, this); mScanSuccess = processFile(path, mimeType, this); } if (isimage) { processImageFile(path); mScanSuccess = processImageFile(path); } String lowpath = path.toLowerCase(Locale.ROOT); boolean ringtones = mScanSuccess && (lowpath.indexOf(RINGTONES_DIR) > 0); boolean notifications = mScanSuccess && (lowpath.indexOf(NOTIFICATIONS_DIR) > 0); boolean alarms = mScanSuccess && (lowpath.indexOf(ALARMS_DIR) > 0); boolean podcasts = mScanSuccess && (lowpath.indexOf(PODCAST_DIR) > 0); boolean music = mScanSuccess && ((lowpath.indexOf(MUSIC_DIR) > 0) || (!ringtones && !notifications && !alarms && !podcasts)); result = endFile(entry, ringtones, notifications, alarms, music, podcasts); } } Loading Loading @@ -816,16 +819,18 @@ public class MediaScanner implements AutoCloseable { return genreTagValue; } private void processImageFile(String path) { private boolean processImageFile(String path) { try { mBitmapOptions.outWidth = 0; mBitmapOptions.outHeight = 0; BitmapFactory.decodeFile(path, mBitmapOptions); mWidth = mBitmapOptions.outWidth; mHeight = mBitmapOptions.outHeight; return mWidth > 0 && mHeight > 0; } catch (Throwable th) { // ignore; } return false; } public void setMimeType(String mimeType) { Loading Loading @@ -878,7 +883,7 @@ public class MediaScanner implements AutoCloseable { } } else if (MediaFile.isImageFileType(mFileType)) { // FIXME - add DESCRIPTION } else if (MediaFile.isAudioFileType(mFileType)) { } else if (mScanSuccess && MediaFile.isAudioFileType(mFileType)) { map.put(Audio.Media.ARTIST, (mArtist != null && mArtist.length() > 0) ? mArtist : MediaStore.UNKNOWN_STRING); map.put(Audio.Media.ALBUM_ARTIST, (mAlbumArtist != null && Loading @@ -894,6 +899,10 @@ public class MediaScanner implements AutoCloseable { map.put(Audio.Media.DURATION, mDuration); map.put(Audio.Media.COMPILATION, mCompilation); } if (!mScanSuccess) { // force mediaprovider to not determine the media type from the mime type map.put(Files.FileColumns.MEDIA_TYPE, 0); } } return map; } Loading Loading @@ -1001,7 +1010,7 @@ public class MediaScanner implements AutoCloseable { Uri tableUri = mFilesUri; MediaInserter inserter = mMediaInserter; if (!mNoMedia) { if (mScanSuccess && !mNoMedia) { if (MediaFile.isVideoFileType(mFileType)) { tableUri = mVideoUri; } else if (MediaFile.isImageFileType(mFileType)) { Loading Loading @@ -1071,7 +1080,7 @@ public class MediaScanner implements AutoCloseable { values.remove(MediaStore.MediaColumns.DATA); int mediaType = 0; if (!MediaScanner.isNoMediaPath(entry.mPath)) { if (mScanSuccess && !MediaScanner.isNoMediaPath(entry.mPath)) { int fileType = MediaFile.getFileTypeForMimeType(mMimeType); if (MediaFile.isAudioFileType(fileType)) { mediaType = FileColumns.MEDIA_TYPE_AUDIO; Loading Loading @@ -1890,7 +1899,7 @@ public class MediaScanner implements AutoCloseable { } private native void processDirectory(String path, MediaScannerClient client); private native void processFile(String path, String mimeType, MediaScannerClient client); private native boolean processFile(String path, String mimeType, MediaScannerClient client); private native void setLocale(String locale); public native byte[] extractAlbumArt(FileDescriptor fd); Loading
media/jni/android_media_MediaScanner.cpp +7 −6 Original line number Diff line number Diff line Loading @@ -264,7 +264,7 @@ android_media_MediaScanner_processDirectory( env->ReleaseStringUTFChars(path, pathStr); } static void static jboolean android_media_MediaScanner_processFile( JNIEnv *env, jobject thiz, jstring path, jstring mimeType, jobject client) Loading @@ -275,17 +275,17 @@ android_media_MediaScanner_processFile( MediaScanner *mp = getNativeScanner_l(env, thiz); if (mp == NULL) { jniThrowException(env, kRunTimeException, "No scanner available"); return; return false; } if (path == NULL) { jniThrowException(env, kIllegalArgumentException, NULL); return; return false; } const char *pathStr = env->GetStringUTFChars(path, NULL); if (pathStr == NULL) { // Out of memory return; return false; } const char *mimeTypeStr = Loading @@ -293,7 +293,7 @@ android_media_MediaScanner_processFile( if (mimeType && mimeTypeStr == NULL) { // Out of memory // ReleaseStringUTFChars can be called with an exception pending. env->ReleaseStringUTFChars(path, pathStr); return; return false; } MyMediaScannerClient myClient(env, client); Loading @@ -305,6 +305,7 @@ android_media_MediaScanner_processFile( if (mimeType) { env->ReleaseStringUTFChars(mimeType, mimeTypeStr); } return result != MEDIA_SCAN_RESULT_ERROR; } static void Loading Loading @@ -421,7 +422,7 @@ static const JNINativeMethod gMethods[] = { { "processFile", "(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)V", "(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)Z", (void *)android_media_MediaScanner_processFile }, Loading