diff --git a/api/current.txt b/api/current.txt index 799ad0fd18512..e5e12482fcd99 100644 --- a/api/current.txt +++ b/api/current.txt @@ -20850,6 +20850,7 @@ package android.media { method public final void setDataSource(android.content.Context, android.net.Uri, java.util.Map) throws java.io.IOException; method public final void setDataSource(java.lang.String, java.util.Map) throws java.io.IOException; method public final void setDataSource(java.lang.String) throws java.io.IOException; + method public final void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public final void setDataSource(java.io.FileDescriptor) throws java.io.IOException; method public final void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException; method public void unselectTrack(int); diff --git a/api/system-current.txt b/api/system-current.txt index 9a84d1ade8ce8..7d94199d716ca 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -22342,6 +22342,7 @@ package android.media { method public final void setDataSource(android.content.Context, android.net.Uri, java.util.Map) throws java.io.IOException; method public final void setDataSource(java.lang.String, java.util.Map) throws java.io.IOException; method public final void setDataSource(java.lang.String) throws java.io.IOException; + method public final void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public final void setDataSource(java.io.FileDescriptor) throws java.io.IOException; method public final void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException; method public void unselectTrack(int); diff --git a/api/test-current.txt b/api/test-current.txt index f18f4e1cd1c2d..d1ed20c52444b 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -20861,6 +20861,7 @@ package android.media { method public final void setDataSource(android.content.Context, android.net.Uri, java.util.Map) throws java.io.IOException; method public final void setDataSource(java.lang.String, java.util.Map) throws java.io.IOException; method public final void setDataSource(java.lang.String) throws java.io.IOException; + method public final void setDataSource(android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException; method public final void setDataSource(java.io.FileDescriptor) throws java.io.IOException; method public final void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException; method public void unselectTrack(int); diff --git a/media/java/android/media/MediaExtractor.java b/media/java/android/media/MediaExtractor.java index b339925a2ae45..177344a0ed4c4 100644 --- a/media/java/android/media/MediaExtractor.java +++ b/media/java/android/media/MediaExtractor.java @@ -28,6 +28,8 @@ import android.media.MediaHTTPService; import android.net.Uri; import android.os.IBinder; +import com.android.internal.util.Preconditions; + import java.io.FileDescriptor; import java.io.IOException; import java.lang.annotation.Retention; @@ -188,6 +190,26 @@ final public class MediaExtractor { null); } + /** + * Sets the data source (AssetFileDescriptor) to use. It is the caller's + * responsibility to close the file descriptor. It is safe to do so as soon + * as this call returns. + * + * @param afd the AssetFileDescriptor for the file you want to extract from. + */ + public final void setDataSource(@NonNull AssetFileDescriptor afd) + throws IOException, IllegalArgumentException, IllegalStateException { + Preconditions.checkNotNull(afd); + // Note: using getDeclaredLength so that our behavior is the same + // as previous versions when the content provider is returning + // a full file. + if (afd.getDeclaredLength() < 0) { + setDataSource(afd.getFileDescriptor()); + } else { + setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength()); + } + } + /** * Sets the data source (FileDescriptor) to use. It is the caller's responsibility * to close the file descriptor. It is safe to do so as soon as this call returns.