Я пытаюсь выбрать любой тип файлов, например .pdf
или .doc
, и т. Д., А затем загрузить его на сервер с библиотекой retrofit
.Я могу выбирать изображения, видео и музыку из моих файлов и легко отправлять их на сервер.но в API 19 и выше, я не могу иметь прямой доступ к другим файлам!Я пробовал так:
private InputStream getInputStreamForVirtualFile(Uri uri, String mimeTypeFilter)
throws IOException {
ContentResolver resolver = getContentResolver();
String[] openableMimeTypes = resolver.getStreamTypes(uri, mimeTypeFilter);
if (openableMimeTypes == null || openableMimeTypes.length < 1) {
throw new FileNotFoundException();
}
return resolver
.openTypedAssetFileDescriptor(uri, openableMimeTypes[0], null)
.createInputStream();
}
этот код дает мне InputStream
файла и для отправки его на сервер с модификацией я решил создать копию своего файла, а затем использовать этот файл для отправки, мой код:
private File getFile(Uri uri) throws IOException {
String[] array = uri.getPath().split("/");
File x = new File(Environment.getExternalStorageDirectory()+ "/" + array[array.length - 1]);
FileOutputStream fileOutputStream = new FileOutputStream(x);
InputStream inputStream = getInputStreamForVirtualFile(uri, "*/*");
byte[] buffer = new byte[4096];
int n = 0;
while (-1 != (n = inputStream.read(buffer))) {
fileOutputStream.write(buffer, 0, n);
}
inputStream.close();
fileOutputStream.close();
return x;
}
Я еще не могу отправить его на сервер, но этот код в Android 8 дает мне нужный файл, но это Android 7, у меня есть эта ошибка:
The requested MIME type is not supported.
Мой вопрос: как правильно выбрать любой тип файла и отправить его на сервер с модификацией ?!
и если мой способ - это рациональный способ отправки любого типа файла, как я могу исправить это, чтобы он поддерживал все андроиды, такие как android 7, и исправлял мою ошибку!?