2016-10-19 13 views
2

Я делаю видео (а также фотографию), загружая на сервер с помощью HttpURLConnection.Получить длину данных из входного потока, открытого с помощью content-resolver

У меня есть видео в формате Uri. Я открыть InputStream так:

InputStream inputStream = context.getContentResolver().openInputStream(uri); 

Как Видеофайл довольно большой, я не могу буфер данных при записи его в OutputStream. Поэтому мне нужно использовать метод setFixedLengthStreamingMode (contentLength) HttpURLConnection. Но для этого требуется «contentLength». Вопрос в том, как получить длину видео?

Пожалуйста, не предлагайте получить путь к файлу. На некоторых устройствах он работает, но он часто терпит неудачу (особенно на Android 6). Говорят, что Uri не обязательно представляет файл.

Я также наткнулся на ситуации, когда после открытия галереи устройств (с Intent) я получаю Uri изображения, но я не пытаюсь получить путь к файлу. Поэтому я считаю, что это не хороший способ получить путь к файлу от Uri?

+0

вам не нужно ни в буфер видео целиком и не знать его длину заранее, чтобы загрузить его. Вы рассматривали эту возможность? – nandsito

+0

@nandsito, извините, не могли бы вы быть более ясными, пожалуйста? Я не понял, что вы говорите –

ответ

1

Попробуйте что-то вроде этого:

void uploadVideo() { 

    InputStream inputStream = context.getContentResolver().openInputStream(uri); 

    // Your connection. 
    HttpURLConnection connection; 

    // Do connection setup, setDoOutput etc. 

    // Be sure that the server is able to handle 
    // chunked transfer encoding. 
    connection.setChunkedStreamingMode(0); 

    OutputStream connectionOs = connection.getOutputStream(); 

    // Read and write a 4 KiB chunk a time. 
    byte[] buffer = new byte[4096]; 
    int bytesRead; 
    while ((bytesRead = inputStream.read(buffer)) != -1) { 
     connectionOs.write(buffer, 0, bytesRead); 
    } 

    // Close streams, do connection etc. 
} 

UPDATE: добавлена ​​setChunkedStreamingMode

+0

Это то, что я делал, и, как оказалось, HttpURLConnection буферизует все данные перед отправкой. Поэтому я получаю ошибку OOM в какой-то момент. –

+0

@ T.Vert обновленный ответ – nandsito

+0

Спасибо, мужик!) Это работает –

 Смежные вопросы

  • Нет связанных вопросов^_^