# `Mob.Storage.Android`
[🔗](https://github.com/genericjam/mob/blob/main/lib/mob/storage/android.ex#L1)

Android-specific storage locations and MediaStore integration.

## External files directory

`external_files_dir/1` returns the app's scoped directory on external
storage (`getExternalFilesDir`). This is visible to the user via a file
manager or USB, but scoped to the app — no `WRITE_EXTERNAL_STORAGE`
permission required. Returns `nil` if external storage is unavailable.

Common type atoms: `:documents`, `:pictures`, `:movies`, `:music`,
`:downloads`, `:dcim`. Maps to `Environment.DIRECTORY_*` constants.

## MediaStore

`save_to_media_store/3` inserts a file into the Android media library
so it appears in the Gallery, Music, or Files app. It is asynchronous —
the result arrives via `handle_info`:

    handle_info({:storage, :saved_to_library, path}, socket)
    handle_info({:storage, :error, :save_to_library, reason}, socket)

`type` is `:image`, `:video`, or `:audio`. On API 29+ no permission is
needed for files the app created. On API 28 and below,
`WRITE_EXTERNAL_STORAGE` is required — add it via:

    mix mob.enable media_store

# `external_files_dir`

```elixir
@spec external_files_dir(atom()) :: String.t() | nil
```

Return the app's scoped external storage directory for `type`.

Returns `nil` if external storage is not available on this device.

# `save_to_media_store`

```elixir
@spec save_to_media_store(Mob.Socket.t(), String.t(), atom()) :: Mob.Socket.t()
```

Save a file to the MediaStore so it appears in the system Gallery,
Music, or Files app.

`type` is `:image`, `:video`, or `:audio`. Defaults to `:auto`, which
infers the type from the file extension.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
