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