MediaFile.java revision 30c918ce7fbe171944b28fc91b3f22b3d631872d
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.media; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.MediaStore.Audio; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.MediaStore.Images; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.MediaStore.Video; 2368db99ef761456ffaa0c4b918ce75dfc0892784aJames Dongimport android.media.DecoderCapabilities; 2468db99ef761456ffaa0c4b918ce75dfc0892784aJames Dongimport android.media.DecoderCapabilities.VideoDecoder; 2568db99ef761456ffaa0c4b918ce75dfc0892784aJames Dongimport android.media.DecoderCapabilities.AudioDecoder; 260cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodimport android.mtp.MtpConstants; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 3068db99ef761456ffaa0c4b918ce75dfc0892784aJames Dongimport java.util.List; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * MediaScanner helper class. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class MediaFile { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Audio file types 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_MP3 = 1; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_M4A = 2; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_WAV = 3; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_AMR = 4; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_AWB = 5; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_WMA = 6; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_OGG = 7; 47974ff946d114610ec41172fb6076d9d8810c3680Ravi K Yenduri public static final int FILE_TYPE_AAC = 8; 48072f5247ef893e683728263a540bb93daafda376Andreas Huber public static final int FILE_TYPE_MKA = 9; 49f9f223edb408cdc9fd946dc099a86857079a639fGlenn Kasten public static final int FILE_TYPE_FLAC = 10; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FIRST_AUDIO_FILE_TYPE = FILE_TYPE_MP3; 51f9f223edb408cdc9fd946dc099a86857079a639fGlenn Kasten private static final int LAST_AUDIO_FILE_TYPE = FILE_TYPE_FLAC; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // MIDI file types 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_MID = 11; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_SMF = 12; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_IMY = 13; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FIRST_MIDI_FILE_TYPE = FILE_TYPE_MID; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int LAST_MIDI_FILE_TYPE = FILE_TYPE_IMY; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Video file types 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_MP4 = 21; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_M4V = 22; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_3GPP = 23; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_3GPP2 = 24; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_WMV = 25; 66974ff946d114610ec41172fb6076d9d8810c3680Ravi K Yenduri public static final int FILE_TYPE_ASF = 26; 67072f5247ef893e683728263a540bb93daafda376Andreas Huber public static final int FILE_TYPE_MKV = 27; 68a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber public static final int FILE_TYPE_MP2TS = 28; 69cabb7da7125a80c55233bd23959327424e9646ccAndreas Huber public static final int FILE_TYPE_AVI = 29; 70ff535914825f63999648030a02f57767593462f0Mike Lockwood public static final int FILE_TYPE_WEBM = 30; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FIRST_VIDEO_FILE_TYPE = FILE_TYPE_MP4; 72ff535914825f63999648030a02f57767593462f0Mike Lockwood private static final int LAST_VIDEO_FILE_TYPE = FILE_TYPE_WEBM; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74bc554956128d69d8d2e60365fb6cffe6facf659bAndreas Huber // More video file types 75bc554956128d69d8d2e60365fb6cffe6facf659bAndreas Huber public static final int FILE_TYPE_MP2PS = 200; 76bc554956128d69d8d2e60365fb6cffe6facf659bAndreas Huber private static final int FIRST_VIDEO_FILE_TYPE2 = FILE_TYPE_MP2PS; 77bc554956128d69d8d2e60365fb6cffe6facf659bAndreas Huber private static final int LAST_VIDEO_FILE_TYPE2 = FILE_TYPE_MP2PS; 78bc554956128d69d8d2e60365fb6cffe6facf659bAndreas Huber 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Image file types 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_JPEG = 31; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_GIF = 32; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_PNG = 33; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_BMP = 34; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILE_TYPE_WBMP = 35; 85d0881d95e2d4eceab37288f88f43f771e08eab65Vikas Arora public static final int FILE_TYPE_WEBP = 36; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FIRST_IMAGE_FILE_TYPE = FILE_TYPE_JPEG; 87d0881d95e2d4eceab37288f88f43f771e08eab65Vikas Arora private static final int LAST_IMAGE_FILE_TYPE = FILE_TYPE_WEBP; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Playlist file types 905dffd0e3af502acdc2e45425139ef8081fa4f0a8Andreas Huber public static final int FILE_TYPE_M3U = 41; 915dffd0e3af502acdc2e45425139ef8081fa4f0a8Andreas Huber public static final int FILE_TYPE_PLS = 42; 925dffd0e3af502acdc2e45425139ef8081fa4f0a8Andreas Huber public static final int FILE_TYPE_WPL = 43; 935dffd0e3af502acdc2e45425139ef8081fa4f0a8Andreas Huber public static final int FILE_TYPE_HTTPLIVE = 44; 945dffd0e3af502acdc2e45425139ef8081fa4f0a8Andreas Huber 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FIRST_PLAYLIST_FILE_TYPE = FILE_TYPE_M3U; 965dffd0e3af502acdc2e45425139ef8081fa4f0a8Andreas Huber private static final int LAST_PLAYLIST_FILE_TYPE = FILE_TYPE_HTTPLIVE; 97fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood 985d143ad4a8f8c90f44e185a494ff3ff638e6c103Gloria Wang // Drm file types 995d143ad4a8f8c90f44e185a494ff3ff638e6c103Gloria Wang public static final int FILE_TYPE_FL = 51; 1005d143ad4a8f8c90f44e185a494ff3ff638e6c103Gloria Wang private static final int FIRST_DRM_FILE_TYPE = FILE_TYPE_FL; 1015d143ad4a8f8c90f44e185a494ff3ff638e6c103Gloria Wang private static final int LAST_DRM_FILE_TYPE = FILE_TYPE_FL; 1025d143ad4a8f8c90f44e185a494ff3ff638e6c103Gloria Wang 103fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood // Other popular file types 104fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood public static final int FILE_TYPE_TEXT = 100; 105fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood public static final int FILE_TYPE_HTML = 101; 106fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood public static final int FILE_TYPE_PDF = 102; 107fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood public static final int FILE_TYPE_XML = 103; 108fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood public static final int FILE_TYPE_MS_WORD = 104; 109fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood public static final int FILE_TYPE_MS_EXCEL = 105; 110fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood public static final int FILE_TYPE_MS_POWERPOINT = 106; 111f9f223edb408cdc9fd946dc099a86857079a639fGlenn Kasten public static final int FILE_TYPE_ZIP = 107; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 113bd682b040833fce9e212c00c395b32bec7050f87Mike Lockwood public static class MediaFileType { 114bd682b040833fce9e212c00c395b32bec7050f87Mike Lockwood public final int fileType; 115bd682b040833fce9e212c00c395b32bec7050f87Mike Lockwood public final String mimeType; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaFileType(int fileType, String mimeType) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.fileType = fileType; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mimeType = mimeType; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12330c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private static final HashMap<String, MediaFileType> sFileTypeMap 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new HashMap<String, MediaFileType>(); 12530c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private static final HashMap<String, Integer> sMimeTypeMap 126d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood = new HashMap<String, Integer>(); 127d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood // maps file extension to MTP format code 12830c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private static final HashMap<String, Integer> sFileTypeToFormatMap 129d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood = new HashMap<String, Integer>(); 130d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood // maps mime type to MTP format code 13130c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private static final HashMap<String, Integer> sMimeTypeToFormatMap 132d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood = new HashMap<String, Integer>(); 133d815f79766984fce499e147ecbacc01914683f74Mike Lockwood // maps MTP format code to mime type 13430c918ce7fbe171944b28fc91b3f22b3d631872dGlenn Kasten private static final HashMap<Integer, String> sFormatToMimeTypeMap 135d815f79766984fce499e147ecbacc01914683f74Mike Lockwood = new HashMap<Integer, String>(); 136d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static void addFileType(String extension, int fileType, String mimeType) { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sFileTypeMap.put(extension, new MediaFileType(fileType, mimeType)); 139d282ac8610f72d964105efefe41120a5340f1ce0Marco Nelissen sMimeTypeMap.put(mimeType, Integer.valueOf(fileType)); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14168db99ef761456ffaa0c4b918ce75dfc0892784aJames Dong 142d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood static void addFileType(String extension, int fileType, String mimeType, int mtpFormatCode) { 143d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood addFileType(extension, fileType, mimeType); 144d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood sFileTypeToFormatMap.put(extension, Integer.valueOf(mtpFormatCode)); 145d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood sMimeTypeToFormatMap.put(mimeType, Integer.valueOf(mtpFormatCode)); 146d815f79766984fce499e147ecbacc01914683f74Mike Lockwood sFormatToMimeTypeMap.put(mtpFormatCode, mimeType); 147d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 148d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 14968db99ef761456ffaa0c4b918ce75dfc0892784aJames Dong private static boolean isWMAEnabled() { 15068db99ef761456ffaa0c4b918ce75dfc0892784aJames Dong List<AudioDecoder> decoders = DecoderCapabilities.getAudioDecoders(); 15116dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood int count = decoders.size(); 15216dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood for (int i = 0; i < count; i++) { 15316dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood AudioDecoder decoder = decoders.get(i); 15468db99ef761456ffaa0c4b918ce75dfc0892784aJames Dong if (decoder == AudioDecoder.AUDIO_DECODER_WMA) { 15568db99ef761456ffaa0c4b918ce75dfc0892784aJames Dong return true; 15668db99ef761456ffaa0c4b918ce75dfc0892784aJames Dong } 15768db99ef761456ffaa0c4b918ce75dfc0892784aJames Dong } 15868db99ef761456ffaa0c4b918ce75dfc0892784aJames Dong return false; 15968db99ef761456ffaa0c4b918ce75dfc0892784aJames Dong } 16068db99ef761456ffaa0c4b918ce75dfc0892784aJames Dong 16116dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood private static boolean isWMVEnabled() { 16216dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood List<VideoDecoder> decoders = DecoderCapabilities.getVideoDecoders(); 16316dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood int count = decoders.size(); 16416dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood for (int i = 0; i < count; i++) { 16516dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood VideoDecoder decoder = decoders.get(i); 16616dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood if (decoder == VideoDecoder.VIDEO_DECODER_WMV) { 16716dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood return true; 16816dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood } 16916dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood } 17016dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood return false; 17116dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood } 17216dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static { 1745367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("MP3", FILE_TYPE_MP3, "audio/mpeg", MtpConstants.FORMAT_MP3); 1755367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("M4A", FILE_TYPE_M4A, "audio/mp4", MtpConstants.FORMAT_MPEG); 1765367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("WAV", FILE_TYPE_WAV, "audio/x-wav", MtpConstants.FORMAT_WAV); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addFileType("AMR", FILE_TYPE_AMR, "audio/amr"); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addFileType("AWB", FILE_TYPE_AWB, "audio/amr-wb"); 17968db99ef761456ffaa0c4b918ce75dfc0892784aJames Dong if (isWMAEnabled()) { 1805367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("WMA", FILE_TYPE_WMA, "audio/x-ms-wma", MtpConstants.FORMAT_WMA); 1810ddbc35dc4974fbe18a4191e579b1eda5a7ef2b1Marco Nelissen } 1825367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("OGG", FILE_TYPE_OGG, "application/ogg", MtpConstants.FORMAT_OGG); 1835367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("OGA", FILE_TYPE_OGG, "application/ogg", MtpConstants.FORMAT_OGG); 1845367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("AAC", FILE_TYPE_AAC, "audio/aac", MtpConstants.FORMAT_AAC); 185f9cf277cda5d7cdf8383331892cca0734a850e19Gloria Wang addFileType("AAC", FILE_TYPE_AAC, "audio/aac-adts", MtpConstants.FORMAT_AAC); 186072f5247ef893e683728263a540bb93daafda376Andreas Huber addFileType("MKA", FILE_TYPE_MKA, "audio/x-matroska"); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addFileType("MID", FILE_TYPE_MID, "audio/midi"); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addFileType("MIDI", FILE_TYPE_MID, "audio/midi"); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addFileType("XMF", FILE_TYPE_MID, "audio/midi"); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addFileType("RTTTL", FILE_TYPE_MID, "audio/midi"); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addFileType("SMF", FILE_TYPE_SMF, "audio/sp-midi"); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addFileType("IMY", FILE_TYPE_IMY, "audio/imelody"); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addFileType("RTX", FILE_TYPE_MID, "audio/midi"); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addFileType("OTA", FILE_TYPE_MID, "audio/midi"); 196eecadb9a84f357fb224592cc77603ff3e7c28f08Andreas Huber addFileType("MXMF", FILE_TYPE_MID, "audio/midi"); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1985367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("MPEG", FILE_TYPE_MP4, "video/mpeg", MtpConstants.FORMAT_MPEG); 19928d1a4aaf3c338f42d7b71d4653be707f06948a6Mike Lockwood addFileType("MPG", FILE_TYPE_MP4, "video/mpeg", MtpConstants.FORMAT_MPEG); 2005367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("MP4", FILE_TYPE_MP4, "video/mp4", MtpConstants.FORMAT_MPEG); 2015367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("M4V", FILE_TYPE_M4V, "video/mp4", MtpConstants.FORMAT_MPEG); 2025367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("3GP", FILE_TYPE_3GPP, "video/3gpp", MtpConstants.FORMAT_3GP_CONTAINER); 2035367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("3GPP", FILE_TYPE_3GPP, "video/3gpp", MtpConstants.FORMAT_3GP_CONTAINER); 2045367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("3G2", FILE_TYPE_3GPP2, "video/3gpp2", MtpConstants.FORMAT_3GP_CONTAINER); 2055367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("3GPP2", FILE_TYPE_3GPP2, "video/3gpp2", MtpConstants.FORMAT_3GP_CONTAINER); 206072f5247ef893e683728263a540bb93daafda376Andreas Huber addFileType("MKV", FILE_TYPE_MKV, "video/x-matroska"); 207ff535914825f63999648030a02f57767593462f0Mike Lockwood addFileType("WEBM", FILE_TYPE_WEBM, "video/webm"); 208a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber addFileType("TS", FILE_TYPE_MP2TS, "video/mp2ts"); 209cabb7da7125a80c55233bd23959327424e9646ccAndreas Huber addFileType("AVI", FILE_TYPE_AVI, "video/avi"); 210a557b24ac4dd568d86b08753f7c0361d04f80d46Andreas Huber 21116dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood if (isWMVEnabled()) { 21216dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood addFileType("WMV", FILE_TYPE_WMV, "video/x-ms-wmv", MtpConstants.FORMAT_WMV); 21316dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood addFileType("ASF", FILE_TYPE_ASF, "video/x-ms-asf"); 21416dc3073a2f06a77d9873e536f633a4adf575fceMike Lockwood } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2165367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("JPG", FILE_TYPE_JPEG, "image/jpeg", MtpConstants.FORMAT_EXIF_JPEG); 2175367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("JPEG", FILE_TYPE_JPEG, "image/jpeg", MtpConstants.FORMAT_EXIF_JPEG); 2185367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("GIF", FILE_TYPE_GIF, "image/gif", MtpConstants.FORMAT_GIF); 2195367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("PNG", FILE_TYPE_PNG, "image/png", MtpConstants.FORMAT_PNG); 2205367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("BMP", FILE_TYPE_BMP, "image/x-ms-bmp", MtpConstants.FORMAT_BMP); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addFileType("WBMP", FILE_TYPE_WBMP, "image/vnd.wap.wbmp"); 2227f61f5919d193d8ae158ce8a52ca69c9f2be8777Vikas Arora addFileType("WEBP", FILE_TYPE_WEBP, "image/webp"); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2245367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("M3U", FILE_TYPE_M3U, "audio/x-mpegurl", MtpConstants.FORMAT_M3U_PLAYLIST); 225b5c6afc208bd70eba386dbb2c0fb29b34e44e4d4Andreas Huber addFileType("M3U", FILE_TYPE_M3U, "application/x-mpegurl", MtpConstants.FORMAT_M3U_PLAYLIST); 2265367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("PLS", FILE_TYPE_PLS, "audio/x-scpls", MtpConstants.FORMAT_PLS_PLAYLIST); 2275367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood addFileType("WPL", FILE_TYPE_WPL, "application/vnd.ms-wpl", MtpConstants.FORMAT_WPL_PLAYLIST); 2285dffd0e3af502acdc2e45425139ef8081fa4f0a8Andreas Huber addFileType("M3U8", FILE_TYPE_HTTPLIVE, "application/vnd.apple.mpegurl"); 2295dffd0e3af502acdc2e45425139ef8081fa4f0a8Andreas Huber addFileType("M3U8", FILE_TYPE_HTTPLIVE, "audio/mpegurl"); 2305dffd0e3af502acdc2e45425139ef8081fa4f0a8Andreas Huber addFileType("M3U8", FILE_TYPE_HTTPLIVE, "audio/x-mpegurl"); 231fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood 2325d143ad4a8f8c90f44e185a494ff3ff638e6c103Gloria Wang addFileType("FL", FILE_TYPE_FL, "application/x-android-drm-fl"); 2335d143ad4a8f8c90f44e185a494ff3ff638e6c103Gloria Wang 234fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood addFileType("TXT", FILE_TYPE_TEXT, "text/plain", MtpConstants.FORMAT_TEXT); 235fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood addFileType("HTM", FILE_TYPE_HTML, "text/html", MtpConstants.FORMAT_HTML); 236fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood addFileType("HTML", FILE_TYPE_HTML, "text/html", MtpConstants.FORMAT_HTML); 237fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood addFileType("PDF", FILE_TYPE_PDF, "application/pdf"); 238fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood addFileType("DOC", FILE_TYPE_MS_WORD, "application/msword", MtpConstants.FORMAT_MS_WORD_DOCUMENT); 239fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood addFileType("XLS", FILE_TYPE_MS_EXCEL, "application/vnd.ms-excel", MtpConstants.FORMAT_MS_EXCEL_SPREADSHEET); 240fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood addFileType("PPT", FILE_TYPE_MS_POWERPOINT, "application/mspowerpoint", MtpConstants.FORMAT_MS_POWERPOINT_PRESENTATION); 241fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood addFileType("FLAC", FILE_TYPE_FLAC, "audio/flac", MtpConstants.FORMAT_FLAC); 242fde2ca180ea63ebd314770ec55b97e0a3c5a0788Mike Lockwood addFileType("ZIP", FILE_TYPE_ZIP, "application/zip"); 243bc554956128d69d8d2e60365fb6cffe6facf659bAndreas Huber addFileType("MPG", FILE_TYPE_MP2PS, "video/mp2p"); 244bc554956128d69d8d2e60365fb6cffe6facf659bAndreas Huber addFileType("MPEG", FILE_TYPE_MP2PS, "video/mp2p"); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 246c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean isAudioFileType(int fileType) { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((fileType >= FIRST_AUDIO_FILE_TYPE && 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fileType <= LAST_AUDIO_FILE_TYPE) || 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (fileType >= FIRST_MIDI_FILE_TYPE && 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fileType <= LAST_MIDI_FILE_TYPE)); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 253c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean isVideoFileType(int fileType) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (fileType >= FIRST_VIDEO_FILE_TYPE && 256bc554956128d69d8d2e60365fb6cffe6facf659bAndreas Huber fileType <= LAST_VIDEO_FILE_TYPE) 257bc554956128d69d8d2e60365fb6cffe6facf659bAndreas Huber || (fileType >= FIRST_VIDEO_FILE_TYPE2 && 258bc554956128d69d8d2e60365fb6cffe6facf659bAndreas Huber fileType <= LAST_VIDEO_FILE_TYPE2); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 260c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean isImageFileType(int fileType) { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (fileType >= FIRST_IMAGE_FILE_TYPE && 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fileType <= LAST_IMAGE_FILE_TYPE); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 265c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean isPlayListFileType(int fileType) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (fileType >= FIRST_PLAYLIST_FILE_TYPE && 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fileType <= LAST_PLAYLIST_FILE_TYPE); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 270c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood 2715d143ad4a8f8c90f44e185a494ff3ff638e6c103Gloria Wang public static boolean isDrmFileType(int fileType) { 2725d143ad4a8f8c90f44e185a494ff3ff638e6c103Gloria Wang return (fileType >= FIRST_DRM_FILE_TYPE && 2735d143ad4a8f8c90f44e185a494ff3ff638e6c103Gloria Wang fileType <= LAST_DRM_FILE_TYPE); 2745d143ad4a8f8c90f44e185a494ff3ff638e6c103Gloria Wang } 2755d143ad4a8f8c90f44e185a494ff3ff638e6c103Gloria Wang 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static MediaFileType getFileType(String path) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int lastDot = path.lastIndexOf("."); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lastDot < 0) 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sFileTypeMap.get(path.substring(lastDot + 1).toUpperCase()); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 282c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood 28345b43622e329c25c6070a3f2f2fc2ba5a14533bbVasu Nori public static boolean isMimeTypeMedia(String mimeType) { 28445b43622e329c25c6070a3f2f2fc2ba5a14533bbVasu Nori int fileType = getFileTypeForMimeType(mimeType); 28545b43622e329c25c6070a3f2f2fc2ba5a14533bbVasu Nori return isAudioFileType(fileType) || isVideoFileType(fileType) 28645b43622e329c25c6070a3f2f2fc2ba5a14533bbVasu Nori || isImageFileType(fileType) || isPlayListFileType(fileType); 28745b43622e329c25c6070a3f2f2fc2ba5a14533bbVasu Nori } 28845b43622e329c25c6070a3f2f2fc2ba5a14533bbVasu Nori 289c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood // generates a title based on file name 290c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood public static String getFileTitle(String path) { 291c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood // extract file name after last slash 292c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood int lastSlash = path.lastIndexOf('/'); 293c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood if (lastSlash >= 0) { 294c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood lastSlash++; 295c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood if (lastSlash < path.length()) { 296c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood path = path.substring(lastSlash); 297c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood } 298c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood } 299c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood // truncate the file extension (if any) 300c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood int lastDot = path.lastIndexOf('.'); 301c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood if (lastDot > 0) { 302c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood path = path.substring(0, lastDot); 303c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood } 304c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood return path; 305c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood } 306c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int getFileTypeForMimeType(String mimeType) { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Integer value = sMimeTypeMap.get(mimeType); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (value == null ? 0 : value.intValue()); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 312c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood public static String getMimeTypeForFile(String path) { 313c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood MediaFileType mediaFileType = getFileType(path); 314c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood return (mediaFileType == null ? null : mediaFileType.mimeType); 315c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood } 316c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood 317d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood public static int getFormatCode(String fileName, String mimeType) { 318d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (mimeType != null) { 319d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Integer value = sMimeTypeToFormatMap.get(mimeType); 320d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (value != null) { 321d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return value.intValue(); 322d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 323d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 324d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int lastDot = fileName.lastIndexOf('.'); 325d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (lastDot > 0) { 326d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood String extension = fileName.substring(lastDot + 1); 327d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood Integer value = sFileTypeToFormatMap.get(extension); 328d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (value != null) { 329d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return value.intValue(); 330d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 331d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 3325367ab6aab2a61aaf534b18576dcdd0bca1b9681Mike Lockwood return MtpConstants.FORMAT_UNDEFINED; 333d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 334d815f79766984fce499e147ecbacc01914683f74Mike Lockwood 335d815f79766984fce499e147ecbacc01914683f74Mike Lockwood public static String getMimeTypeForFormatCode(int formatCode) { 336d815f79766984fce499e147ecbacc01914683f74Mike Lockwood return sFormatToMimeTypeMap.get(formatCode); 337d815f79766984fce499e147ecbacc01914683f74Mike Lockwood } 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 339