Мне нужно загрузить двоичный файл, входящий в apk, на сервер, используя okhttp. Используя urlconnection, вы можете просто получить входной поток в актив и затем поместить его в свой запрос. Однако okhttp дает вам возможность загружать байт-массивы, строки или файлы. Поскольку вы не можете получить путь к файлу для ресурса, входящего в apk, является единственной возможностью скопировать файл в локальный каталог файлов (я бы этого не сделал), а затем предоставить файл okhttp? Нет ли способа просто сделать запрос с использованием ресурса-источника непосредственно на веб-сервере?
EDIT: я использовал принятый ответ, но вместо создания статического класса утилиты я просто подклассифицировал RequestBody
public class InputStreamRequestBody extends RequestBody {
private InputStream inputStream;
private MediaType mediaType;
public static RequestBody create(final MediaType mediaType, final InputStream inputStream) {
return new InputStreamRequestBody(inputStream, mediaType);
}
private InputStreamRequestBody(InputStream inputStream, MediaType mediaType) {
this.inputStream = inputStream;
this.mediaType = mediaType;
}
@Override
public MediaType contentType() {
return mediaType;
}
@Override
public long contentLength() {
try {
return inputStream.available();
} catch (IOException e) {
return 0;
}
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
Source source = null;
try {
source = Okio.source(inputStream);
sink.writeAll(source);
} finally {
Util.closeQuietly(source);
}
}
}
Моя единственная проблема с этим подходом - ненадежность inputstream.available() для длины содержимого. Статический конструктор должен соответствовать внутренней реализации okhttp