# DefaultDataSource

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/DefaultDataSource.java+class:androidx.media3.datasource.DefaultDataSource)

*** ** * ** ***

<br />

```
class DefaultDataSource : DataSource
```

<br />

*** ** * ** ***

A `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSource` that supports multiple URI schemes. The supported schemes are:

- **`file`** : For fetching data from a local file (e.g. ` file:///path/to/media/media.mp4`, or just `/path/to/media/media.mp4` because the implementation assumes that a URI without a scheme is a local file URI).
- **`asset`** : For fetching data from an asset in the application's APK (e.g. ` asset:///media.mp4`).
- **`rawresource`** : For fetching data from a raw resource in the application's APK (e.g. `rawresource:///resourceId`, where `rawResourceId` is the integer identifier of the raw resource).
- **`android.resource`** : For fetching data in the application's APK (e.g. ` android.resource:///resourceId` or `android.resource://resourceType/resourceName`). See `https://developer.android.com/reference/kotlin/androidx/media3/datasource/RawResourceDataSource` for more information about the URI form.
- **`content`** : For fetching data from a content URI (e.g. ` content://authority/path/123`).
- **`rtmp`**: For fetching data over RTMP. Only supported if the project using ExoPlayer has an explicit dependency on ExoPlayer's RTMP extension.
- **`data`**: For parsing data inlined in the URI as defined in RFC 2397.
- **`udp`** : For fetching data over UDP (e.g. `udp://something.com/media`).
- **`http(s)`** : For fetching data over HTTP and HTTPS (e.g. ` https://www.something.com/media.mp4`), if constructed using `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource#DefaultDataSource(android.content.Context,java.lang.String,boolean)`, or any other schemes supported by a base data source if constructed using `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource#DefaultDataSource(android.content.Context,androidx.media3.datasource.DataSource)`.

## Summary

| ### Nested types |
|---|
| `class https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource.Factory : https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSource.Factory` `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSource.Factory` for `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource` instances. |

| ### Public constructors |
|---|
| `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource#DefaultDataSource(android.content.Context,boolean)(context: https://developer.android.com/reference/android/content/Context.html!, allowCrossProtocolRedirects: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html)` Constructs a new instance, optionally configured to follow cross-protocol redirects. |
| `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource#DefaultDataSource(android.content.Context,androidx.media3.datasource.DataSource)(context: https://developer.android.com/reference/android/content/Context.html!, baseDataSource: https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSource!)` Constructs a new instance that delegates to a provided `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSource` for URI schemes other than file, asset and content. |
| `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource#DefaultDataSource(android.content.Context,java.lang.String,boolean)( context: https://developer.android.com/reference/android/content/Context.html!, userAgent: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html?, allowCrossProtocolRedirects: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html )` Constructs a new instance, optionally configured to follow cross-protocol redirects. |
| `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource#DefaultDataSource(android.content.Context,java.lang.String,int,int,boolean)( context: https://developer.android.com/reference/android/content/Context.html!, userAgent: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html?, connectTimeoutMillis: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html, readTimeoutMillis: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html, allowCrossProtocolRedirects: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html )` Constructs a new instance, optionally configured to follow cross-protocol redirects. |

| ### Public functions |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource#addTransferListener(androidx.media3.datasource.TransferListener)(transferListener: https://developer.android.com/reference/kotlin/androidx/media3/datasource/TransferListener!)` Adds a `https://developer.android.com/reference/kotlin/androidx/media3/datasource/TransferListener` to listen to data transfers. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource#close()()` Closes the source. |
| `(https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-mutable-map/index.html)https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-map/index.html<https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html!, (https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-mutable-list/index.html)https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/-list/index.html<https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html!>!>!` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource#getResponseHeaders()()` When the source is open, returns the response headers associated with the last `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSource#open(androidx.media3.datasource.DataSpec)` call. |
| `https://developer.android.com/reference/android/net/Uri.html?` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource#getUri()()` When the source is open, returns the `https://developer.android.com/reference/android/net/Uri.html` from which data is being read. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource#open(androidx.media3.datasource.DataSpec)(dataSpec: https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSpec!)` Opens the source to read the specified data. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html` | `@https://developer.android.com/reference/kotlin/androidx/media3/common/util/UnstableApi https://developer.android.com/reference/kotlin/androidx/media3/datasource/DefaultDataSource#read(byte[],int,int)(buffer: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-byte-array/index.html<https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-byte/index.html>!, offset: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html, length: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html)` Reads up to `length` bytes of data from the input. |

## Public constructors

### DefaultDataSource

```
@UnstableApi
DefaultDataSource(context: Context!, allowCrossProtocolRedirects: Boolean)
```

Constructs a new instance, optionally configured to follow cross-protocol redirects.

| Parameters |
|---|---|
| `context: https://developer.android.com/reference/android/content/Context.html!` | A context. |
| `allowCrossProtocolRedirects: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | Whether to allow cross-protocol redirects. |

### DefaultDataSource

```
@UnstableApi
DefaultDataSource(context: Context!, baseDataSource: DataSource!)
```

Constructs a new instance that delegates to a provided `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSource` for URI schemes other than file, asset and content.

| Parameters |
|---|---|
| `context: https://developer.android.com/reference/android/content/Context.html!` | A context. |
| `baseDataSource: https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSource!` | A `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSource` to use for URI schemes other than file, asset and content. This `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSource` should normally support at least http(s). |

### DefaultDataSource

```
@UnstableApi
DefaultDataSource(
    context: Context!,
    userAgent: String?,
    allowCrossProtocolRedirects: Boolean
)
```

Constructs a new instance, optionally configured to follow cross-protocol redirects.

| Parameters |
|---|---|
| `context: https://developer.android.com/reference/android/content/Context.html!` | A context. |
| `userAgent: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html?` | The user agent that will be used when requesting remote data, or `null` to use the default user agent of the underlying platform. |
| `allowCrossProtocolRedirects: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | Whether cross-protocol redirects (i.e. redirects from HTTP to HTTPS and vice versa) are enabled when fetching remote data. |

### DefaultDataSource

```
@UnstableApi
DefaultDataSource(
    context: Context!,
    userAgent: String?,
    connectTimeoutMillis: Int,
    readTimeoutMillis: Int,
    allowCrossProtocolRedirects: Boolean
)
```

Constructs a new instance, optionally configured to follow cross-protocol redirects.

| Parameters |
|---|---|
| `context: https://developer.android.com/reference/android/content/Context.html!` | A context. |
| `userAgent: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-string/index.html?` | The user agent that will be used when requesting remote data, or `null` to use the default user agent of the underlying platform. |
| `connectTimeoutMillis: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html` | The connection timeout that should be used when requesting remote data, in milliseconds. A timeout of zero is interpreted as an infinite timeout. |
| `readTimeoutMillis: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html` | The read timeout that should be used when requesting remote data, in milliseconds. A timeout of zero is interpreted as an infinite timeout. |
| `allowCrossProtocolRedirects: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | Whether cross-protocol redirects (i.e. redirects from HTTP to HTTPS and vice versa) are enabled when fetching remote data. |

## Public functions

### addTransferListener

```
@UnstableApi
fun addTransferListener(transferListener: TransferListener!): Unit
```

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

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

### close

```
@UnstableApi
fun close(): Unit
```

Closes the source. This method must be called even if the corresponding call to `https://developer.android.com/reference/kotlin/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
fun getResponseHeaders(): (Mutable)Map<String!, (Mutable)List<String!>!>!
```

When the source is open, returns the response headers associated with the last `https://developer.android.com/reference/kotlin/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
fun getUri(): Uri?
```

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/kotlin/androidx/media3/datasource/DataSource#open(androidx.media3.datasource.DataSpec)` in the `https://developer.android.com/reference/kotlin/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/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
fun open(dataSpec: DataSpec!): Long
```

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/kotlin/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/kotlin/androidx/media3/datasource/DataSpec#position()` is within the resource, but the `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSpec#length()` extends beyond the end of the resource, then `https://developer.android.com/reference/kotlin/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/kotlin/androidx/media3/common/DataReader#read(byte[],int,int)`.
- If the `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSpec#position()` is equal to the length of the resource, then `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSource#open(androidx.media3.datasource.DataSpec)` will succeed, and `https://developer.android.com/reference/kotlin/androidx/media3/common/DataReader#read(byte[],int,int)` will immediately return `https://developer.android.com/reference/kotlin/androidx/media3/common/C#RESULT_END_OF_INPUT()`.
- If the `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSpec#position()` is greater than the length of the resource, then `https://developer.android.com/reference/kotlin/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/kotlin/androidx/media3/datasource/DataSourceException#isCausedByPositionOutOfRange(java.io.IOException)` will be `true`.

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

| Returns |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-long/index.html` | The number of bytes that can be read from the opened source. For unbounded requests (i.e., requests where `https://developer.android.com/reference/kotlin/androidx/media3/datasource/DataSpec#length()` equals `https://developer.android.com/reference/kotlin/androidx/media3/common/C#LENGTH_UNSET()`) this value is the resolved length of the request, or `https://developer.android.com/reference/kotlin/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/kotlin/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/kotlin/androidx/media3/datasource/DataSourceException` can be thrown or used as a cause of the thrown exception to specify the reason of the error. |

### read

```
@UnstableApi
fun read(buffer: ByteArray<Byte>!, offset: Int, length: Int): Int
```

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

If `readLength` is zero then 0 is returned. Otherwise, if no data is available because the end of the opened range has been reached, then `https://developer.android.com/reference/kotlin/androidx/media3/common/C#RESULT_END_OF_INPUT()` is returned. Otherwise, the call will block until at least one byte of data has been read and the number of bytes read is returned.

| Parameters |
|---|---|
| `buffer: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-byte-array/index.html<https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-byte/index.html>!` | A target array into which data should be written. |
| `offset: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html` | The offset into the target array at which to write. |
| `length: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html` | The maximum number of bytes to read from the input. |

| Returns |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-int/index.html` | The number of bytes read, or `https://developer.android.com/reference/kotlin/androidx/media3/common/C#RESULT_END_OF_INPUT()` if the input has ended. This may be less than `length` because the end of the input (or available data) was reached, the method was interrupted, or the operation was aborted early for another reason. |

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