Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa7b6826 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Android (Google) Code Review
Browse files

Merge "MediaStore API and docs polishing."

parents 86c329ac 9f05e0ea
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -38609,13 +38609,13 @@ package android.provider {
  public static final class MediaStore.Images.Media implements android.provider.MediaStore.Images.ImageColumns {
    ctor public MediaStore.Images.Media();
    method public static android.graphics.Bitmap getBitmap(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException, java.io.IOException;
    method @Deprecated public static android.graphics.Bitmap getBitmap(android.content.ContentResolver, android.net.Uri) throws java.io.FileNotFoundException, java.io.IOException;
    method public static android.net.Uri getContentUri(String);
    method public static String insertImage(android.content.ContentResolver, String, String, String) throws java.io.FileNotFoundException;
    method public static String insertImage(android.content.ContentResolver, android.graphics.Bitmap, String, String);
    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[], String, String);
    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[], String, String[], String);
    method @Deprecated public static String insertImage(android.content.ContentResolver, String, String, String) throws java.io.FileNotFoundException;
    method @Deprecated public static String insertImage(android.content.ContentResolver, android.graphics.Bitmap, String, String);
    method @Deprecated public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
    method @Deprecated public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[], String, String);
    method @Deprecated public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[], String, String[], String);
    field public static final String CONTENT_TYPE = "vnd.android.cursor.dir/image";
    field public static final String DEFAULT_SORT_ORDER = "bucket_display_name";
    field public static final android.net.Uri EXTERNAL_CONTENT_URI;
@@ -38684,7 +38684,7 @@ package android.provider {
  public static final class MediaStore.Video {
    ctor public MediaStore.Video();
    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
    method @Deprecated public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, String[]);
    field public static final String DEFAULT_SORT_ORDER = "_display_name";
  }
+6 −6
Original line number Diff line number Diff line
@@ -25,12 +25,12 @@ import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
 * @memberDoc Value is a non-negative timestamp in the
 *            {@link System#currentTimeMillis()} time base.
 * @paramDoc Value is a non-negative timestamp in the
 *           {@link System#currentTimeMillis()} time base.
 * @returnDoc Value is a non-negative timestamp in the
 *            {@link System#currentTimeMillis()} time base.
 * @memberDoc Value is a non-negative timestamp measured as the number of
 *            milliseconds since 1970-01-01T00:00:00Z.
 * @paramDoc Value is a non-negative timestamp measured as the number of
 *            milliseconds since 1970-01-01T00:00:00Z.
 * @returnDoc Value is a non-negative timestamp measured as the number of
 *            milliseconds since 1970-01-01T00:00:00Z.
 * @hide
 */
@Retention(SOURCE)
+39 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.annotation;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.SOURCE;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
 * @memberDoc Value is a non-negative timestamp measured as the number of
 *            seconds since 1970-01-01T00:00:00Z.
 * @paramDoc Value is a non-negative timestamp measured as the number of
 *            seconds since 1970-01-01T00:00:00Z.
 * @returnDoc Value is a non-negative timestamp measured as the number of
 *            seconds since 1970-01-01T00:00:00Z.
 * @hide
 */
@Retention(SOURCE)
@Target({METHOD, PARAMETER, FIELD})
public @interface CurrentTimeSecondsLong {
}
+1 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import static java.lang.annotation.RetentionPolicy.SOURCE;
 * Denotes that a numeric parameter, field or method return value is expected
 * to represent a pixel dimension.
 *
 * @memberDoc This units of this value are pixels.
 * @paramDoc This units of this value are pixels.
 * @returnDoc This units of this value are pixels.
 * {@hide}
+140 −53
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package android.provider;

import android.annotation.BytesLong;
import android.annotation.CurrentTimeMillisLong;
import android.annotation.CurrentTimeSecondsLong;
import android.annotation.DurationMillisLong;
import android.annotation.IntRange;
import android.annotation.NonNull;
@@ -40,7 +42,9 @@ import android.database.Cursor;
import android.database.DatabaseUtils;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageDecoder;
import android.graphics.Point;
import android.graphics.PostProcessor;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Bundle;
@@ -78,8 +82,15 @@ import java.util.Set;
import java.util.regex.Pattern;

/**
 * The Media provider contains meta data for all available media on both internal
 * and external storage devices.
 * The contract between the media provider and applications. Contains
 * definitions for the supported URIs and columns.
 * <p>
 * The media provider provides an indexed collection of common media types, such
 * as {@link Audio}, {@link Video}, and {@link Images}, from any attached
 * storage devices. Each collection is organized based on the primary MIME type
 * of the underlying content; for example, {@code image/*} content is indexed
 * under {@link Images}. The {@link Files} collection provides a broad view
 * across all collections, and does not filter by MIME type.
 */
public final class MediaStore {
    private final static String TAG = "MediaStore";
@@ -847,11 +858,11 @@ public final class MediaStore {
    }

    /**
     * Common fields for most MediaProvider tables
     * Common media metadata columns.
     */
    public interface MediaColumns extends BaseColumns {
        /**
         * Path to the file on disk.
         * Path to the media item on disk.
         * <p>
         * Note that apps may not have filesystem permissions to directly access
         * this path. Instead of trying to open this path directly, apps should
@@ -871,7 +882,7 @@ public final class MediaStore {
        public static final String DATA = "_data";

        /**
         * Hash of the file on disk.
         * Hash of the media item on disk.
         * <p>
         * Contains a 20-byte binary blob which is the SHA-1 hash of the file as
         * persisted on disk. For performance reasons, the hash may not be
@@ -890,35 +901,35 @@ public final class MediaStore {
        public static final String HASH = "_hash";

        /**
         * The size of the file in bytes
         * The size of the media item.
         */
        @BytesLong
        @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true)
        public static final String SIZE = "_size";

        /**
         * The display name of the file
         * The display name of the media item.
         */
        @Column(Cursor.FIELD_TYPE_STRING)
        public static final String DISPLAY_NAME = "_display_name";

        /**
         * The title of the content
         * The title of the media item.
         */
        @Column(value = Cursor.FIELD_TYPE_STRING, readOnly = true)
        public static final String TITLE = "title";

        /**
         * The time the file was added to the media provider
         * Units are seconds since 1970.
         * The time the media item was first added.
         */
        @CurrentTimeSecondsLong
        @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true)
        public static final String DATE_ADDED = "date_added";

        /**
         * The time the file was last modified
         * Units are seconds since 1970.
         * NOTE: This is for internal use by the media scanner.  Do not modify this field.
         * The time the media item was last modified.
         */
        @CurrentTimeSecondsLong
        @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true)
        public static final String DATE_MODIFIED = "date_modified";

@@ -986,23 +997,25 @@ public final class MediaStore {
        public static final String IS_TRASHED = "is_trashed";

        /**
         * The time the file should be considered expired. Units are seconds
         * since 1970. Typically only meaningful in the context of
         * {@link #IS_PENDING} or {@link #IS_TRASHED}.
         * The time the media item should be considered expired. Typically only
         * meaningful in the context of {@link #IS_PENDING} or
         * {@link #IS_TRASHED}.
         *
         * @removed
         */
        @Deprecated
        @CurrentTimeSecondsLong
        @Column(Cursor.FIELD_TYPE_INTEGER)
        public static final String DATE_EXPIRES = "date_expires";

        /**
         * The width of the image/video in pixels.
         * The width of the media item, in pixels.
         */
        @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true)
        public static final String WIDTH = "width";

        /**
         * The height of the image/video in pixels.
         * The height of the media item, in pixels.
         */
        @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true)
        public static final String HEIGHT = "height";
@@ -1151,8 +1164,7 @@ public final class MediaStore {
        }

        /**
         * Fields for master table for all media files.
         * Table also contains MediaColumns._ID, DATA, SIZE and DATE_MODIFIED.
         * File metadata columns.
         */
        public interface FileColumns extends MediaColumns {
            /**
@@ -1179,15 +1191,26 @@ public final class MediaStore {
            public static final String PARENT = "parent";

            /**
             * The MIME type of the file
             * <P>Type: TEXT</P>
             * The MIME type of the media item.
             * <p>
             * This is typically defined based on the file extension of the media
             * item. However, it may be the value of the {@code format} attribute
             * defined by the <em>Dublin Core Media Initiative</em> standard,
             * extracted from any XMP metadata contained within this media item.
             * <p class="note">
             * Note: the {@code format} attribute may be ignored if the top-level
             * MIME type disagrees with the file extension. For example, it's
             * reasonable for an {@code image/jpeg} file to declare a {@code format}
             * of {@code image/vnd.google.panorama360+jpg}, but declaring a
             * {@code format} of {@code audio/ogg} would be ignored.
             * <p>
             * This is a read-only column that is automatically computed.
             */
            @Column(Cursor.FIELD_TYPE_STRING)
            public static final String MIME_TYPE = "mime_type";

            /**
             * The title of the content
             * <P>Type: TEXT</P>
             * The title of the media item.
             */
            @Column(value = Cursor.FIELD_TYPE_STRING, readOnly = true)
            public static final String TITLE = "title";
@@ -1245,10 +1268,12 @@ public final class MediaStore {
        public static final Point MICRO_SIZE = new Point(96, 96);
    }

    /** Column fields for downloaded files used in {@link Downloads} table */
    /**
     * Download metadata columns.
     */
    public interface DownloadColumns extends MediaColumns {
        /**
         * Uri indicating where the file has been downloaded from.
         * Uri indicating where the item has been downloaded from.
         */
        @Column(Cursor.FIELD_TYPE_STRING)
        String DOWNLOAD_URI = "download_uri";
@@ -1422,9 +1447,12 @@ public final class MediaStore {
    }

    /**
     * Contains meta data for all available images.
     * Collection of all media with MIME type of {@code image/*}.
     */
    public static final class Images {
        /**
         * Image metadata columns.
         */
        public interface ImageColumns extends MediaColumns {
            /**
             * The description of the image
@@ -1473,9 +1501,9 @@ public final class MediaStore {
            public static final String LONGITUDE = "longitude";

            /**
             * The date & time that the image was taken in units
             * of milliseconds since jan 1, 1970.
             * The time the media item was taken.
             */
            @CurrentTimeMillisLong
            @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true)
            public static final String DATE_TAKEN = "datetaken";

@@ -1531,16 +1559,34 @@ public final class MediaStore {
        }

        public static final class Media implements ImageColumns {
            /**
             * @deprecated all queries should be performed through
             *             {@link ContentResolver} directly, which offers modern
             *             features like {@link CancellationSignal}.
             */
            @Deprecated
            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) {
                return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER);
            }

            /**
             * @deprecated all queries should be performed through
             *             {@link ContentResolver} directly, which offers modern
             *             features like {@link CancellationSignal}.
             */
            @Deprecated
            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection,
                    String where, String orderBy) {
                return cr.query(uri, projection, where,
                                             null, orderBy == null ? DEFAULT_SORT_ORDER : orderBy);
            }

            /**
             * @deprecated all queries should be performed through
             *             {@link ContentResolver} directly, which offers modern
             *             features like {@link CancellationSignal}.
             */
            @Deprecated
            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection,
                    String selection, String [] selectionArgs, String orderBy) {
                return cr.query(uri, projection, selection,
@@ -1552,9 +1598,12 @@ public final class MediaStore {
             *
             * @param cr The content resolver to use
             * @param url The url of the image
             * @throws FileNotFoundException
             * @throws IOException
             * @deprecated loading of images should be performed through
             *             {@link ImageDecoder#createSource(ContentResolver, Uri)},
             *             which offers modern features like
             *             {@link PostProcessor}.
             */
            @Deprecated
            public static final Bitmap getBitmap(ContentResolver cr, Uri url)
                    throws FileNotFoundException, IOException {
                InputStream input = cr.openInputStream(url);
@@ -1571,8 +1620,11 @@ public final class MediaStore {
             * @param name The name of the image
             * @param description The description of the image
             * @return The URL to the newly created image
             * @throws FileNotFoundException
             * @deprecated inserting of images should be performed through
             *             {@link MediaStore#createPending(Context, PendingParams)},
             *             which offers richer control over lifecycle.
             */
            @Deprecated
            public static final String insertImage(ContentResolver cr, String imagePath,
                    String name, String description) throws FileNotFoundException {
                // Check if file exists with a FileInputStream
@@ -1599,7 +1651,11 @@ public final class MediaStore {
             * @param description The description of the image
             * @return The URL to the newly created image, or <code>null</code> if the image failed to be stored
             *              for any reason.
             * @deprecated inserting of images should be performed through
             *             {@link MediaStore#createPending(Context, PendingParams)},
             *             which offers richer control over lifecycle.
             */
            @Deprecated
            public static final String insertImage(ContentResolver cr, Bitmap source,
                                                   String title, String description) {
                ContentValues values = new ContentValues();
@@ -1694,15 +1750,33 @@ public final class MediaStore {
         */
        @Deprecated
        public static class Thumbnails implements BaseColumns {
            /**
             * @deprecated all queries should be performed through
             *             {@link ContentResolver} directly, which offers modern
             *             features like {@link CancellationSignal}.
             */
            @Deprecated
            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) {
                return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER);
            }

            /**
             * @deprecated all queries should be performed through
             *             {@link ContentResolver} directly, which offers modern
             *             features like {@link CancellationSignal}.
             */
            @Deprecated
            public static final Cursor queryMiniThumbnails(ContentResolver cr, Uri uri, int kind,
                    String[] projection) {
                return cr.query(uri, projection, "kind = " + kind, null, DEFAULT_SORT_ORDER);
            }

            /**
             * @deprecated all queries should be performed through
             *             {@link ContentResolver} directly, which offers modern
             *             features like {@link CancellationSignal}.
             */
            @Deprecated
            public static final Cursor queryMiniThumbnail(ContentResolver cr, long origId, int kind,
                    String[] projection) {
                return cr.query(EXTERNAL_CONTENT_URI, projection,
@@ -1885,11 +1959,11 @@ public final class MediaStore {
    }

    /**
     * Container for all audio content.
     * Collection of all media with MIME type of {@code audio/*}.
     */
    public static final class Audio {
        /**
         * Columns for audio file that show up in multiple tables.
         * Audio metadata columns.
         */
        public interface AudioColumns extends MediaColumns {

@@ -1901,15 +1975,17 @@ public final class MediaStore {
            public static final String TITLE_KEY = "title_key";

            /**
             * The duration of the audio file, in ms
             * The duration of the audio item.
             */
            @DurationMillisLong
            @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true)
            public static final String DURATION = "duration";

            /**
             * The position, in ms, playback was at when playback for this file
             * was last stopped.
             * The position within the audio item at which playback should be
             * resumed.
             */
            @DurationMillisLong
            @Column(Cursor.FIELD_TYPE_INTEGER)
            public static final String BOOKMARK = "bookmark";

@@ -2187,7 +2263,7 @@ public final class MediaStore {
        }

        /**
         * Columns representing an audio genre
         * Audio genre metadata columns.
         */
        public interface GenresColumns {
            /**
@@ -2290,7 +2366,7 @@ public final class MediaStore {
        }

        /**
         * Columns representing a playlist
         * Audio playlist metadata columns.
         */
        public interface PlaylistsColumns {
            /**
@@ -2321,17 +2397,16 @@ public final class MediaStore {
            public static final String DATA = "_data";

            /**
             * The time the file was added to the media provider
             * Units are seconds since 1970.
             * The time the media item was first added.
             */
            @CurrentTimeSecondsLong
            @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true)
            public static final String DATE_ADDED = "date_added";

            /**
             * The time the file was last modified
             * Units are seconds since 1970.
             * NOTE: This is for internal use by the media scanner.  Do not modify this field.
             * The time the media item was last modified.
             */
            @CurrentTimeSecondsLong
            @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true)
            public static final String DATE_MODIFIED = "date_modified";
        }
@@ -2450,7 +2525,7 @@ public final class MediaStore {
        }

        /**
         * Columns representing an artist
         * Audio artist metadata columns.
         */
        public interface ArtistColumns {
            /**
@@ -2537,7 +2612,7 @@ public final class MediaStore {
        }

        /**
         * Columns representing an album
         * Audio album metadata columns.
         */
        public interface AlbumColumns {

@@ -2707,6 +2782,9 @@ public final class MediaStore {
        }
    }

    /**
     * Collection of all media with MIME type of {@code video/*}.
     */
    public static final class Video {

        /**
@@ -2714,15 +2792,25 @@ public final class MediaStore {
         */
        public static final String DEFAULT_SORT_ORDER = MediaColumns.DISPLAY_NAME;

        /**
         * @deprecated all queries should be performed through
         *             {@link ContentResolver} directly, which offers modern
         *             features like {@link CancellationSignal}.
         */
        @Deprecated
        public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) {
            return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER);
        }

        /**
         * Video metadata columns.
         */
        public interface VideoColumns extends MediaColumns {

            /**
             * The duration of the video file, in ms
             * The duration of the video item.
             */
            @DurationMillisLong
            @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true)
            public static final String DURATION = "duration";

@@ -2799,9 +2887,9 @@ public final class MediaStore {
            public static final String LONGITUDE = "longitude";

            /**
             * The date & time that the video was taken in units
             * of milliseconds since jan 1, 1970.
             * The time the media item was taken.
             */
            @CurrentTimeMillisLong
            @Column(value = Cursor.FIELD_TYPE_INTEGER, readOnly = true)
            public static final String DATE_TAKEN = "datetaken";

@@ -2849,11 +2937,10 @@ public final class MediaStore {
            public static final String GROUP_ID = "group_id";

            /**
             * The bookmark for the video. Time in ms. Represents the location in the video that the
             * video should start playing at the next time it is opened. If the value is null or
             * out of the range 0..DURATION-1 then the video should start playing from the
             * beginning.
             * The position within the video item at which playback should be
             * resumed.
             */
            @DurationMillisLong
            @Column(Cursor.FIELD_TYPE_INTEGER)
            public static final String BOOKMARK = "bookmark";