# DataSource

Artifact: [androidx.media3:media3-datasource](https://developer.android.com/jetpack/androidx/releases/media3) [View Source](https://cs.android.com/search?q=file:androidx/media3/datasource/DataSource.java+class:androidx.media3.datasource.DataSource)

*** ** * ** ***


```
public interface DataSource extends DataReader
```

<br />

Known direct subclasses [AesCipherDataSource](https://developer.android.com/reference/androidx/media3/datasource/AesCipherDataSource), [BaseDataSource](https://developer.android.com/reference/androidx/media3/datasource/BaseDataSource), [CacheDataSource](https://developer.android.com/reference/androidx/media3/datasource/cache/CacheDataSource), [DefaultDataSource](https://developer.android.com/reference/androidx/media3/datasource/DefaultDataSource), [HttpDataSource](https://developer.android.com/reference/androidx/media3/datasource/HttpDataSource), [PlaceholderDataSource](https://developer.android.com/reference/androidx/media3/datasource/PlaceholderDataSource), [PriorityDataSource](https://developer.android.com/reference/androidx/media3/datasource/PriorityDataSource), [ResolvingDataSource](https://developer.android.com/reference/androidx/media3/datasource/ResolvingDataSource), [StatsDataSource](https://developer.android.com/reference/androidx/media3/datasource/StatsDataSource), [TeeDataSource](https://developer.android.com/reference/androidx/media3/datasource/TeeDataSource)

|---|---|
| `https://developer.android.com/reference/androidx/media3/datasource/AesCipherDataSource` | A `https://developer.android.com/reference/androidx/media3/datasource/DataSource` that decrypts the data read from an upstream source. |
| `https://developer.android.com/reference/androidx/media3/datasource/BaseDataSource` | Base `https://developer.android.com/reference/androidx/media3/datasource/DataSource` implementation to keep a list of `https://developer.android.com/reference/androidx/media3/datasource/TransferListener`s. |
| `https://developer.android.com/reference/androidx/media3/datasource/cache/CacheDataSource` | A `https://developer.android.com/reference/androidx/media3/datasource/DataSource` that reads and writes a `https://developer.android.com/reference/androidx/media3/datasource/cache/Cache`. |
| `https://developer.android.com/reference/androidx/media3/datasource/DefaultDataSource` | A `https://developer.android.com/reference/androidx/media3/datasource/DataSource` that supports multiple URI schemes. |
| `https://developer.android.com/reference/androidx/media3/datasource/HttpDataSource` | An HTTP `https://developer.android.com/reference/androidx/media3/datasource/DataSource`. |
| `https://developer.android.com/reference/androidx/media3/datasource/PlaceholderDataSource` | A DataSource which provides no data. |
| `https://developer.android.com/reference/androidx/media3/datasource/PriorityDataSource` | A `https://developer.android.com/reference/androidx/media3/datasource/DataSource` that can be used as part of a task registered with a `https://developer.android.com/reference/androidx/media3/common/PriorityTaskManager`. |
| `https://developer.android.com/reference/androidx/media3/datasource/ResolvingDataSource` | `https://developer.android.com/reference/androidx/media3/datasource/DataSource` wrapper allowing just-in-time resolution of `https://developer.android.com/reference/androidx/media3/datasource/DataSpec`. |
| `https://developer.android.com/reference/androidx/media3/datasource/StatsDataSource` | `https://developer.android.com/reference/androidx/media3/datasource/DataSource` wrapper which keeps track of bytes transferred, redirected uris, and response headers. |
| `https://developer.android.com/reference/androidx/media3/datasource/TeeDataSource` | Tees data into a `https://developer.android.com/reference/androidx/media3/datasource/DataSink` as the data is read. |

Known indirect subclasses [AssetDataSource](https://developer.android.com/reference/androidx/media3/datasource/AssetDataSource), [ByteArrayDataSource](https://developer.android.com/reference/androidx/media3/datasource/ByteArrayDataSource), [ContentDataSource](https://developer.android.com/reference/androidx/media3/datasource/ContentDataSource), [CronetDataSource](https://developer.android.com/reference/androidx/media3/datasource/cronet/CronetDataSource), [DataSchemeDataSource](https://developer.android.com/reference/androidx/media3/datasource/DataSchemeDataSource), [DefaultHttpDataSource](https://developer.android.com/reference/androidx/media3/datasource/DefaultHttpDataSource), [FakeDataSource](https://developer.android.com/reference/androidx/media3/test/utils/FakeDataSource), [FileDataSource](https://developer.android.com/reference/androidx/media3/datasource/FileDataSource), [FileDescriptorDataSource](https://developer.android.com/reference/androidx/media3/datasource/FileDescriptorDataSource), [HttpEngineDataSource](https://developer.android.com/reference/androidx/media3/datasource/HttpEngineDataSource), [KtorDataSource](https://developer.android.com/reference/androidx/media3/datasource/ktor/KtorDataSource), [MediaDataSourceAdapter](https://developer.android.com/reference/androidx/media3/datasource/MediaDataSourceAdapter), [OkHttpDataSource](https://developer.android.com/reference/androidx/media3/datasource/okhttp/OkHttpDataSource), [RawResourceDataSource](https://developer.android.com/reference/androidx/media3/datasource/RawResourceDataSource), [RtmpDataSource](https://developer.android.com/reference/androidx/media3/datasource/rtmp/RtmpDataSource), [UdpDataSource](https://developer.android.com/reference/androidx/media3/datasource/UdpDataSource)

|---|---|
| `https://developer.android.com/reference/androidx/media3/datasource/AssetDataSource` | A `https://developer.android.com/reference/androidx/media3/datasource/DataSource` for reading from a local asset. |
| `https://developer.android.com/reference/androidx/media3/datasource/ByteArrayDataSource` | A `https://developer.android.com/reference/androidx/media3/datasource/DataSource` for reading from a byte array. |
| `https://developer.android.com/reference/androidx/media3/datasource/ContentDataSource` | A `https://developer.android.com/reference/androidx/media3/datasource/DataSource` for reading from a content URI. |
| `https://developer.android.com/reference/androidx/media3/datasource/cronet/CronetDataSource` | DataSource without intermediate buffer based on Cronet API set using UrlRequest. |
| `https://developer.android.com/reference/androidx/media3/datasource/DataSchemeDataSource` | A `https://developer.android.com/reference/androidx/media3/datasource/DataSource` for reading data URLs, as defined by RFC 2397. |
| `https://developer.android.com/reference/androidx/media3/datasource/DefaultHttpDataSource` | An `https://developer.android.com/reference/androidx/media3/datasource/HttpDataSource` that uses Android's `https://developer.android.com/reference/java/net/HttpURLConnection.html`. |
| `https://developer.android.com/reference/androidx/media3/test/utils/FakeDataSource` | A fake `https://developer.android.com/reference/androidx/media3/datasource/DataSource` capable of simulating various scenarios. |
| `https://developer.android.com/reference/androidx/media3/datasource/FileDataSource` | A `https://developer.android.com/reference/androidx/media3/datasource/DataSource` for reading local files. |
| `https://developer.android.com/reference/androidx/media3/datasource/FileDescriptorDataSource` | A `https://developer.android.com/reference/androidx/media3/datasource/DataSource` for reading from a `https://developer.android.com/reference/java/io/FileDescriptor.html`. |
| `https://developer.android.com/reference/androidx/media3/datasource/HttpEngineDataSource` | DataSource without intermediate buffer based on `https://developer.android.com/reference/android/net/http/HttpEngine.html` set using `https://developer.android.com/reference/android/net/http/UrlRequest.html`. |
| `https://developer.android.com/reference/androidx/media3/datasource/ktor/KtorDataSource` | An `https://developer.android.com/reference/androidx/media3/datasource/HttpDataSource` that delegates to Ktor's `https://api.ktor.io/ktor-client-core/io.ktor.client/-http-client/index.html`. |
| `https://developer.android.com/reference/androidx/media3/datasource/MediaDataSourceAdapter` | A `https://developer.android.com/reference/androidx/media3/datasource/DataSource` for reading from a `https://developer.android.com/reference/android/media/MediaDataSource.html`. |
| `https://developer.android.com/reference/androidx/media3/datasource/okhttp/OkHttpDataSource` | An `https://developer.android.com/reference/androidx/media3/datasource/HttpDataSource` that delegates to Square's Call.Factory. |
| `https://developer.android.com/reference/androidx/media3/datasource/RawResourceDataSource` | A `https://developer.android.com/reference/androidx/media3/datasource/DataSource` for reading a raw resource. |
| `https://developer.android.com/reference/androidx/media3/datasource/rtmp/RtmpDataSource` | A Real-Time Messaging Protocol (RTMP) `https://developer.android.com/reference/androidx/media3/datasource/DataSource`. |
| `https://developer.android.com/reference/androidx/media3/datasource/UdpDataSource` | A UDP `https://developer.android.com/reference/androidx/media3/datasource/DataSource`. |

*** ** * ** ***

Reads data from URI-identified resources.

## Summary

| ### Nested types |
|---|
| `public interface https://developer.android.com/reference/androidx/media3/datasource/DataSource.Factory` A factory for `https://developer.android.com/reference/androidx/media3/datasource/DataSource` instances. |

| ### Public methods |
|---|---|
| `abstract void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/datasource/DataSource#addTransferListener(androidx.media3.datasource.TransferListener)(https://developer.android.com/reference/androidx/media3/datasource/TransferListener transferListener)` Adds a `https://developer.android.com/reference/androidx/media3/datasource/TransferListener` to listen to data transfers. |
| `abstract void` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/datasource/DataSource#close()()` Closes the source. |
| `default https://developer.android.com/reference/java/util/Map.html<https://developer.android.com/reference/java/lang/String.html, https://developer.android.com/reference/java/util/List.html<https://developer.android.com/reference/java/lang/String.html>>` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/datasource/DataSource#getResponseHeaders()()` When the source is open, returns the response headers associated with the last `https://developer.android.com/reference/androidx/media3/datasource/DataSource#open(androidx.media3.datasource.DataSpec)` call. |
| `abstract @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/android/net/Uri.html` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/datasource/DataSource#getUri()()` When the source is open, returns the `https://developer.android.com/reference/android/net/Uri.html` from which data is being read. |
| `abstract long` | `@https://developer.android.com/reference/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/androidx/media3/datasource/DataSource#open(androidx.media3.datasource.DataSpec)(https://developer.android.com/reference/androidx/media3/datasource/DataSpec dataSpec)` Opens the source to read the specified data. |

### Inherited methods

From [androidx.media3.common.DataReader](https://developer.android.com/reference/androidx/media3/common/DataReader) `abstract int` `https://developer.android.com/reference/androidx/media3/common/DataReader#read(byte[],int,int)(byte[] buffer, int offset, int length)`

Reads up to `length` bytes of data from the input.

## Public methods

### addTransferListener

```
@UnstableApi
abstract void addTransferListener(TransferListener transferListener)
```

Adds a `https://developer.android.com/reference/androidx/media3/datasource/TransferListener` to listen to data transfers. This method is not thread-safe.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/datasource/TransferListener transferListener` | A `https://developer.android.com/reference/androidx/media3/datasource/TransferListener`. |

### close

```
@UnstableApi
abstract void close()
```

Closes the source. This method must be called even if the corresponding call to `https://developer.android.com/reference/androidx/media3/datasource/DataSource#open(androidx.media3.datasource.DataSpec)` threw an `https://developer.android.com/reference/java/io/IOException.html`.

| Throws |
|---|---|
| `https://developer.android.com/reference/java/io/IOException.html` | If an error occurs closing the source. |

### getResponseHeaders

```
@UnstableApi
default Map<String, List<String>> getResponseHeaders()
```

When the source is open, returns the response headers associated with the last `https://developer.android.com/reference/androidx/media3/datasource/DataSource#open(androidx.media3.datasource.DataSpec)` call. Otherwise, returns an empty map.

Key look-up in the returned map is case-insensitive.

### getUri

```
@UnstableApi
abstract @Nullable Uri getUri()
```

When the source is open, returns the `https://developer.android.com/reference/android/net/Uri.html` from which data is being read. The returned `https://developer.android.com/reference/android/net/Uri.html` will be identical to the one passed `https://developer.android.com/reference/androidx/media3/datasource/DataSource#open(androidx.media3.datasource.DataSpec)` in the `https://developer.android.com/reference/androidx/media3/datasource/DataSpec` unless redirection has occurred. If redirection has occurred, the `https://developer.android.com/reference/android/net/Uri.html` after redirection is returned.

| Returns |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/android/net/Uri.html` | The `https://developer.android.com/reference/android/net/Uri.html` from which data is being read, or null if the source is not open. |

### open

```
@UnstableApi
abstract long open(DataSpec dataSpec)
```

Opens the source to read the specified data. If an `https://developer.android.com/reference/java/io/IOException.html` is thrown, callers must still call `https://developer.android.com/reference/androidx/media3/datasource/DataSource#close()` to ensure that any partial effects of the invocation are cleaned up.

The following edge case behaviors apply:

- If the `https://developer.android.com/reference/androidx/media3/datasource/DataSpec#position()` is within the resource, but the `https://developer.android.com/reference/androidx/media3/datasource/DataSpec#length()` extends beyond the end of the resource, then `https://developer.android.com/reference/androidx/media3/datasource/DataSource#open(androidx.media3.datasource.DataSpec)` will succeed and data from the requested position to the end of the resource will be made available through `https://developer.android.com/reference/androidx/media3/common/DataReader#read(byte[],int,int)`.
- If the `https://developer.android.com/reference/androidx/media3/datasource/DataSpec#position()` is equal to the length of the resource, then `https://developer.android.com/reference/androidx/media3/datasource/DataSource#open(androidx.media3.datasource.DataSpec)` will succeed, and `https://developer.android.com/reference/androidx/media3/common/DataReader#read(byte[],int,int)` will immediately return `https://developer.android.com/reference/androidx/media3/common/C#RESULT_END_OF_INPUT()`.
- If the `https://developer.android.com/reference/androidx/media3/datasource/DataSpec#position()` is greater than the length of the resource, then `https://developer.android.com/reference/androidx/media3/datasource/DataSource#open(androidx.media3.datasource.DataSpec)` will throw an `https://developer.android.com/reference/java/io/IOException.html` for which `https://developer.android.com/reference/androidx/media3/datasource/DataSourceException#isCausedByPositionOutOfRange(java.io.IOException)` will be `true`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/datasource/DataSpec dataSpec` | Defines the data to be read. |

| Returns |
|---|---|
| `long` | The number of bytes that can be read from the opened source. For unbounded requests (i.e., requests where `https://developer.android.com/reference/androidx/media3/datasource/DataSpec#length()` equals `https://developer.android.com/reference/androidx/media3/common/C#LENGTH_UNSET()`) this value is the resolved length of the request, or `https://developer.android.com/reference/androidx/media3/common/C#LENGTH_UNSET()` if the length is still unresolved. For all other requests, the value returned will be equal to the request's `https://developer.android.com/reference/androidx/media3/datasource/DataSpec#length()`. |

| Throws |
|---|---|
| `https://developer.android.com/reference/java/io/IOException.html` | If an error occurs opening the source. `https://developer.android.com/reference/androidx/media3/datasource/DataSourceException` can be thrown or used as a cause of the thrown exception to specify the reason of the error. |