Android: получение размера файла изображения перед отправкой (Intent.ACTION_SEND) - PullRequest
9 голосов
/ 19 января 2012

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

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

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

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

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

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

Ответы [ 3 ]

16 голосов
/ 29 мая 2015

Вы также можете проверить это следующим образом:

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

2 голосов
/ 28 июня 2017
@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";
}
0 голосов
/ 04 февраля 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...