MediaFile.java revision 5367ab6aab2a61aaf534b18576dcdd0bca1b9681
1/* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.media; 18 19import android.content.ContentValues; 20import android.provider.MediaStore.Audio; 21import android.provider.MediaStore.Images; 22import android.provider.MediaStore.Video; 23import android.media.DecoderCapabilities; 24import android.media.DecoderCapabilities.VideoDecoder; 25import android.media.DecoderCapabilities.AudioDecoder; 26 27import java.util.HashMap; 28import java.util.Iterator; 29import java.util.List; 30 31/** 32 * MediaScanner helper class. 33 * 34 * {@hide} 35 */ 36public class MediaFile { 37 // comma separated list of all file extensions supported by the media scanner 38 public final static String sFileExtensions; 39 40 // Audio file types 41 public static final int FILE_TYPE_MP3 = 1; 42 public static final int FILE_TYPE_M4A = 2; 43 public static final int FILE_TYPE_WAV = 3; 44 public static final int FILE_TYPE_AMR = 4; 45 public static final int FILE_TYPE_AWB = 5; 46 public static final int FILE_TYPE_WMA = 6; 47 public static final int FILE_TYPE_OGG = 7; 48 public static final int FILE_TYPE_AAC = 8; 49 public static final int FILE_TYPE_MKA = 9; 50 private static final int FIRST_AUDIO_FILE_TYPE = FILE_TYPE_MP3; 51 private static final int LAST_AUDIO_FILE_TYPE = FILE_TYPE_MKA; 52 53 // MIDI file types 54 public static final int FILE_TYPE_MID = 11; 55 public static final int FILE_TYPE_SMF = 12; 56 public static final int FILE_TYPE_IMY = 13; 57 private static final int FIRST_MIDI_FILE_TYPE = FILE_TYPE_MID; 58 private static final int LAST_MIDI_FILE_TYPE = FILE_TYPE_IMY; 59 60 // Video file types 61 public static final int FILE_TYPE_MP4 = 21; 62 public static final int FILE_TYPE_M4V = 22; 63 public static final int FILE_TYPE_3GPP = 23; 64 public static final int FILE_TYPE_3GPP2 = 24; 65 public static final int FILE_TYPE_WMV = 25; 66 public static final int FILE_TYPE_ASF = 26; 67 public static final int FILE_TYPE_MKV = 27; 68 public static final int FILE_TYPE_MP2TS = 28; 69 private static final int FIRST_VIDEO_FILE_TYPE = FILE_TYPE_MP4; 70 private static final int LAST_VIDEO_FILE_TYPE = FILE_TYPE_MP2TS; 71 72 // Image file types 73 public static final int FILE_TYPE_JPEG = 31; 74 public static final int FILE_TYPE_GIF = 32; 75 public static final int FILE_TYPE_PNG = 33; 76 public static final int FILE_TYPE_BMP = 34; 77 public static final int FILE_TYPE_WBMP = 35; 78 private static final int FIRST_IMAGE_FILE_TYPE = FILE_TYPE_JPEG; 79 private static final int LAST_IMAGE_FILE_TYPE = FILE_TYPE_WBMP; 80 81 // Playlist file types 82 public static final int FILE_TYPE_M3U = 41; 83 public static final int FILE_TYPE_PLS = 42; 84 public static final int FILE_TYPE_WPL = 43; 85 private static final int FIRST_PLAYLIST_FILE_TYPE = FILE_TYPE_M3U; 86 private static final int LAST_PLAYLIST_FILE_TYPE = FILE_TYPE_WPL; 87 88 static class MediaFileType { 89 90 int fileType; 91 String mimeType; 92 93 MediaFileType(int fileType, String mimeType) { 94 this.fileType = fileType; 95 this.mimeType = mimeType; 96 } 97 } 98 99 private static HashMap<String, MediaFileType> sFileTypeMap 100 = new HashMap<String, MediaFileType>(); 101 private static HashMap<String, Integer> sMimeTypeMap 102 = new HashMap<String, Integer>(); 103 // maps file extension to MTP format code 104 private static HashMap<String, Integer> sFileTypeToFormatMap 105 = new HashMap<String, Integer>(); 106 // maps mime type to MTP format code 107 private static HashMap<String, Integer> sMimeTypeToFormatMap 108 = new HashMap<String, Integer>(); 109 // maps MTP format code to mime type 110 private static HashMap<Integer, String> sFormatToMimeTypeMap 111 = new HashMap<Integer, String>(); 112 113 static void addFileType(String extension, int fileType, String mimeType) { 114 sFileTypeMap.put(extension, new MediaFileType(fileType, mimeType)); 115 sMimeTypeMap.put(mimeType, Integer.valueOf(fileType)); 116 } 117 118 static void addFileType(String extension, int fileType, String mimeType, int mtpFormatCode) { 119 addFileType(extension, fileType, mimeType); 120 sFileTypeToFormatMap.put(extension, Integer.valueOf(mtpFormatCode)); 121 sMimeTypeToFormatMap.put(mimeType, Integer.valueOf(mtpFormatCode)); 122 sFormatToMimeTypeMap.put(mtpFormatCode, mimeType); 123 } 124 125 private static boolean isWMAEnabled() { 126 List<AudioDecoder> decoders = DecoderCapabilities.getAudioDecoders(); 127 for (AudioDecoder decoder: decoders) { 128 if (decoder == AudioDecoder.AUDIO_DECODER_WMA) { 129 return true; 130 } 131 } 132 return false; 133 } 134 135 private static boolean isWMVEnabled() { 136 List<VideoDecoder> decoders = DecoderCapabilities.getVideoDecoders(); 137 for (VideoDecoder decoder: decoders) { 138 if (decoder == VideoDecoder.VIDEO_DECODER_WMV) { 139 return true; 140 } 141 } 142 return false; 143 } 144 145 static { 146 addFileType("MP3", FILE_TYPE_MP3, "audio/mpeg", MtpConstants.FORMAT_MP3); 147 addFileType("M4A", FILE_TYPE_M4A, "audio/mp4", MtpConstants.FORMAT_MPEG); 148 addFileType("WAV", FILE_TYPE_WAV, "audio/x-wav", MtpConstants.FORMAT_WAV); 149 addFileType("AMR", FILE_TYPE_AMR, "audio/amr"); 150 addFileType("AWB", FILE_TYPE_AWB, "audio/amr-wb"); 151 if (isWMAEnabled()) { 152 addFileType("WMA", FILE_TYPE_WMA, "audio/x-ms-wma", MtpConstants.FORMAT_WMA); 153 } 154 addFileType("OGG", FILE_TYPE_OGG, "application/ogg", MtpConstants.FORMAT_OGG); 155 addFileType("OGA", FILE_TYPE_OGG, "application/ogg", MtpConstants.FORMAT_OGG); 156 addFileType("AAC", FILE_TYPE_AAC, "audio/aac", MtpConstants.FORMAT_AAC); 157 addFileType("MKA", FILE_TYPE_MKA, "audio/x-matroska"); 158 159 addFileType("MID", FILE_TYPE_MID, "audio/midi"); 160 addFileType("MIDI", FILE_TYPE_MID, "audio/midi"); 161 addFileType("XMF", FILE_TYPE_MID, "audio/midi"); 162 addFileType("RTTTL", FILE_TYPE_MID, "audio/midi"); 163 addFileType("SMF", FILE_TYPE_SMF, "audio/sp-midi"); 164 addFileType("IMY", FILE_TYPE_IMY, "audio/imelody"); 165 addFileType("RTX", FILE_TYPE_MID, "audio/midi"); 166 addFileType("OTA", FILE_TYPE_MID, "audio/midi"); 167 168 addFileType("MPEG", FILE_TYPE_MP4, "video/mpeg", MtpConstants.FORMAT_MPEG); 169 addFileType("MP4", FILE_TYPE_MP4, "video/mp4", MtpConstants.FORMAT_MPEG); 170 addFileType("M4V", FILE_TYPE_M4V, "video/mp4", MtpConstants.FORMAT_MPEG); 171 addFileType("3GP", FILE_TYPE_3GPP, "video/3gpp", MtpConstants.FORMAT_3GP_CONTAINER); 172 addFileType("3GPP", FILE_TYPE_3GPP, "video/3gpp", MtpConstants.FORMAT_3GP_CONTAINER); 173 addFileType("3G2", FILE_TYPE_3GPP2, "video/3gpp2", MtpConstants.FORMAT_3GP_CONTAINER); 174 addFileType("3GPP2", FILE_TYPE_3GPP2, "video/3gpp2", MtpConstants.FORMAT_3GP_CONTAINER); 175 addFileType("MKV", FILE_TYPE_MKV, "video/x-matroska"); 176 addFileType("WEBM", FILE_TYPE_MKV, "video/x-matroska"); 177 addFileType("TS", FILE_TYPE_MP2TS, "video/mp2ts"); 178 179 if (isWMVEnabled()) { 180 addFileType("WMV", FILE_TYPE_WMV, "video/x-ms-wmv", MtpConstants.FORMAT_WMV); 181 addFileType("ASF", FILE_TYPE_ASF, "video/x-ms-asf"); 182 } 183 184 addFileType("JPG", FILE_TYPE_JPEG, "image/jpeg", MtpConstants.FORMAT_EXIF_JPEG); 185 addFileType("JPEG", FILE_TYPE_JPEG, "image/jpeg", MtpConstants.FORMAT_EXIF_JPEG); 186 addFileType("GIF", FILE_TYPE_GIF, "image/gif", MtpConstants.FORMAT_GIF); 187 addFileType("PNG", FILE_TYPE_PNG, "image/png", MtpConstants.FORMAT_PNG); 188 addFileType("BMP", FILE_TYPE_BMP, "image/x-ms-bmp", MtpConstants.FORMAT_BMP); 189 addFileType("WBMP", FILE_TYPE_WBMP, "image/vnd.wap.wbmp"); 190 191 addFileType("M3U", FILE_TYPE_M3U, "audio/x-mpegurl", MtpConstants.FORMAT_M3U_PLAYLIST); 192 addFileType("PLS", FILE_TYPE_PLS, "audio/x-scpls", MtpConstants.FORMAT_PLS_PLAYLIST); 193 addFileType("WPL", FILE_TYPE_WPL, "application/vnd.ms-wpl", MtpConstants.FORMAT_WPL_PLAYLIST); 194 195 // compute file extensions list for native Media Scanner 196 StringBuilder builder = new StringBuilder(); 197 Iterator<String> iterator = sFileTypeMap.keySet().iterator(); 198 199 while (iterator.hasNext()) { 200 if (builder.length() > 0) { 201 builder.append(','); 202 } 203 builder.append(iterator.next()); 204 } 205 sFileExtensions = builder.toString(); 206 } 207 208 public static boolean isAudioFileType(int fileType) { 209 return ((fileType >= FIRST_AUDIO_FILE_TYPE && 210 fileType <= LAST_AUDIO_FILE_TYPE) || 211 (fileType >= FIRST_MIDI_FILE_TYPE && 212 fileType <= LAST_MIDI_FILE_TYPE)); 213 } 214 215 public static boolean isVideoFileType(int fileType) { 216 return (fileType >= FIRST_VIDEO_FILE_TYPE && 217 fileType <= LAST_VIDEO_FILE_TYPE); 218 } 219 220 public static boolean isImageFileType(int fileType) { 221 return (fileType >= FIRST_IMAGE_FILE_TYPE && 222 fileType <= LAST_IMAGE_FILE_TYPE); 223 } 224 225 public static boolean isPlayListFileType(int fileType) { 226 return (fileType >= FIRST_PLAYLIST_FILE_TYPE && 227 fileType <= LAST_PLAYLIST_FILE_TYPE); 228 } 229 230 public static MediaFileType getFileType(String path) { 231 int lastDot = path.lastIndexOf("."); 232 if (lastDot < 0) 233 return null; 234 return sFileTypeMap.get(path.substring(lastDot + 1).toUpperCase()); 235 } 236 237 public static int getFileTypeForMimeType(String mimeType) { 238 Integer value = sMimeTypeMap.get(mimeType); 239 return (value == null ? 0 : value.intValue()); 240 } 241 242 public static int getFormatCode(String fileName, String mimeType) { 243 if (mimeType != null) { 244 Integer value = sMimeTypeToFormatMap.get(mimeType); 245 if (value != null) { 246 return value.intValue(); 247 } 248 } 249 int lastDot = fileName.lastIndexOf('.'); 250 if (lastDot > 0) { 251 String extension = fileName.substring(lastDot + 1); 252 Integer value = sFileTypeToFormatMap.get(extension); 253 if (value != null) { 254 return value.intValue(); 255 } 256 } 257 return MtpConstants.FORMAT_UNDEFINED; 258 } 259 260 public static String getMimeTypeForFormatCode(int formatCode) { 261 return sFormatToMimeTypeMap.get(formatCode); 262 } 263} 264