Как отправить большой файл(аудио или видео) на сервер с android приложения правильно?
Взрослые разработчики используют заголовки. Никто не ограничивает вас в использовании заголовка Content-Range в запросе. 

Прошу прощения, позволю себе использовать синтаксис httpie.

POST "/upload/" 
Content-Type:[MEDIA_TYPE] 
Content-MD5:[BASE64_MD5_FILE] 
Content-Range: bytes [FROM_BYTES]-[TO_BYTES]/[FILE_SIZE] 
file@file.ext

Один эндпойнт. Без бойлерплейта из трех разных запросов. 
bytes 0-? : создаёт файл, рекомендовал бы создавать с именем md5;
bytes ? -? : запись в файл
bytes ? - total_size : запись в файл, проверка контрольной суммы, переименование. 

Размер чанка = ширина канала >> 1
Реализуете следующие api
/api/continuousupload - принимает  multipart/form-data
/api/continuousuploadcreate - создает длительную закачку на сервере
/api/continuousuploadinfo - отдает информацию по чанку
На клиенте
1.  /api/continuousuploadcreate - создаете закачку сервер возвращает id
2. бьете файл на чанки пусть по 2 мегабайта отправляете через /api/continuousupload
3. сервер в мета файле записывает позицию указатель и записывает поток байт принятый от /api/continuousupload
4. При обрыве связи сервер отдает точно записанные данные через  /api/continuousuploadinfo клиент  передает чанк начиная с позиции
Соответственно и на сервере и на клиенте нужно вычислять контрольные суммы при передаче.