MediaStore.java revision ed297a8417b1a44cf94ba0e33175a87055088424
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.provider; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant.SdkConstantType; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentUris; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DatabaseUtils; 2600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenimport android.database.sqlite.SQLiteException; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.BitmapFactory; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Matrix; 3000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenimport android.media.MiniThumbFile; 3100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenimport android.media.ThumbnailUtil; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Environment; 3400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenimport android.os.ParcelFileDescriptor; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.UnsupportedEncodingException; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.text.Collator; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Media provider contains meta data for all available media on both internal 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and external storage devices. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenpublic final class MediaStore { 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static String TAG = "MediaStore"; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String AUTHORITY = "media"; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String CONTENT_AUTHORITY_SLASH = "content://" + AUTHORITY + "/"; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity Action: Perform a search for media. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Contains at least the {@link android.app.SearchManager#QUERY} extra. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * May also contain any combination of the following extras: 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * EXTRA_MEDIA_ARTIST, EXTRA_MEDIA_ALBUM, EXTRA_MEDIA_TITLE, EXTRA_MEDIA_FOCUS 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.provider.MediaStore#EXTRA_MEDIA_ARTIST 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.provider.MediaStore#EXTRA_MEDIA_ALBUM 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.provider.MediaStore#EXTRA_MEDIA_TITLE 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.provider.MediaStore#EXTRA_MEDIA_FOCUS 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String INTENT_ACTION_MEDIA_SEARCH = "android.intent.action.MEDIA_SEARCH"; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the Intent-extra used to define the artist 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_MEDIA_ARTIST = "android.intent.extra.artist"; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the Intent-extra used to define the album 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_MEDIA_ALBUM = "android.intent.extra.album"; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the Intent-extra used to define the song title 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_MEDIA_TITLE = "android.intent.extra.title"; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the Intent-extra used to define the search focus. The search focus 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indicates whether the search should be for things related to the artist, album 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or song that is identified by the other extras. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_MEDIA_FOCUS = "android.intent.extra.focus"; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the Intent-extra used to control the orientation of a ViewImage or a MovieView. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is an int property that overrides the activity's requestedOrientation. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_SCREEN_ORIENTATION = "android.intent.extra.screenOrientation"; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of an Intent-extra used to control the UI of a ViewImage. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a boolean property that overrides the activity's default fullscreen state. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_FULL_SCREEN = "android.intent.extra.fullScreen"; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of an Intent-extra used to control the UI of a ViewImage. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a boolean property that specifies whether or not to show action icons. 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_SHOW_ACTION_ICONS = "android.intent.extra.showActionIcons"; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the Intent-extra used to control the onCompletion behavior of a MovieView. 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is a boolean property that specifies whether or not to finish the MovieView activity 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the movie completes playing. The default value is true, which means to automatically 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * exit the movie player activity when the movie completes playing. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_FINISH_ON_COMPLETION = "android.intent.extra.finishOnCompletion"; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the Intent action used to launch a camera in still image mode. 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA"; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the Intent action used to launch a camera in video mode. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA"; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Standard Intent action that can be sent to have the camera application 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * capture an image and return it. 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The caller may pass an extra EXTRA_OUTPUT to control where this image will be written. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the EXTRA_OUTPUT is not present, then a small sized image is returned as a Bitmap 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object in the extra field. This is useful for applications that only need a small image. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the EXTRA_OUTPUT is present, then the full-sized image will be written to the Uri 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value of EXTRA_OUTPUT. 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_OUTPUT 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_VIDEO_QUALITY 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE"; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Standard Intent action that can be sent to have the camera application 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * capture an video and return it. 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The caller may pass in an extra EXTRA_VIDEO_QUALITY to control the video quality. 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The caller may pass in an extra EXTRA_OUTPUT to control 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * where the video is written. If EXTRA_OUTPUT is not present the video will be 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * written to the standard location for videos, and the Uri of that location will be 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returned in the data field of the Uri. 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_OUTPUT 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String ACTION_VIDEO_CAPTURE = "android.media.action.VIDEO_CAPTURE"; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the Intent-extra used to control the quality of a recorded video. This is an 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * integer property. Currently value 0 means low quality, suitable for MMS messages, and 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * value 1 means high quality. In the future other quality levels may be added. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String EXTRA_VIDEO_QUALITY = "android.intent.extra.videoQuality"; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specify the maximum allowed size. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String EXTRA_SIZE_LIMIT = "android.intent.extra.sizeLimit"; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 170eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang * Specify the maximum allowed recording duration in seconds. 171eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang * @hide 172eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang */ 173eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang public final static String EXTRA_DURATION_LIMIT = "android.intent.extra.durationLimit"; 174eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang 175eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang /** 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the Intent-extra used to indicate a content resolver Uri to be used to 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * store the requested image or video. 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static String EXTRA_OUTPUT = "output"; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 182ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen * The string that is used when a media attribute is not known. For example, 183ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen * if an audio file does not have any meta data, the artist and album columns 184ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen * will be set to this value. 185ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen * @hide 186ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen */ 187ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen public static final String UNKNOWN_STRING = "<unknown>"; 188ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen 189ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen /** 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Common fields for most MediaProvider tables 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public interface MediaColumns extends BaseColumns { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The data stream for the file 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: DATA STREAM</P> 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATA = "_data"; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The size of the file in bytes 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SIZE = "_size"; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The display name of the file 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DISPLAY_NAME = "_display_name"; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The title of the content 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TITLE = "title"; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The time the file was added to the media provider 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Units are seconds since 1970. 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE_ADDED = "date_added"; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The time the file was last modified 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Units are seconds since 1970. 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * NOTE: This is for internal use by the media scanner. Do not modify this field. 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE_MODIFIED = "date_modified"; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type of the file 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String MIME_TYPE = "mime_type"; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * This class is used internally by Images.Thumbnails and Video.Thumbnails, it's not intended 24200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * to be accessed elsewhere. 24300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 24400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen private static class InternalThumbnails implements BaseColumns { 24500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen private static final int MINI_KIND = 1; 24600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen private static final int FULL_SCREEN_KIND = 2; 24700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen private static final int MICRO_KIND = 3; 24800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen private static final String[] PROJECTION = new String[] {_ID, MediaColumns.DATA}; 24913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen static final int DEFAULT_GROUP_ID = 0; 25000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 251f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen private static Bitmap getMiniThumbFromFile(Cursor c, Uri baseUri, ContentResolver cr, BitmapFactory.Options options) { 252f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen Bitmap bitmap = null; 253f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen Uri thumbUri = null; 254f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen try { 255f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen long thumbId = c.getLong(0); 256f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen String filePath = c.getString(1); 257f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen thumbUri = ContentUris.withAppendedId(baseUri, thumbId); 258f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen ParcelFileDescriptor pfdInput = cr.openFileDescriptor(thumbUri, "r"); 259f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen bitmap = BitmapFactory.decodeFileDescriptor( 260f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen pfdInput.getFileDescriptor(), null, options); 261f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen pfdInput.close(); 262f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen } catch (FileNotFoundException ex) { 263f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen Log.e(TAG, "couldn't open thumbnail " + thumbUri + "; " + ex); 264f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen } catch (IOException ex) { 265f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen Log.e(TAG, "couldn't open thumbnail " + thumbUri + "; " + ex); 266f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen } catch (OutOfMemoryError ex) { 267f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen Log.e(TAG, "failed to allocate memory for thumbnail " 268f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen + thumbUri + "; " + ex); 269f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen } 270f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen return bitmap; 271f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen } 272f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen 27300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 274b994419263fb4f595379838f62efc50f90565e20Ray Chen * This method cancels the thumbnail request so clients waiting for getThumbnail will be 275b994419263fb4f595379838f62efc50f90565e20Ray Chen * interrupted and return immediately. Only the original process which made the getThumbnail 276b994419263fb4f595379838f62efc50f90565e20Ray Chen * requests can cancel their own requests. 277b994419263fb4f595379838f62efc50f90565e20Ray Chen * 278b994419263fb4f595379838f62efc50f90565e20Ray Chen * @param cr ContentResolver 279ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen * @param origId original image or video id. use -1 to cancel all requests. 28013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param groupId the same groupId used in getThumbnail 281b994419263fb4f595379838f62efc50f90565e20Ray Chen * @param baseUri the base URI of requested thumbnails 282b994419263fb4f595379838f62efc50f90565e20Ray Chen */ 28313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen static void cancelThumbnailRequest(ContentResolver cr, long origId, Uri baseUri, 28413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen long groupId) { 285b994419263fb4f595379838f62efc50f90565e20Ray Chen Uri cancelUri = baseUri.buildUpon().appendQueryParameter("cancel", "1") 28613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen .appendQueryParameter("orig_id", String.valueOf(origId)) 28713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen .appendQueryParameter("group_id", String.valueOf(groupId)).build(); 288b994419263fb4f595379838f62efc50f90565e20Ray Chen Cursor c = null; 289b994419263fb4f595379838f62efc50f90565e20Ray Chen try { 290b994419263fb4f595379838f62efc50f90565e20Ray Chen c = cr.query(cancelUri, PROJECTION, null, null, null); 291b994419263fb4f595379838f62efc50f90565e20Ray Chen } 292b994419263fb4f595379838f62efc50f90565e20Ray Chen finally { 293b994419263fb4f595379838f62efc50f90565e20Ray Chen if (c != null) c.close(); 294b994419263fb4f595379838f62efc50f90565e20Ray Chen } 295b994419263fb4f595379838f62efc50f90565e20Ray Chen } 296b994419263fb4f595379838f62efc50f90565e20Ray Chen /** 29700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * This method ensure thumbnails associated with origId are generated and decode the byte 29800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * stream from database (MICRO_KIND) or file (MINI_KIND). 29900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * 30000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * Special optimization has been done to avoid further IPC communication for MICRO_KIND 30100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * thumbnails. 30200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * 30300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param cr ContentResolver 30400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param origId original image or video id 30500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param kind could be MINI_KIND or MICRO_KIND 30600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param options this is only used for MINI_KIND when decoding the Bitmap 30700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param baseUri the base URI of requested thumbnails 30813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param groupId the id of group to which this request belongs 30900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @return Bitmap bitmap of specified thumbnail kind 31000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 31113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen static Bitmap getThumbnail(ContentResolver cr, long origId, long groupId, int kind, 31200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen BitmapFactory.Options options, Uri baseUri, boolean isVideo) { 31300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen Bitmap bitmap = null; 31400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen String filePath = null; 315b994419263fb4f595379838f62efc50f90565e20Ray Chen // Log.v(TAG, "getThumbnail: origId="+origId+", kind="+kind+", isVideo="+isVideo); 316f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen // If the magic is non-zero, we simply return thumbnail if it does exist. 31700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen // querying MediaProvider and simply return thumbnail. 318f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen MiniThumbFile thumbFile = MiniThumbFile.instance(baseUri); 319f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen long magic = thumbFile.getMagic(origId); 320f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen if (magic != 0) { 321f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen if (kind == MICRO_KIND) { 32200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen byte[] data = new byte[MiniThumbFile.BYTES_PER_MINTHUMB]; 32300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen if (thumbFile.getMiniThumbFromFile(origId, data) != null) { 32400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 32500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen if (bitmap == null) { 32600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen Log.w(TAG, "couldn't decode byte array."); 32700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 32800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 32900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen return bitmap; 330f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen } else if (kind == MINI_KIND) { 331f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen String column = isVideo ? "video_id=" : "image_id="; 332f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen Cursor c = null; 333f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen try { 334f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen c = cr.query(baseUri, PROJECTION, column + origId, null, null); 335f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen if (c != null && c.moveToFirst()) { 336f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen bitmap = getMiniThumbFromFile(c, baseUri, cr, options); 337f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen if (bitmap != null) { 338f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen return bitmap; 339f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen } 340f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen } 341f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen } finally { 342f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen if (c != null) c.close(); 343f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen } 34400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 34500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 34600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 34700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen Cursor c = null; 34800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen try { 34900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen Uri blockingUri = baseUri.buildUpon().appendQueryParameter("blocking", "1") 35013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen .appendQueryParameter("orig_id", String.valueOf(origId)) 35113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen .appendQueryParameter("group_id", String.valueOf(groupId)).build(); 35200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen c = cr.query(blockingUri, PROJECTION, null, null, null); 35300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen // This happens when original image/video doesn't exist. 35400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen if (c == null) return null; 35500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 35600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen // Assuming thumbnail has been generated, at least original image exists. 35700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen if (kind == MICRO_KIND) { 35800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen byte[] data = new byte[MiniThumbFile.BYTES_PER_MINTHUMB]; 35900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen if (thumbFile.getMiniThumbFromFile(origId, data) != null) { 36000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 36100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen if (bitmap == null) { 36200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen Log.w(TAG, "couldn't decode byte array."); 36300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 36400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 36500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } else if (kind == MINI_KIND) { 36600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen if (c.moveToFirst()) { 367f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen bitmap = getMiniThumbFromFile(c, baseUri, cr, options); 36800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 36900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } else { 37000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen throw new IllegalArgumentException("Unsupported kind: " + kind); 37100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 37200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 37300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen // We probably run out of space, so create the thumbnail in memory. 37400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen if (bitmap == null) { 37500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen Log.v(TAG, "We probably run out of space, so create the thumbnail in memory."); 376ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen 37700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen Uri uri = Uri.parse( 37800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen baseUri.buildUpon().appendPath(String.valueOf(origId)) 37900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen .toString().replaceFirst("thumbnails", "media")); 380ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen if (filePath == null) { 3819b150b74573ce506abd00c692fb42f46980441a3Marco Nelissen if (c != null) c.close(); 38200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen c = cr.query(uri, PROJECTION, null, null, null); 383ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen if (c == null || !c.moveToFirst()) { 384ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen return null; 385ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen } 386ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen filePath = c.getString(1); 387ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen } 388ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen if (isVideo) { 389ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen bitmap = ThumbnailUtil.createVideoThumbnail(filePath); 39013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen if (kind == MICRO_KIND && bitmap != null) { 391ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen bitmap = ThumbnailUtil.extractMiniThumb(bitmap, 392ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen ThumbnailUtil.MINI_THUMB_TARGET_SIZE, 393ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen ThumbnailUtil.MINI_THUMB_TARGET_SIZE, 394ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen ThumbnailUtil.RECYCLE_INPUT); 39500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 39600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } else { 397ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen bitmap = ThumbnailUtil.createImageThumbnail(cr, filePath, uri, origId, 398ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen kind, false); 39900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 40000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 40100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } catch (SQLiteException ex) { 40200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen Log.w(TAG, ex); 40300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } finally { 40400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen if (c != null) c.close(); 40500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 40600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen return bitmap; 40700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 40800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 40900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 41000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Contains meta data for all available images. 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 41300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final class Images { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface ImageColumns extends MediaColumns { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The description of the image 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DESCRIPTION = "description"; 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The picasa id of the image 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String PICASA_ID = "picasa_id"; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether the video should be published as public or private 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String IS_PRIVATE = "isprivate"; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The latitude where the image was captured. 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: DOUBLE</P> 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String LATITUDE = "latitude"; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The longitude where the image was captured. 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: DOUBLE</P> 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String LONGITUDE = "longitude"; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The date & time that the image was taken in units 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of milliseconds since jan 1, 1970. 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE_TAKEN = "datetaken"; 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The orientation for the image expressed as degrees. 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Only degrees 0, 90, 180, 270 will work. 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ORIENTATION = "orientation"; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The mini thumb id. 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String MINI_THUMB_MAGIC = "mini_thumb_magic"; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The bucket id of the image. This is a read-only property that 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is automatically computed from the DATA column. 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String BUCKET_ID = "bucket_id"; 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The bucket display name of the image. This is a read-only property that 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is automatically computed from the DATA column. 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Media implements ImageColumns { 48100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Cursor query(ContentResolver cr, Uri uri, String[] projection, 48600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen String where, String orderBy) { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(uri, projection, where, 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project null, orderBy == null ? DEFAULT_SORT_ORDER : orderBy); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Cursor query(ContentResolver cr, Uri uri, String[] projection, 49200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen String selection, String [] selectionArgs, String orderBy) { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(uri, projection, selection, 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project selectionArgs, orderBy == null ? DEFAULT_SORT_ORDER : orderBy); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieves an image for the given url as a {@link Bitmap}. 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The content resolver to use 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The url of the image 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws FileNotFoundException 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IOException 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Bitmap getBitmap(ContentResolver cr, Uri url) 50600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen throws FileNotFoundException, IOException { 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputStream input = cr.openInputStream(url); 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap bitmap = BitmapFactory.decodeStream(input); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project input.close(); 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bitmap; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Insert an image and create a thumbnail for it. 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The content resolver to use 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param imagePath The path to the image to insert 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name The name of the image 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param description The description of the image 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The URL to the newly created image 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws FileNotFoundException 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 52300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final String insertImage(ContentResolver cr, String imagePath, 52400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen String name, String description) throws FileNotFoundException { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check if file exists with a FileInputStream 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileInputStream stream = new FileInputStream(imagePath); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5282f189fa0f75d6899b9fa7db11f5301bc7850b744Marco Nelissen Bitmap bm = BitmapFactory.decodeFile(imagePath); 5292f189fa0f75d6899b9fa7db11f5301bc7850b744Marco Nelissen String ret = insertImage(cr, bm, name, description); 5302f189fa0f75d6899b9fa7db11f5301bc7850b744Marco Nelissen bm.recycle(); 5312f189fa0f75d6899b9fa7db11f5301bc7850b744Marco Nelissen return ret; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Bitmap StoreThumbnail( 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentResolver cr, 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap source, 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long id, 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float width, float height, 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int kind) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // create the matrix to scale it 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Matrix matrix = new Matrix(); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float scaleX = width / source.getWidth(); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float scaleY = height / source.getHeight(); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project matrix.setScale(scaleX, scaleY); 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap thumb = Bitmap.createBitmap(source, 0, 0, 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source.getWidth(), 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source.getHeight(), matrix, 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true); 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues values = new ContentValues(4); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(Images.Thumbnails.KIND, kind); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(Images.Thumbnails.IMAGE_ID, (int)id); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(Images.Thumbnails.HEIGHT, thumb.getHeight()); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(Images.Thumbnails.WIDTH, thumb.getWidth()); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri url = cr.insert(Images.Thumbnails.EXTERNAL_CONTENT_URI, values); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OutputStream thumbOut = cr.openOutputStream(url); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thumb.compress(Bitmap.CompressFormat.JPEG, 100, thumbOut); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thumbOut.close(); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return thumb; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (FileNotFoundException ex) { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (IOException ex) { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Insert an image and create a thumbnail for it. 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param cr The content resolver to use 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param source The stream to use for the image 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param title The name of the image 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param description The description of the image 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The URL to the newly created image, or <code>null</code> if the image failed to be stored 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for any reason. 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String insertImage(ContentResolver cr, Bitmap source, 59300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen String title, String description) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ContentValues values = new ContentValues(); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(Images.Media.TITLE, title); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(Images.Media.DESCRIPTION, description); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(Images.Media.MIME_TYPE, "image/jpeg"); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri url = null; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String stringUrl = null; /* value to be returned */ 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 60200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen try { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project url = cr.insert(EXTERNAL_CONTENT_URI, values); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (source != null) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OutputStream imageOut = cr.openOutputStream(url); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project imageOut.close(); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long id = ContentUris.parseId(url); 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap miniThumb = StoreThumbnail(cr, source, id, 320F, 240F, Images.Thumbnails.MINI_KIND); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap microThumb = StoreThumbnail(cr, miniThumb, id, 50F, 50F, Images.Thumbnails.MICRO_KIND); 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Failed to create thumbnail, removing original"); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.delete(url, null, null); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project url = null; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Failed to insert image", e); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (url != null) { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cr.delete(url, null, null); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project url = null; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (url != null) { 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stringUrl = url.toString(); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return stringUrl; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the content:// style URI for the image media table on the 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given volume. 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param volumeName the name of the volume to get the URI for 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the URI to the image media table on the given volume 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getContentUri(String volumeName) { 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName + 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "/images/media"); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the internal storage. 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri INTERNAL_CONTENT_URI = 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("internal"); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the "primary" external storage 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * volume. 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri EXTERNAL_CONTENT_URI = 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("external"); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type of of this directory of 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * images. Note that each entry in this directory will have a standard 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * image MIME type as appropriate -- for example, image/jpeg. 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CONTENT_TYPE = "vnd.android.cursor.dir/image"; 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DEFAULT_SORT_ORDER = ImageColumns.BUCKET_DISPLAY_NAME; 67200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 67400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 67500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * This class allows developers to query and get two kinds of thumbnails: 67600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * MINI_KIND: 512 x 384 thumbnail 67700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * MICRO_KIND: 96 x 96 thumbnail 67800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 67900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static class Thumbnails implements BaseColumns { 68000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) { 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 68400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final Cursor queryMiniThumbnails(ContentResolver cr, Uri uri, int kind, 68500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen String[] projection) { 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(uri, projection, "kind = " + kind, null, DEFAULT_SORT_ORDER); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 68900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final Cursor queryMiniThumbnail(ContentResolver cr, long origId, int kind, 69000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen String[] projection) { 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(EXTERNAL_CONTENT_URI, projection, 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IMAGE_ID + " = " + origId + " AND " + KIND + " = " + 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project kind, null, null); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 697b994419263fb4f595379838f62efc50f90565e20Ray Chen * This method cancels the thumbnail request so clients waiting for getThumbnail will be 698b994419263fb4f595379838f62efc50f90565e20Ray Chen * interrupted and return immediately. Only the original process which made the getThumbnail 699b994419263fb4f595379838f62efc50f90565e20Ray Chen * requests can cancel their own requests. 700b994419263fb4f595379838f62efc50f90565e20Ray Chen * 701b994419263fb4f595379838f62efc50f90565e20Ray Chen * @param cr ContentResolver 702b994419263fb4f595379838f62efc50f90565e20Ray Chen * @param origId original image id 703b994419263fb4f595379838f62efc50f90565e20Ray Chen */ 704b994419263fb4f595379838f62efc50f90565e20Ray Chen public static void cancelThumbnailRequest(ContentResolver cr, long origId) { 70513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen InternalThumbnails.cancelThumbnailRequest(cr, origId, EXTERNAL_CONTENT_URI, 70613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen InternalThumbnails.DEFAULT_GROUP_ID); 707b994419263fb4f595379838f62efc50f90565e20Ray Chen } 708b994419263fb4f595379838f62efc50f90565e20Ray Chen 709b994419263fb4f595379838f62efc50f90565e20Ray Chen /** 71000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * This method checks if the thumbnails of the specified image (origId) has been created. 71100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * It will be blocked until the thumbnails are generated. 71200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * 71300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param cr ContentResolver used to dispatch queries to MediaProvider. 71400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param origId Original image id associated with thumbnail of interest. 71500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param kind The type of thumbnail to fetch. Should be either MINI_KIND or MICRO_KIND. 71600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param options this is only used for MINI_KIND when decoding the Bitmap 71700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @return A Bitmap instance. It could be null if the original image 71800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * associated with origId doesn't exist or memory is not enough. 71900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 72000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind, 72100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen BitmapFactory.Options options) { 72213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen return InternalThumbnails.getThumbnail(cr, origId, 72313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen InternalThumbnails.DEFAULT_GROUP_ID, kind, options, 72413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen EXTERNAL_CONTENT_URI, false); 72513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen } 72613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen 72713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen /** 72813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * This method cancels the thumbnail request so clients waiting for getThumbnail will be 72913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * interrupted and return immediately. Only the original process which made the getThumbnail 73013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * requests can cancel their own requests. 73113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * 73213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param cr ContentResolver 73313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param origId original image id 73413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param groupId the same groupId used in getThumbnail. 73513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen */ 73613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen public static void cancelThumbnailRequest(ContentResolver cr, long origId, long groupId) { 73713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen InternalThumbnails.cancelThumbnailRequest(cr, origId, EXTERNAL_CONTENT_URI, groupId); 73813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen } 73913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen 74013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen /** 74113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * This method checks if the thumbnails of the specified image (origId) has been created. 74213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * It will be blocked until the thumbnails are generated. 74313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * 74413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param cr ContentResolver used to dispatch queries to MediaProvider. 74513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param origId Original image id associated with thumbnail of interest. 74613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param groupId the id of group to which this request belongs 74713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param kind The type of thumbnail to fetch. Should be either MINI_KIND or MICRO_KIND. 74813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param options this is only used for MINI_KIND when decoding the Bitmap 74913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @return A Bitmap instance. It could be null if the original image 75013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * associated with origId doesn't exist or memory is not enough. 75113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen */ 75213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen public static Bitmap getThumbnail(ContentResolver cr, long origId, long groupId, 75313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen int kind, BitmapFactory.Options options) { 75413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen return InternalThumbnails.getThumbnail(cr, origId, groupId, kind, options, 75500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen EXTERNAL_CONTENT_URI, false); 75600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 75700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 75800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the content:// style URI for the image media table on the 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given volume. 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param volumeName the name of the volume to get the URI for 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the URI to the image media table on the given volume 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getContentUri(String volumeName) { 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName + 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "/images/thumbnails"); 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the internal storage. 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri INTERNAL_CONTENT_URI = 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("internal"); 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the "primary" external storage 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * volume. 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri EXTERNAL_CONTENT_URI = 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("external"); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DEFAULT_SORT_ORDER = "image_id ASC"; 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The data stream for the thumbnail 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: DATA STREAM</P> 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATA = "_data"; 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The original image for the thumbnal 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (ID from Images table)</P> 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String IMAGE_ID = "image_id"; 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The kind of the thumbnail 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (One of the values below)</P> 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String KIND = "kind"; 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MINI_KIND = 1; 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FULL_SCREEN_KIND = 2; 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int MICRO_KIND = 3; 80900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 81000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * The blob raw data of thumbnail 81100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * <P>Type: DATA STREAM</P> 81200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 81300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final String THUMB_DATA = "thumb_data"; 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The width of the thumbnal 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String WIDTH = "width"; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The height of the thumbnail 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String HEIGHT = "height"; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Container for all audio content. 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Audio { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Columns for audio file that show up in multiple tables. 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface AudioColumns extends MediaColumns { 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A non human readable key calculated from the TITLE, used for 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searching, sorting and grouping 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TITLE_KEY = "title_key"; 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The duration of the audio file, in ms 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DURATION = "duration"; 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The position, in ms, playback was at when playback for this file 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was last stopped. 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String BOOKMARK = "bookmark"; 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The id of the artist who created the audio file, if any 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ARTIST_ID = "artist_id"; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The artist who created the audio file, if any 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ARTIST = "artist"; 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A non human readable key calculated from the ARTIST, used for 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searching, sorting and grouping 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ARTIST_KEY = "artist_key"; 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The composer of the audio file, if any 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String COMPOSER = "composer"; 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The id of the album the audio file is from, if any 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ALBUM_ID = "album_id"; 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The album the audio file is from, if any 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ALBUM = "album"; 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A non human readable key calculated from the ALBUM, used for 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searching, sorting and grouping 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ALBUM_KEY = "album_key"; 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A URI to the album art, if any 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ALBUM_ART = "album_art"; 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The track number of this song on the album, if any. 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This number encodes both the track number and the 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disc number. For multi-disc sets, this number will 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be 1xxx for tracks on the first disc, 2xxx for tracks 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on the second disc, etc. 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TRACK = "track"; 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The year the audio file was recorded, if any 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String YEAR = "year"; 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Non-zero if the audio file is music 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (boolean)</P> 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String IS_MUSIC = "is_music"; 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Non-zero if the audio file is a podcast 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (boolean)</P> 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String IS_PODCAST = "is_podcast"; 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Non-zero id the audio file may be a ringtone 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (boolean)</P> 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String IS_RINGTONE = "is_ringtone"; 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Non-zero id the audio file may be an alarm 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (boolean)</P> 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String IS_ALARM = "is_alarm"; 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Non-zero id the audio file may be a notification sound 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (boolean)</P> 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String IS_NOTIFICATION = "is_notification"; 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts a name to a "key" that can be used for grouping, sorting 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and searching. 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The rules that govern this conversion are: 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - remove 'special' characters like ()[]'!?., 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - remove leading/trailing spaces 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - convert everything to lowercase 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - remove leading "the ", "an " and "a " 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - remove trailing ", the|an|a" 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - remove accents. This step leaves us with CollationKey data, 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which is not human readable 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name The artist or album name to convert 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The "key" for the given name. 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static String keyFor(String name) { 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null) { 974816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen boolean sortfirst = false; 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.equals(android.media.MediaFile.UNKNOWN_STRING)) { 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "\001"; 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 978816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen // Check if the first character is \001. We use this to 979816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen // force sorting of certain special files, like the silent ringtone. 980816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen if (name.startsWith("\001")) { 981816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen sortfirst = true; 982816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen } 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = name.trim().toLowerCase(); 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.startsWith("the ")) { 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = name.substring(4); 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.startsWith("an ")) { 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = name.substring(3); 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.startsWith("a ")) { 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = name.substring(2); 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.endsWith(", the") || name.endsWith(",the") || 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name.endsWith(", an") || name.endsWith(",an") || 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name.endsWith(", a") || name.endsWith(",a")) { 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = name.substring(0, name.lastIndexOf(',')); 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 998e754e128e6237ea1c5b263ec2a02b0413851cfbaMarco Nelissen name = name.replaceAll("[\\[\\]\\(\\)\"'.,?!]", "").trim(); 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.length() > 0) { 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Insert a separator between the characters to avoid 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // matches on a partial character. If we ever change 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to start-of-word-only matches, this can be removed. 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder b = new StringBuilder(); 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append('.'); 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nl = name.length(); 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < nl; i++) { 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append(name.charAt(i)); 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append('.'); 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project name = b.toString(); 1011816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen String key = DatabaseUtils.getCollationKey(name); 1012816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen if (sortfirst) { 1013816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen key = "\001" + key; 1014816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen } 1015816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen return key; 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ""; 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Media implements AudioColumns { 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the content:// style URI for the audio media table on the 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given volume. 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param volumeName the name of the volume to get the URI for 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the URI to the audio media table on the given volume 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getContentUri(String volumeName) { 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName + 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "/audio/media"); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getContentUriForPath(String path) { 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (path.startsWith(Environment.getExternalStorageDirectory().getPath()) ? 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EXTERNAL_CONTENT_URI : INTERNAL_CONTENT_URI); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the internal storage. 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri INTERNAL_CONTENT_URI = 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("internal"); 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the "primary" external storage 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * volume. 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri EXTERNAL_CONTENT_URI = 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("external"); 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type for this table. 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CONTENT_TYPE = "vnd.android.cursor.dir/audio"; 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1062816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen public static final String DEFAULT_SORT_ORDER = TITLE_KEY; 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity Action: Start SoundRecorder application. 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Input: nothing. 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Output: An uri to the recorded sound stored in the Media Library 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the recording was successful. 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * May also contain the extra EXTRA_MAX_BYTES. 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_MAX_BYTES 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String RECORD_SOUND_ACTION = 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.provider.MediaStore.RECORD_SOUND"; 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the Intent-extra used to define a maximum file size for 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a recording made by the SoundRecorder application. 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #RECORD_SOUND_ACTION 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_MAX_BYTES = 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.provider.MediaStore.extra.MAX_BYTES"; 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Columns representing an audio genre 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface GenresColumns { 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the genre 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NAME = "name"; 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Contains all genres for audio files 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Genres implements BaseColumns, GenresColumns { 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the content:// style URI for the audio genres table on the 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given volume. 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param volumeName the name of the volume to get the URI for 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the URI to the audio genres table on the given volume 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getContentUri(String volumeName) { 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName + 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "/audio/genres"); 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the internal storage. 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri INTERNAL_CONTENT_URI = 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("internal"); 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the "primary" external storage 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * volume. 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri EXTERNAL_CONTENT_URI = 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("external"); 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type for this table. 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CONTENT_TYPE = "vnd.android.cursor.dir/genre"; 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type for entries in this table. 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/genre"; 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DEFAULT_SORT_ORDER = NAME; 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sub-directory of each genre containing all members. 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Members implements AudioColumns { 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri getContentUri(String volumeName, 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long genreId) { 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "/audio/genres/" + genreId + "/members"); 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A subdirectory of each genre containing all member audio files. 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CONTENT_DIRECTORY = "members"; 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1159816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen public static final String DEFAULT_SORT_ORDER = TITLE_KEY; 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ID of the audio file 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String AUDIO_ID = "audio_id"; 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ID of the genre 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String GENRE_ID = "genre_id"; 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Columns representing a playlist 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface PlaylistsColumns { 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The name of the playlist 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NAME = "name"; 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The data stream for the playlist file 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: DATA STREAM</P> 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATA = "_data"; 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The time the file was added to the media provider 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Units are seconds since 1970. 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE_ADDED = "date_added"; 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The time the file was last modified 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Units are seconds since 1970. 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * NOTE: This is for internal use by the media scanner. Do not modify this field. 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE_MODIFIED = "date_modified"; 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Contains playlists for audio files 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Playlists implements BaseColumns, 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PlaylistsColumns { 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the content:// style URI for the audio playlists table on the 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given volume. 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param volumeName the name of the volume to get the URI for 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the URI to the audio playlists table on the given volume 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getContentUri(String volumeName) { 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName + 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "/audio/playlists"); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the internal storage. 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri INTERNAL_CONTENT_URI = 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("internal"); 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the "primary" external storage 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * volume. 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri EXTERNAL_CONTENT_URI = 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("external"); 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type for this table. 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CONTENT_TYPE = "vnd.android.cursor.dir/playlist"; 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type for entries in this table. 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/playlist"; 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DEFAULT_SORT_ORDER = NAME; 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sub-directory of each playlist containing all members. 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Members implements AudioColumns { 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri getContentUri(String volumeName, 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long playlistId) { 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "/audio/playlists/" + playlistId + "/members"); 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1263e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen * Convenience method to move a playlist item to a new location 1264e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen * @param res The content resolver to use 1265e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen * @param playlistId The numeric id of the playlist 1266e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen * @param from The position of the item to move 1267e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen * @param to The position to move the item to 1268e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen * @return true on success 1269e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen * @hide 1270e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen */ 1271e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen public static final boolean moveItem(ContentResolver res, 1272e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen long playlistId, int from, int to) { 1273e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", 1274e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen playlistId) 1275e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen .buildUpon() 1276e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen .appendEncodedPath(String.valueOf(from)) 1277e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen .appendQueryParameter("move", "true") 1278e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen .build(); 1279e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen ContentValues values = new ContentValues(); 1280e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, to); 1281e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen return res.update(uri, values, null, null) != 0; 1282e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen } 1283e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen 1284e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen /** 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ID within the playlist. 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String _ID = "_id"; 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A subdirectory of each playlist containing all member audio 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * files. 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CONTENT_DIRECTORY = "members"; 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ID of the audio file 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String AUDIO_ID = "audio_id"; 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ID of the playlist 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String PLAYLIST_ID = "playlist_id"; 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The order of the songs in the playlist 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)></P> 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String PLAY_ORDER = "play_order"; 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DEFAULT_SORT_ORDER = PLAY_ORDER; 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Columns representing an artist 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface ArtistColumns { 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The artist who created the audio file, if any 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ARTIST = "artist"; 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A non human readable key calculated from the ARTIST, used for 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searching, sorting and grouping 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ARTIST_KEY = "artist_key"; 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of albums in the database for this artist 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NUMBER_OF_ALBUMS = "number_of_albums"; 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of albums in the database for this artist 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NUMBER_OF_TRACKS = "number_of_tracks"; 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Contains artists for audio files 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Artists implements BaseColumns, ArtistColumns { 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the content:// style URI for the artists table on the 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given volume. 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param volumeName the name of the volume to get the URI for 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the URI to the audio artists table on the given volume 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getContentUri(String volumeName) { 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName + 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "/audio/artists"); 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the internal storage. 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri INTERNAL_CONTENT_URI = 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("internal"); 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the "primary" external storage 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * volume. 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri EXTERNAL_CONTENT_URI = 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("external"); 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type for this table. 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CONTENT_TYPE = "vnd.android.cursor.dir/artists"; 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type for entries in this table. 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/artist"; 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DEFAULT_SORT_ORDER = ARTIST_KEY; 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sub-directory of each artist containing all albums on which 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a song by the artist appears. 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Albums implements AlbumColumns { 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri getContentUri(String volumeName, 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long artistId) { 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "/audio/artists/" + artistId + "/albums"); 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Columns representing an album 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface AlbumColumns { 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The id for the album 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ALBUM_ID = "album_id"; 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The album on which the audio file appears, if any 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ALBUM = "album"; 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The artist whose songs appear on this album 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ARTIST = "artist"; 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of songs on this album 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NUMBER_OF_SONGS = "numsongs"; 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This column is available when getting album info via artist, 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and indicates the number of songs on the album by the given 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * artist. 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NUMBER_OF_SONGS_FOR_ARTIST = "numsongs_by_artist"; 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1443f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * The year in which the earliest songs 1444f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * on this album were released. This will often 1445f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * be the same as {@link #LAST_YEAR}, but for compilation albums 1446f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * they might differ. 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String FIRST_YEAR = "minyear"; 145000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 1451f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler /** 1452f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * The year in which the latest songs 1453f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * on this album were released. This will often 1454f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * be the same as {@link #FIRST_YEAR}, but for compilation albums 1455f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * they might differ. 1456f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler * <P>Type: INTEGER</P> 1457f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler */ 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String LAST_YEAR = "maxyear"; 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A non human readable key calculated from the ALBUM, used for 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searching, sorting and grouping 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ALBUM_KEY = "album_key"; 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cached album art. 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ALBUM_ART = "album_art"; 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Contains artists for audio files 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Albums implements BaseColumns, AlbumColumns { 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the content:// style URI for the albums table on the 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given volume. 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param volumeName the name of the volume to get the URI for 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the URI to the audio albums table on the given volume 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getContentUri(String volumeName) { 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName + 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "/audio/albums"); 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the internal storage. 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri INTERNAL_CONTENT_URI = 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("internal"); 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the "primary" external storage 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * volume. 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri EXTERNAL_CONTENT_URI = 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("external"); 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type for this table. 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CONTENT_TYPE = "vnd.android.cursor.dir/albums"; 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type for entries in this table. 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/album"; 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DEFAULT_SORT_ORDER = ALBUM_KEY; 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Video { 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table. 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DEFAULT_SORT_ORDER = MediaColumns.DISPLAY_NAME; 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 152700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) { 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER); 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface VideoColumns extends MediaColumns { 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The duration of the video file, in ms 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER (long)</P> 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DURATION = "duration"; 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The artist who created the video file, if any 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ARTIST = "artist"; 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The album the video file is from, if any 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ALBUM = "album"; 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resolution of the video file, formatted as "XxY" 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String RESOLUTION = "resolution"; 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The description of the video recording 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DESCRIPTION = "description"; 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Whether the video should be published as public or private 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String IS_PRIVATE = "isprivate"; 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The user-added tags associated with a video 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String TAGS = "tags"; 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The YouTube category of the video 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CATEGORY = "category"; 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The language of the video 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String LANGUAGE = "language"; 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The latitude where the image was captured. 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: DOUBLE</P> 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String LATITUDE = "latitude"; 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The longitude where the image was captured. 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: DOUBLE</P> 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String LONGITUDE = "longitude"; 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The date & time that the image was taken in units 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of milliseconds since jan 1, 1970. 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DATE_TAKEN = "datetaken"; 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The mini thumb id. 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String MINI_THUMB_MAGIC = "mini_thumb_magic"; 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The bucket id of the video. This is a read-only property that 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is automatically computed from the DATA column. 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String BUCKET_ID = "bucket_id"; 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The bucket display name of the video. This is a read-only property that 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is automatically computed from the DATA column. 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: TEXT</P> 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String BUCKET_DISPLAY_NAME = "bucket_display_name"; 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The bookmark for the video. Time in ms. Represents the location in the video that the 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * video should start playing at the next time it is opened. If the value is null or 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * out of the range 0..DURATION-1 then the video should start playing from the 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * beginning. 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <P>Type: INTEGER</P> 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String BOOKMARK = "bookmark"; 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final class Media implements VideoColumns { 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the content:// style URI for the video media table on the 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given volume. 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param volumeName the name of the volume to get the URI for 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the URI to the video media table on the given volume 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getContentUri(String volumeName) { 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName + 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "/video/media"); 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the internal storage. 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri INTERNAL_CONTENT_URI = 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("internal"); 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URI for the "primary" external storage 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * volume. 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri EXTERNAL_CONTENT_URI = 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getContentUri("external"); 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type for this table. 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CONTENT_TYPE = "vnd.android.cursor.dir/video"; 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The default sort order for this table 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DEFAULT_SORT_ORDER = TITLE; 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 167200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 167300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 167400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * This class allows developers to query and get two kinds of thumbnails: 167500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * MINI_KIND: 512 x 384 thumbnail 167600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * MICRO_KIND: 96 x 96 thumbnail 167700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * 167800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 167900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static class Thumbnails implements BaseColumns { 168000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 1681b994419263fb4f595379838f62efc50f90565e20Ray Chen * This method cancels the thumbnail request so clients waiting for getThumbnail will be 1682b994419263fb4f595379838f62efc50f90565e20Ray Chen * interrupted and return immediately. Only the original process which made the getThumbnail 1683b994419263fb4f595379838f62efc50f90565e20Ray Chen * requests can cancel their own requests. 1684b994419263fb4f595379838f62efc50f90565e20Ray Chen * 1685b994419263fb4f595379838f62efc50f90565e20Ray Chen * @param cr ContentResolver 1686b994419263fb4f595379838f62efc50f90565e20Ray Chen * @param origId original video id 1687b994419263fb4f595379838f62efc50f90565e20Ray Chen */ 1688b994419263fb4f595379838f62efc50f90565e20Ray Chen public static void cancelThumbnailRequest(ContentResolver cr, long origId) { 168913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen InternalThumbnails.cancelThumbnailRequest(cr, origId, EXTERNAL_CONTENT_URI, 169013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen InternalThumbnails.DEFAULT_GROUP_ID); 169113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen } 169213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen 169313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen /** 169413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * This method checks if the thumbnails of the specified image (origId) has been created. 169513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * It will be blocked until the thumbnails are generated. 169613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * 169713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param cr ContentResolver used to dispatch queries to MediaProvider. 169813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param origId Original image id associated with thumbnail of interest. 169913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param kind The type of thumbnail to fetch. Should be either MINI_KIND or MICRO_KIND. 170013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param options this is only used for MINI_KIND when decoding the Bitmap 170113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @return A Bitmap instance. It could be null if the original image 170213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * associated with origId doesn't exist or memory is not enough. 170313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen */ 170413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind, 170513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen BitmapFactory.Options options) { 170613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen return InternalThumbnails.getThumbnail(cr, origId, 170713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen InternalThumbnails.DEFAULT_GROUP_ID, kind, options, 170813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen EXTERNAL_CONTENT_URI, true); 1709b994419263fb4f595379838f62efc50f90565e20Ray Chen } 1710b994419263fb4f595379838f62efc50f90565e20Ray Chen 1711b994419263fb4f595379838f62efc50f90565e20Ray Chen /** 171200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * This method checks if the thumbnails of the specified image (origId) has been created. 171300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * It will be blocked until the thumbnails are generated. 171400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * 171500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param cr ContentResolver used to dispatch queries to MediaProvider. 171600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param origId Original image id associated with thumbnail of interest. 171713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param groupId the id of group to which this request belongs 171800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param kind The type of thumbnail to fetch. Should be either MINI_KIND or MICRO_KIND 171900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param options this is only used for MINI_KIND when decoding the Bitmap 172000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @return A Bitmap instance. It could be null if the original image associated with 172100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * origId doesn't exist or memory is not enough. 172200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 172313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen public static Bitmap getThumbnail(ContentResolver cr, long origId, long groupId, 172413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen int kind, BitmapFactory.Options options) { 172513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen return InternalThumbnails.getThumbnail(cr, origId, groupId, kind, options, 172600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen EXTERNAL_CONTENT_URI, true); 172700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 172800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 172900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 173013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * This method cancels the thumbnail request so clients waiting for getThumbnail will be 173113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * interrupted and return immediately. Only the original process which made the getThumbnail 173213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * requests can cancel their own requests. 173313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * 173413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param cr ContentResolver 173513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param origId original video id 173613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen * @param groupId the same groupId used in getThumbnail. 173713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen */ 173813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen public static void cancelThumbnailRequest(ContentResolver cr, long origId, long groupId) { 173913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen InternalThumbnails.cancelThumbnailRequest(cr, origId, EXTERNAL_CONTENT_URI, groupId); 174013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen } 174113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen 174213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen /** 174300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * Get the content:// style URI for the image media table on the 174400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * given volume. 174500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * 174600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @param volumeName the name of the volume to get the URI for 174700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * @return the URI to the image media table on the given volume 174800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 174900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static Uri getContentUri(String volumeName) { 175000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName + 175100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen "/video/thumbnails"); 175200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 175300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 175400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 175500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * The content:// style URI for the internal storage. 175600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 175700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final Uri INTERNAL_CONTENT_URI = 175800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen getContentUri("internal"); 175900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 176000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 176100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * The content:// style URI for the "primary" external storage 176200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * volume. 176300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 176400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final Uri EXTERNAL_CONTENT_URI = 176500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen getContentUri("external"); 176600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 176700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 176800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * The default sort order for this table 176900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 177000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final String DEFAULT_SORT_ORDER = "video_id ASC"; 177100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 177200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 177300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * The data stream for the thumbnail 177400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * <P>Type: DATA STREAM</P> 177500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 177600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final String DATA = "_data"; 177700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 177800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 177900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * The original image for the thumbnal 178000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * <P>Type: INTEGER (ID from Video table)</P> 178100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 178200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final String VIDEO_ID = "video_id"; 178300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 178400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 178500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * The kind of the thumbnail 178600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * <P>Type: INTEGER (One of the values below)</P> 178700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 178800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final String KIND = "kind"; 178900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 179000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final int MINI_KIND = 1; 179100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final int FULL_SCREEN_KIND = 2; 179200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final int MICRO_KIND = 3; 179300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 179400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 179500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * The width of the thumbnal 179600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * <P>Type: INTEGER (long)</P> 179700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 179800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final String WIDTH = "width"; 179900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen 180000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen /** 180100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * The height of the thumbnail 180200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen * <P>Type: INTEGER (long)</P> 180300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen */ 180400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen public static final String HEIGHT = "height"; 180500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen } 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Uri for querying the state of the media scanner. 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Uri getMediaScannerUri() { 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.parse(CONTENT_AUTHORITY_SLASH + "none/media_scanner"); 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Name of current volume being scanned by the media scanner. 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String MEDIA_SCANNER_VOLUME = "volume"; 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1820