MediaFile.java revision 68db99ef761456ffaa0c4b918ce75dfc0892784a
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    private static final int FIRST_AUDIO_FILE_TYPE = FILE_TYPE_MP3;
50    private static final int LAST_AUDIO_FILE_TYPE = FILE_TYPE_AAC;
51
52    // MIDI file types
53    public static final int FILE_TYPE_MID     = 11;
54    public static final int FILE_TYPE_SMF     = 12;
55    public static final int FILE_TYPE_IMY     = 13;
56    private static final int FIRST_MIDI_FILE_TYPE = FILE_TYPE_MID;
57    private static final int LAST_MIDI_FILE_TYPE = FILE_TYPE_IMY;
58
59    // Video file types
60    public static final int FILE_TYPE_MP4     = 21;
61    public static final int FILE_TYPE_M4V     = 22;
62    public static final int FILE_TYPE_3GPP    = 23;
63    public static final int FILE_TYPE_3GPP2   = 24;
64    public static final int FILE_TYPE_WMV     = 25;
65    public static final int FILE_TYPE_ASF     = 26;
66    private static final int FIRST_VIDEO_FILE_TYPE = FILE_TYPE_MP4;
67    private static final int LAST_VIDEO_FILE_TYPE = FILE_TYPE_ASF;
68
69    // Image file types
70    public static final int FILE_TYPE_JPEG    = 31;
71    public static final int FILE_TYPE_GIF     = 32;
72    public static final int FILE_TYPE_PNG     = 33;
73    public static final int FILE_TYPE_BMP     = 34;
74    public static final int FILE_TYPE_WBMP    = 35;
75    private static final int FIRST_IMAGE_FILE_TYPE = FILE_TYPE_JPEG;
76    private static final int LAST_IMAGE_FILE_TYPE = FILE_TYPE_WBMP;
77
78    // Playlist file types
79    public static final int FILE_TYPE_M3U     = 41;
80    public static final int FILE_TYPE_PLS     = 42;
81    public static final int FILE_TYPE_WPL     = 43;
82    private static final int FIRST_PLAYLIST_FILE_TYPE = FILE_TYPE_M3U;
83    private static final int LAST_PLAYLIST_FILE_TYPE = FILE_TYPE_WPL;
84
85    static class MediaFileType {
86
87        int fileType;
88        String mimeType;
89
90        MediaFileType(int fileType, String mimeType) {
91            this.fileType = fileType;
92            this.mimeType = mimeType;
93        }
94    }
95
96    private static HashMap<String, MediaFileType> sFileTypeMap
97            = new HashMap<String, MediaFileType>();
98    private static HashMap<String, Integer> sMimeTypeMap
99            = new HashMap<String, Integer>();
100    static void addFileType(String extension, int fileType, String mimeType) {
101        sFileTypeMap.put(extension, new MediaFileType(fileType, mimeType));
102        sMimeTypeMap.put(mimeType, Integer.valueOf(fileType));
103    }
104
105    private static boolean isWMAEnabled() {
106        List<AudioDecoder> decoders = DecoderCapabilities.getAudioDecoders();
107        for (AudioDecoder decoder: decoders) {
108            if (decoder == AudioDecoder.AUDIO_DECODER_WMA) {
109                return true;
110            }
111        }
112        return false;
113    }
114
115    private static boolean isWMVEnabled() {
116        List<VideoDecoder> decoders = DecoderCapabilities.getVideoDecoders();
117        for (VideoDecoder decoder: decoders) {
118            if (decoder == VideoDecoder.VIDEO_DECODER_WMV) {
119                return true;
120            }
121        }
122        return false;
123    }
124
125    static {
126        addFileType("MP3", FILE_TYPE_MP3, "audio/mpeg");
127        addFileType("M4A", FILE_TYPE_M4A, "audio/mp4");
128        addFileType("WAV", FILE_TYPE_WAV, "audio/x-wav");
129        addFileType("AMR", FILE_TYPE_AMR, "audio/amr");
130        addFileType("AWB", FILE_TYPE_AWB, "audio/amr-wb");
131        if (isWMAEnabled()) {
132            addFileType("WMA", FILE_TYPE_WMA, "audio/x-ms-wma");
133        }
134        addFileType("OGG", FILE_TYPE_OGG, "application/ogg");
135        addFileType("OGA", FILE_TYPE_OGG, "application/ogg");
136        addFileType("AAC", FILE_TYPE_AAC, "audio/aac");
137
138        addFileType("MID", FILE_TYPE_MID, "audio/midi");
139        addFileType("MIDI", FILE_TYPE_MID, "audio/midi");
140        addFileType("XMF", FILE_TYPE_MID, "audio/midi");
141        addFileType("RTTTL", FILE_TYPE_MID, "audio/midi");
142        addFileType("SMF", FILE_TYPE_SMF, "audio/sp-midi");
143        addFileType("IMY", FILE_TYPE_IMY, "audio/imelody");
144        addFileType("RTX", FILE_TYPE_MID, "audio/midi");
145        addFileType("OTA", FILE_TYPE_MID, "audio/midi");
146
147        addFileType("MPEG", FILE_TYPE_MP4, "video/mpeg");
148        addFileType("MP4", FILE_TYPE_MP4, "video/mp4");
149        addFileType("M4V", FILE_TYPE_M4V, "video/mp4");
150        addFileType("3GP", FILE_TYPE_3GPP, "video/3gpp");
151        addFileType("3GPP", FILE_TYPE_3GPP, "video/3gpp");
152        addFileType("3G2", FILE_TYPE_3GPP2, "video/3gpp2");
153        addFileType("3GPP2", FILE_TYPE_3GPP2, "video/3gpp2");
154        if (isWMVEnabled()) {
155            addFileType("WMV", FILE_TYPE_WMV, "video/x-ms-wmv");
156            addFileType("ASF", FILE_TYPE_ASF, "video/x-ms-asf");
157        }
158
159        addFileType("JPG", FILE_TYPE_JPEG, "image/jpeg");
160        addFileType("JPEG", FILE_TYPE_JPEG, "image/jpeg");
161        addFileType("GIF", FILE_TYPE_GIF, "image/gif");
162        addFileType("PNG", FILE_TYPE_PNG, "image/png");
163        addFileType("BMP", FILE_TYPE_BMP, "image/x-ms-bmp");
164        addFileType("WBMP", FILE_TYPE_WBMP, "image/vnd.wap.wbmp");
165
166        addFileType("M3U", FILE_TYPE_M3U, "audio/x-mpegurl");
167        addFileType("PLS", FILE_TYPE_PLS, "audio/x-scpls");
168        addFileType("WPL", FILE_TYPE_WPL, "application/vnd.ms-wpl");
169
170        // compute file extensions list for native Media Scanner
171        StringBuilder builder = new StringBuilder();
172        Iterator<String> iterator = sFileTypeMap.keySet().iterator();
173
174        while (iterator.hasNext()) {
175            if (builder.length() > 0) {
176                builder.append(',');
177            }
178            builder.append(iterator.next());
179        }
180        sFileExtensions = builder.toString();
181    }
182
183    public static boolean isAudioFileType(int fileType) {
184        return ((fileType >= FIRST_AUDIO_FILE_TYPE &&
185                fileType <= LAST_AUDIO_FILE_TYPE) ||
186                (fileType >= FIRST_MIDI_FILE_TYPE &&
187                fileType <= LAST_MIDI_FILE_TYPE));
188    }
189
190    public static boolean isVideoFileType(int fileType) {
191        return (fileType >= FIRST_VIDEO_FILE_TYPE &&
192                fileType <= LAST_VIDEO_FILE_TYPE);
193    }
194
195    public static boolean isImageFileType(int fileType) {
196        return (fileType >= FIRST_IMAGE_FILE_TYPE &&
197                fileType <= LAST_IMAGE_FILE_TYPE);
198    }
199
200    public static boolean isPlayListFileType(int fileType) {
201        return (fileType >= FIRST_PLAYLIST_FILE_TYPE &&
202                fileType <= LAST_PLAYLIST_FILE_TYPE);
203    }
204
205    public static MediaFileType getFileType(String path) {
206        int lastDot = path.lastIndexOf(".");
207        if (lastDot < 0)
208            return null;
209        return sFileTypeMap.get(path.substring(lastDot + 1).toUpperCase());
210    }
211
212    public static int getFileTypeForMimeType(String mimeType) {
213        Integer value = sMimeTypeMap.get(mimeType);
214        return (value == null ? 0 : value.intValue());
215    }
216
217}
218