Android: получение размера файла перед его совместным использованием (Intent.ACTION_SEND)

Я успешно написал приложение, основанное на этом сообщении в блоге , но более простое, которое передает изображение через HTTP, используя запрос POST.

То, что я не могу понять (после поиска в Интернете и обхода в документах SDK для Android), как я могу получить размер изображения, прежде чем поделиться им?

Существует только возможность открыть входной поток, который я вижу на экзамене и в другом месте:

ContentResolver cr = getContentResolver(); InputStream is = cr.openInputStream(uri); 

В приведенном примере блога используется getBytesFromFile(is) , поэтому можно получить размер там, но это не решение. Некоторые изображения огромны, а приложения для Android ограничены в кучном пространстве. Я хочу, чтобы мое приложение работало на все мыслимые размеры изображений (не проблема при совместном использовании Wi-Fi).

Поэтому единственным вариантом для меня является «пересылка» входного потока в некоторый поток вывода HTTP, который я делаю и который работает. Но этот подход не дает мне размер изображения перед его отправкой.

Solutions Collecting From Web of "Android: получение размера файла перед его совместным использованием (Intent.ACTION_SEND)"

Вы также можете проверить это так:

 Uri fileUri = resultData.getData(); Cursor cursor = getActivity().getContentResolver().query(fileUri, null, null, null, null); cursor.moveToFirst(); long size = cursor.getLong(cursor.getColumnIndex(OpenableColumns.SIZE)); cursor.close(); 

Источник: https://developer.android.com/training/secure-file-sharing/retrieve-info.html

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == 9991) { if (data == null) { //no data present return; } ContentResolver cr = getContentResolver(); InputStream is = null; File file = new File(fileUri.getPath()); try { is = cr.openInputStream(fileUri); cr.getType(fileUri); int size = is.available(); Log.d(TAG, "Size 151: " + getFileSize(size)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 

}

Вот как я исправил свою проблему, подобную этой, это будет работать для Android API ниже KITKAT.

 private static final DecimalFormat format = new DecimalFormat("#.##"); private static final long MiB = 1024 * 1024; private static final long KiB = 1024; public String getFileSize(long file) { final double length = Double.parseDouble(String.valueOf(file)); if (length > MiB) { return format.format(length / MiB) + " MiB"; } if (length > KiB) { return format.format(length / KiB) + " KiB"; } return format.format(length) + " B"; } 

Просто спросите InputStream о количестве доступных байтов, чтобы получить размер файла.

 ContentResolver cr = getContentResolver(); InputStream is = cr.openInputStream(uri); int size = is.available(); 

Это работало достаточно надежно. Не знаю, сохраняется ли это так, поскольку в результате не гарантируется учет всех байтов в файле.