Android:在共享之前获取图像的文件大小(Intent.ACTION_SEND)

时间:2012-01-19 18:43:33

标签: android android-intent share

我成功编写了一个应用程序,based on this blog post,但更简单,它使用POST请求通过HTTP流式传输图像。

我无法弄清楚(在搜索网页并在Android SDK文档中抓取之后)是,在分享之前如何获取图片的大小?

我只能打开我在exampkle和其他任何地方看到的输入流:

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

给定的博客文章示例使用getBytesFromFile(is),因此可以获得大小,但这是的解决方案。一些图像是巨大的,而Android应用程序在堆空间有限。我希望我的应用程序适用于所有可想象的图像尺寸(通过Wifi共享时不会出现问题)。

因此,对我来说唯一的选择是将输入流“转发”到某些HTTP输出流,我这样做,哪个有效。但是这种方法在发送之前不会给我图像大小。

3 个答案:

答案 0 :(得分:16)

你也可以这样检查:

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

答案 1 :(得分:2)

@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();
            }

        }
    }

}

  

以下是我修复类似问题的方法,这适用于KITKAT下方的Android API。

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";
}

答案 2 :(得分:0)

只需向InputStream询问获取文件大小的可用字节数。

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

这一次非常可靠。不知道是否仍然如此,因为结果不能保证计算文件中的所有字节。