Почему не стоит передавать файл через Bundle

Ответ

Файлы не стоит передавать через Bundle, потому что Bundle предназначен для передачи небольших данных (примитивы, Parcelable, Serializable). Файлы могут быть большими, что вызовет TransactionTooLargeException.

Лучшие альтернативы:

  • Передавать URI файла через ContentProvider
  • Использовать временные файлы в кэше
  • Хранить файл в Application-классе (если это уместно)

Пример передачи URI:

val fileUri = FileProvider.getUriForFile(context, "com.example.fileprovider", file)
intent.putExtra("file_uri", fileUri)

Ответ 18+ 🔞

А, слушай, вот тут история про передачу файлов через Bundle — это просто ёперный театр какой-то. Ну представь себе: Bundle — это как маленькая сумочка, туда кидаешь ключи, телефон, пачку сигарет. А ты туда пытаешься запихнуть целый чемодан, да ещё и с колесиками! Что получится? Правильно, сука, молния разойдётся, и всё твоё барахло вывалится прямо на асфальт. В андроиде это называется TransactionTooLargeException — и это не предупреждение, а полный пиздец, приложение рухнет, и пользователь будет охуевать.

Почему? Да потому что Bundle — это для мелких штук: для цифр, строк, флагов. А файл — это овердохуища байтов. Система просто не пропустит эту хрень, у неё терпения ноль ебать на такие фокусы.

Так что, чувак, не будь распиздяем. Есть нормальные, рабочие способы, которые не заставят тебя потом рвать на себе волосы.

Вот что делать вместо этого:

  1. Передавай URI, а не сам файл. Это как дать человеку не целый склад, а только адрес и ключ от него. Используй FileProvider. Система сама разберётся с доступом, и в интенте будет лежать не гигабайтная хуйня, а аккуратненькая строка.

    val fileUri = FileProvider.getUriForFile(context, "com.example.fileprovider", file)
    intent.putExtra("file_uri", fileUri)
  2. Временные файлы в кэше. Скинул файл в специальное место (context.cacheDir), а в другом месте его прочитал. Главное — потом не забудь за собой убрать, а то засрёшь память пользователю. Подозрение ебать чувствую, что многие про это забывают.

  3. Храни в Application-классе. Если файл нужен в разных углах приложения и он не размером с фильм в 4K, можно запихнуть его в глобальное хранилище. Но это уже как ядерная кнопка — мощно, но если нажмёшь не туда, будет вам хиросима. Используй осторожно.

Короче, суть в чём: Bundle — не универсальная дура для всего подряд. Не пытайся протолкнуть в неё слона. Используй правильный инструмент, и не придётся потом ебать копать, разгребая логи крешей. Всё гениальное просто: передал URI и спокоен, как удав.