MediaFile.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  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. package android.media;
  17. import android.content.ContentValues;
  18. import android.provider.MediaStore.Audio;
  19. import android.provider.MediaStore.Images;
  20. import android.provider.MediaStore.Video;
  21. import android.media.DecoderCapabilities;
  22. import android.media.DecoderCapabilities.VideoDecoder;
  23. import android.media.DecoderCapabilities.AudioDecoder;
  24. import android.mtp.MtpConstants;
  25. import java.util.HashMap;
  26. import java.util.Iterator;
  27. import java.util.List;
  28. /**
  29. * MediaScanner helper class.
  30. *
  31. * {@hide}
  32. */
  33. public class MediaFile {
  34. // Audio file types
  35. public static final int FILE_TYPE_MP3 = 1;
  36. public static final int FILE_TYPE_M4A = 2;
  37. public static final int FILE_TYPE_WAV = 3;
  38. public static final int FILE_TYPE_AMR = 4;
  39. public static final int FILE_TYPE_AWB = 5;
  40. public static final int FILE_TYPE_WMA = 6;
  41. public static final int FILE_TYPE_OGG = 7;
  42. public static final int FILE_TYPE_AAC = 8;
  43. public static final int FILE_TYPE_MKA = 9;
  44. public static final int FILE_TYPE_FLAC = 10;
  45. // TELECHIPS
  46. public static final int FILE_TYPE_APE = 11;
  47. public static final int FILE_TYPE_RA = 12;
  48. public static final int FILE_TYPE_MP2 = 13;
  49. private static final int FIRST_AUDIO_FILE_TYPE = FILE_TYPE_MP3;
  50. private static final int LAST_AUDIO_FILE_TYPE = FILE_TYPE_MP2;
  51. // MIDI file types
  52. public static final int FILE_TYPE_MID = 21;
  53. public static final int FILE_TYPE_SMF = 22;
  54. public static final int FILE_TYPE_IMY = 23;
  55. private static final int FIRST_MIDI_FILE_TYPE = FILE_TYPE_MID;
  56. private static final int LAST_MIDI_FILE_TYPE = FILE_TYPE_IMY;
  57. // Video file types
  58. public static final int FILE_TYPE_MP4 = 31;
  59. public static final int FILE_TYPE_M4V = 32;
  60. public static final int FILE_TYPE_3GPP = 33;
  61. public static final int FILE_TYPE_3GPP2 = 34;
  62. public static final int FILE_TYPE_WMV = 35;
  63. public static final int FILE_TYPE_ASF = 36;
  64. public static final int FILE_TYPE_MKV = 37;
  65. public static final int FILE_TYPE_MP2TS = 38;
  66. public static final int FILE_TYPE_AVI = 39;
  67. public static final int FILE_TYPE_WEBM = 40;
  68. public static final int FILE_TYPE_RMVB = 41;
  69. public static final int FILE_TYPE_RM = 42;
  70. public static final int FILE_TYPE_MPG = 43;
  71. public static final int FILE_TYPE_VOB = 44;
  72. public static final int FILE_TYPE_MOV = 45;
  73. public static final int FILE_TYPE_TP = 46;
  74. public static final int FILE_TYPE_TRP = 47;
  75. public static final int FILE_TYPE_M2TS = 48;
  76. public static final int FILE_TYPE_FLV = 49;
  77. public static final int FILE_TYPE_DIVX = 50;
  78. public static final int FILE_TYPE_DAT = 51;
  79. public static final int FILE_TYPE_SVI = 52;
  80. public static final int FILE_TYPE_TS = 53;
  81. public static final int FILE_TYPE_OGM = 54;
  82. public static final int FILE_TYPE_SSIF = 55;
  83. private static final int FIRST_VIDEO_FILE_TYPE = FILE_TYPE_MP4;
  84. private static final int LAST_VIDEO_FILE_TYPE = FILE_TYPE_SSIF;
  85. // More video file types
  86. public static final int FILE_TYPE_MP2PS = 200;
  87. private static final int FIRST_VIDEO_FILE_TYPE2 = FILE_TYPE_MP2PS;
  88. private static final int LAST_VIDEO_FILE_TYPE2 = FILE_TYPE_MP2PS;
  89. // Image file types
  90. public static final int FILE_TYPE_JPEG = 61;
  91. public static final int FILE_TYPE_GIF = 62;
  92. public static final int FILE_TYPE_PNG = 63;
  93. public static final int FILE_TYPE_BMP = 64;
  94. public static final int FILE_TYPE_WBMP = 65;
  95. public static final int FILE_TYPE_WEBP = 66;
  96. private static final int FIRST_IMAGE_FILE_TYPE = FILE_TYPE_JPEG;
  97. private static final int LAST_IMAGE_FILE_TYPE = FILE_TYPE_WEBP;
  98. // Playlist file types
  99. public static final int FILE_TYPE_M3U = 71;
  100. public static final int FILE_TYPE_PLS = 72;
  101. public static final int FILE_TYPE_WPL = 73;
  102. public static final int FILE_TYPE_HTTPLIVE = 74;
  103. private static final int FIRST_PLAYLIST_FILE_TYPE = FILE_TYPE_M3U;
  104. private static final int LAST_PLAYLIST_FILE_TYPE = FILE_TYPE_HTTPLIVE;
  105. // Drm file types
  106. public static final int FILE_TYPE_FL = 81;
  107. private static final int FIRST_DRM_FILE_TYPE = FILE_TYPE_FL;
  108. private static final int LAST_DRM_FILE_TYPE = FILE_TYPE_FL;
  109. // Other popular file types
  110. public static final int FILE_TYPE_TEXT = 100;
  111. public static final int FILE_TYPE_HTML = 101;
  112. public static final int FILE_TYPE_PDF = 102;
  113. public static final int FILE_TYPE_XML = 103;
  114. public static final int FILE_TYPE_MS_WORD = 104;
  115. public static final int FILE_TYPE_MS_EXCEL = 105;
  116. public static final int FILE_TYPE_MS_POWERPOINT = 106;
  117. public static final int FILE_TYPE_ZIP = 107;
  118. public static class MediaFileType {
  119. public final int fileType;
  120. public final String mimeType;
  121. MediaFileType(int fileType, String mimeType) {
  122. this.fileType = fileType;
  123. this.mimeType = mimeType;
  124. }
  125. }
  126. private static final HashMap<String, MediaFileType> sFileTypeMap
  127. = new HashMap<String, MediaFileType>();
  128. private static final HashMap<String, Integer> sMimeTypeMap
  129. = new HashMap<String, Integer>();
  130. // maps file extension to MTP format code
  131. private static final HashMap<String, Integer> sFileTypeToFormatMap
  132. = new HashMap<String, Integer>();
  133. // maps mime type to MTP format code
  134. private static final HashMap<String, Integer> sMimeTypeToFormatMap
  135. = new HashMap<String, Integer>();
  136. // maps MTP format code to mime type
  137. private static final HashMap<Integer, String> sFormatToMimeTypeMap
  138. = new HashMap<Integer, String>();
  139. static void addFileType(String extension, int fileType, String mimeType) {
  140. sFileTypeMap.put(extension, new MediaFileType(fileType, mimeType));
  141. sMimeTypeMap.put(mimeType, Integer.valueOf(fileType));
  142. }
  143. static void addFileType(String extension, int fileType, String mimeType, int mtpFormatCode) {
  144. addFileType(extension, fileType, mimeType);
  145. sFileTypeToFormatMap.put(extension, Integer.valueOf(mtpFormatCode));
  146. sMimeTypeToFormatMap.put(mimeType, Integer.valueOf(mtpFormatCode));
  147. sFormatToMimeTypeMap.put(mtpFormatCode, mimeType);
  148. }
  149. private static boolean isWMAEnabled() {
  150. List<AudioDecoder> decoders = DecoderCapabilities.getAudioDecoders();
  151. int count = decoders.size();
  152. for (int i = 0; i < count; i++) {
  153. AudioDecoder decoder = decoders.get(i);
  154. if (decoder == AudioDecoder.AUDIO_DECODER_WMA) {
  155. return true;
  156. }
  157. }
  158. return false;
  159. }
  160. private static boolean isWMVEnabled() {
  161. List<VideoDecoder> decoders = DecoderCapabilities.getVideoDecoders();
  162. int count = decoders.size();
  163. for (int i = 0; i < count; i++) {
  164. VideoDecoder decoder = decoders.get(i);
  165. if (decoder == VideoDecoder.VIDEO_DECODER_WMV) {
  166. return true;
  167. }
  168. }
  169. return false;
  170. }
  171. private static boolean isRAEnabled() {
  172. List<AudioDecoder> decoders = DecoderCapabilities.getAudioDecoders();
  173. for (AudioDecoder decoder: decoders) {
  174. if (decoder == AudioDecoder.AUDIO_DECODER_RA) {
  175. return true;
  176. }
  177. }
  178. return false;
  179. }
  180. private static boolean isRVEnabled() {
  181. List<VideoDecoder> decoders = DecoderCapabilities.getVideoDecoders();
  182. for (VideoDecoder decoder: decoders) {
  183. if (decoder == VideoDecoder.VIDEO_DECODER_RV) {
  184. return true;
  185. }
  186. }
  187. return false;
  188. }
  189. static {
  190. addFileType("MP3", FILE_TYPE_MP3, "audio/mpeg", MtpConstants.FORMAT_MP3);
  191. addFileType("MPGA", FILE_TYPE_MP3, "audio/mpeg", MtpConstants.FORMAT_MP3);
  192. addFileType("M4A", FILE_TYPE_M4A, "audio/mp4", MtpConstants.FORMAT_MPEG);
  193. addFileType("WAV", FILE_TYPE_WAV, "audio/x-wav", MtpConstants.FORMAT_WAV);
  194. addFileType("AMR", FILE_TYPE_AMR, "audio/amr");
  195. addFileType("AWB", FILE_TYPE_AWB, "audio/amr-wb");
  196. if (isWMAEnabled()) {
  197. addFileType("WMA", FILE_TYPE_WMA, "audio/x-ms-wma", MtpConstants.FORMAT_WMA);
  198. }
  199. addFileType("OGG", FILE_TYPE_OGG, "audio/ogg", MtpConstants.FORMAT_OGG);
  200. addFileType("OGG", FILE_TYPE_OGG, "application/ogg", MtpConstants.FORMAT_OGG);
  201. addFileType("OGA", FILE_TYPE_OGG, "application/ogg", MtpConstants.FORMAT_OGG);
  202. addFileType("AAC", FILE_TYPE_AAC, "audio/aac", MtpConstants.FORMAT_AAC);
  203. addFileType("AAC", FILE_TYPE_AAC, "audio/aac-adts", MtpConstants.FORMAT_AAC);
  204. addFileType("MKA", FILE_TYPE_MKA, "audio/x-matroska");
  205. addFileType("MP2", FILE_TYPE_MP2, "audio/mpeg2");
  206. addFileType("APE", FILE_TYPE_APE, "audio/x-ape");
  207. if (isRAEnabled()) {
  208. addFileType("RA", FILE_TYPE_RA, "audio/vnd.rn-realaudio");
  209. }
  210. addFileType("MID", FILE_TYPE_MID, "audio/midi");
  211. addFileType("MIDI", FILE_TYPE_MID, "audio/midi");
  212. addFileType("XMF", FILE_TYPE_MID, "audio/midi");
  213. addFileType("RTTTL", FILE_TYPE_MID, "audio/midi");
  214. addFileType("SMF", FILE_TYPE_SMF, "audio/sp-midi");
  215. addFileType("IMY", FILE_TYPE_IMY, "audio/imelody");
  216. addFileType("RTX", FILE_TYPE_MID, "audio/midi");
  217. addFileType("OTA", FILE_TYPE_MID, "audio/midi");
  218. addFileType("MXMF", FILE_TYPE_MID, "audio/midi");
  219. addFileType("MPEG", FILE_TYPE_MP4, "video/mpeg", MtpConstants.FORMAT_MPEG);
  220. addFileType("MPG", FILE_TYPE_MP4, "video/mpeg", MtpConstants.FORMAT_MPEG);
  221. addFileType("MP4", FILE_TYPE_MP4, "video/mp4", MtpConstants.FORMAT_MPEG);
  222. addFileType("M4V", FILE_TYPE_M4V, "video/mp4", MtpConstants.FORMAT_MPEG);
  223. addFileType("3GP", FILE_TYPE_3GPP, "video/3gpp", MtpConstants.FORMAT_3GP_CONTAINER);
  224. addFileType("3GPP", FILE_TYPE_3GPP, "video/3gpp", MtpConstants.FORMAT_3GP_CONTAINER);
  225. addFileType("3G2", FILE_TYPE_3GPP2, "video/3gpp2", MtpConstants.FORMAT_3GP_CONTAINER);
  226. addFileType("3GPP2", FILE_TYPE_3GPP2, "video/3gpp2", MtpConstants.FORMAT_3GP_CONTAINER);
  227. addFileType("MKV", FILE_TYPE_MKV, "video/x-matroska");
  228. addFileType("WEBM", FILE_TYPE_WEBM, "video/webm");
  229. addFileType("TS", FILE_TYPE_MP2TS, "video/mp2ts");
  230. addFileType("AVI", FILE_TYPE_AVI, "video/avi");
  231. addFileType("OGM", FILE_TYPE_OGM, "video/ogg");
  232. if (isWMVEnabled()) {
  233. addFileType("WMV", FILE_TYPE_WMV, "video/x-ms-wmv", MtpConstants.FORMAT_WMV);
  234. addFileType("ASF", FILE_TYPE_ASF, "video/x-ms-asf");
  235. }
  236. addFileType("M2V", FILE_TYPE_MPG, "video/mpeg", MtpConstants.FORMAT_MPEG);
  237. addFileType("VOB", FILE_TYPE_VOB, "video/mpeg", MtpConstants.FORMAT_MPEG);
  238. addFileType("MOV", FILE_TYPE_MOV, "video/quicktime");
  239. addFileType("TP", FILE_TYPE_TP, "video/mpeg");
  240. addFileType("TRP", FILE_TYPE_TRP, "video/mpeg");
  241. addFileType("M2TS", FILE_TYPE_M2TS, "video/mp2t");
  242. addFileType("SSIF", FILE_TYPE_SSIF, "video/ssif");
  243. addFileType("FLV", FILE_TYPE_FLV, "video/x-flv");
  244. addFileType("DIVX", FILE_TYPE_DIVX, "video/divx");
  245. addFileType("DAT", FILE_TYPE_DAT, "video/mpeg");
  246. addFileType("SVI", FILE_TYPE_SVI, "video/x-svi");
  247. if (isRVEnabled()) {
  248. addFileType("RMVB", FILE_TYPE_RMVB, "video/vnd.rn-realvideo");
  249. addFileType("RM", FILE_TYPE_RM, "video/vnd.rn-realvideo");
  250. }
  251. addFileType("JPG", FILE_TYPE_JPEG, "image/jpeg", MtpConstants.FORMAT_EXIF_JPEG);
  252. addFileType("JPEG", FILE_TYPE_JPEG, "image/jpeg", MtpConstants.FORMAT_EXIF_JPEG);
  253. addFileType("GIF", FILE_TYPE_GIF, "image/gif", MtpConstants.FORMAT_GIF);
  254. addFileType("PNG", FILE_TYPE_PNG, "image/png", MtpConstants.FORMAT_PNG);
  255. addFileType("BMP", FILE_TYPE_BMP, "image/x-ms-bmp", MtpConstants.FORMAT_BMP);
  256. addFileType("WBMP", FILE_TYPE_WBMP, "image/vnd.wap.wbmp");
  257. addFileType("WEBP", FILE_TYPE_WEBP, "image/webp");
  258. addFileType("M3U", FILE_TYPE_M3U, "audio/x-mpegurl", MtpConstants.FORMAT_M3U_PLAYLIST);
  259. addFileType("M3U", FILE_TYPE_M3U, "application/x-mpegurl", MtpConstants.FORMAT_M3U_PLAYLIST);
  260. addFileType("PLS", FILE_TYPE_PLS, "audio/x-scpls", MtpConstants.FORMAT_PLS_PLAYLIST);
  261. addFileType("WPL", FILE_TYPE_WPL, "application/vnd.ms-wpl", MtpConstants.FORMAT_WPL_PLAYLIST);
  262. addFileType("M3U8", FILE_TYPE_HTTPLIVE, "application/vnd.apple.mpegurl");
  263. addFileType("M3U8", FILE_TYPE_HTTPLIVE, "audio/mpegurl");
  264. addFileType("M3U8", FILE_TYPE_HTTPLIVE, "audio/x-mpegurl");
  265. addFileType("FL", FILE_TYPE_FL, "application/x-android-drm-fl");
  266. addFileType("TXT", FILE_TYPE_TEXT, "text/plain", MtpConstants.FORMAT_TEXT);
  267. addFileType("HTM", FILE_TYPE_HTML, "text/html", MtpConstants.FORMAT_HTML);
  268. addFileType("HTML", FILE_TYPE_HTML, "text/html", MtpConstants.FORMAT_HTML);
  269. addFileType("PDF", FILE_TYPE_PDF, "application/pdf");
  270. addFileType("DOC", FILE_TYPE_MS_WORD, "application/msword", MtpConstants.FORMAT_MS_WORD_DOCUMENT);
  271. addFileType("XLS", FILE_TYPE_MS_EXCEL, "application/vnd.ms-excel", MtpConstants.FORMAT_MS_EXCEL_SPREADSHEET);
  272. addFileType("PPT", FILE_TYPE_MS_POWERPOINT, "application/mspowerpoint", MtpConstants.FORMAT_MS_POWERPOINT_PRESENTATION);
  273. addFileType("FLAC", FILE_TYPE_FLAC, "audio/flac", MtpConstants.FORMAT_FLAC);
  274. addFileType("ZIP", FILE_TYPE_ZIP, "application/zip");
  275. addFileType("MPG", FILE_TYPE_MP2PS, "video/mp2p");
  276. addFileType("MPEG", FILE_TYPE_MP2PS, "video/mp2p");
  277. }
  278. public static boolean isAudioFileType(int fileType) {
  279. return ((fileType >= FIRST_AUDIO_FILE_TYPE &&
  280. fileType <= LAST_AUDIO_FILE_TYPE) ||
  281. (fileType >= FIRST_MIDI_FILE_TYPE &&
  282. fileType <= LAST_MIDI_FILE_TYPE));
  283. }
  284. public static boolean isVideoFileType(int fileType) {
  285. return (fileType >= FIRST_VIDEO_FILE_TYPE &&
  286. fileType <= LAST_VIDEO_FILE_TYPE)
  287. || (fileType >= FIRST_VIDEO_FILE_TYPE2 &&
  288. fileType <= LAST_VIDEO_FILE_TYPE2);
  289. }
  290. public static boolean isImageFileType(int fileType) {
  291. return (fileType >= FIRST_IMAGE_FILE_TYPE &&
  292. fileType <= LAST_IMAGE_FILE_TYPE);
  293. }
  294. public static boolean isPlayListFileType(int fileType) {
  295. return (fileType >= FIRST_PLAYLIST_FILE_TYPE &&
  296. fileType <= LAST_PLAYLIST_FILE_TYPE);
  297. }
  298. public static boolean isDrmFileType(int fileType) {
  299. return (fileType >= FIRST_DRM_FILE_TYPE &&
  300. fileType <= LAST_DRM_FILE_TYPE);
  301. }
  302. public static MediaFileType getFileType(String path) {
  303. int lastDot = path.lastIndexOf(".");
  304. if (lastDot < 0)
  305. return null;
  306. return sFileTypeMap.get(path.substring(lastDot + 1).toUpperCase());
  307. }
  308. public static boolean isMimeTypeMedia(String mimeType) {
  309. int fileType = getFileTypeForMimeType(mimeType);
  310. return isAudioFileType(fileType) || isVideoFileType(fileType)
  311. || isImageFileType(fileType) || isPlayListFileType(fileType);
  312. }
  313. // generates a title based on file name
  314. public static String getFileTitle(String path) {
  315. // extract file name after last slash
  316. int lastSlash = path.lastIndexOf('/');
  317. if (lastSlash >= 0) {
  318. lastSlash++;
  319. if (lastSlash < path.length()) {
  320. path = path.substring(lastSlash);
  321. }
  322. }
  323. // truncate the file extension (if any)
  324. int lastDot = path.lastIndexOf('.');
  325. if (lastDot > 0) {
  326. path = path.substring(0, lastDot);
  327. }
  328. return path;
  329. }
  330. public static int getFileTypeForMimeType(String mimeType) {
  331. Integer value = sMimeTypeMap.get(mimeType);
  332. return (value == null ? 0 : value.intValue());
  333. }
  334. public static String getMimeTypeForFile(String path) {
  335. MediaFileType mediaFileType = getFileType(path);
  336. return (mediaFileType == null ? null : mediaFileType.mimeType);
  337. }
  338. public static int getFormatCode(String fileName, String mimeType) {
  339. if (mimeType != null) {
  340. Integer value = sMimeTypeToFormatMap.get(mimeType);
  341. if (value != null) {
  342. return value.intValue();
  343. }
  344. }
  345. int lastDot = fileName.lastIndexOf('.');
  346. if (lastDot > 0) {
  347. String extension = fileName.substring(lastDot + 1).toUpperCase();
  348. Integer value = sFileTypeToFormatMap.get(extension);
  349. if (value != null) {
  350. return value.intValue();
  351. }
  352. }
  353. return MtpConstants.FORMAT_UNDEFINED;
  354. }
  355. public static String getMimeTypeForFormatCode(int formatCode) {
  356. return sFormatToMimeTypeMap.get(formatCode);
  357. }
  358. }