获取内容解析器打开的输入流中的数据长度

时间:2016-10-19 14:58:13

标签: inputstream httpurlconnection android-contentresolver

我正在使用HttpURLConnection上传到服务器的视频(以及照片)。

我有一个视频的Uri。我这样打开一个InputStream:

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

由于视频文件非常大,我在将数据写入outputStream时无法缓冲数据。所以我需要使用HttpURLConnection的setFixedLengthStreamingMode(contentLength)方法。但它需要“contentLength”。 问题是,如何获得视频的长度?

请不要建议获取文件路径。在某些设备上它可以工作,但它经常失败(特别是在Android 6上)。他们说Uri不一定代表文件。

我也偶然发现在打开设备库(使用Intent)后我收到了一张图片的Uri,但是我没有尝试从中获取文件路径。所以我认为从Uri获取文件路径不是一个好方法吗?

1 个答案:

答案 0 :(得分: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.
}

更新:添加了setChunkedStreamingMode