Guess the MIME type from the display name.
Extends MediaProvider to guess the MIME type from the file extension in
the DISPLAY_NAME if it wasn't able to get it from the DATA column.
Change-Id: Idca6836fbd91ec34383e08f9e7f9280f0e7198ee
Fix: 142468597
Test: atest MediaProviderTest
Test: atest ContentResolverTest
diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java
index f37f881..4ae9599 100644
--- a/src/com/android/providers/media/MediaProvider.java
+++ b/src/com/android/providers/media/MediaProvider.java
@@ -1916,6 +1916,15 @@
values.put(MediaColumns.MIME_TYPE, MimeUtils.resolveMimeType(new File(data)));
}
}
+ // Extract the MIME type from the display name if we couldn't resolve it from the raw path
+ if (!TextUtils.isEmpty(values.getAsString(MediaColumns.DISPLAY_NAME))) {
+ final String displayName = values.getAsString(MediaColumns.DISPLAY_NAME);
+
+ if (TextUtils.isEmpty(values.getAsString(MediaColumns.MIME_TYPE))) {
+ values.put(
+ MediaColumns.MIME_TYPE, MimeUtils.resolveMimeType(new File(displayName)));
+ }
+ }
// Give ourselves sane defaults when missing
if (TextUtils.isEmpty(values.getAsString(MediaColumns.DISPLAY_NAME))) {
diff --git a/tests/src/com/android/providers/media/MediaProviderTest.java b/tests/src/com/android/providers/media/MediaProviderTest.java
index 7473603..d5e6595 100644
--- a/tests/src/com/android/providers/media/MediaProviderTest.java
+++ b/tests/src/com/android/providers/media/MediaProviderTest.java
@@ -562,6 +562,17 @@
}
@Test
+ public void testEnsureFileColumns_resolvesMimeType() throws Exception {
+ final Uri uri = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
+ final ContentValues values = new ContentValues();
+ values.put(MediaColumns.DISPLAY_NAME, "pngimage.png");
+
+ new MediaProvider().ensureFileColumns(uri, values);
+
+ assertMimetype(values, "image/png");
+ }
+
+ @Test
public void testRelativePathForInvalidDirectories() throws Exception {
for (String data : new String[] {
"/storage/IMG1024.JPG",
@@ -615,6 +626,10 @@
assertEquals(relativePath, values.get(ImageColumns.RELATIVE_PATH));
}
+ private static void assertMimetype(ContentValues values, String type) {
+ assertEquals(type, values.get(MediaColumns.MIME_TYPE));
+ }
+
private static boolean isGreylistMatch(String raw) {
for (Pattern p : MediaProvider.sGreylist) {
if (p.matcher(raw).matches()) {