Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:在共享图像之前获取图像的文件大小(Intent.ACTION\u SEND)_Android_Android Intent_Share - Fatal编程技术网

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

Android:在共享图像之前获取图像的文件大小(Intent.ACTION\u SEND),android,android-intent,share,Android,Android Intent,Share,我成功地编写了一个应用程序,但更简单,它使用POST请求通过HTTP传输图像 我不明白的是(在搜索网页并在android SDK文档中爬行之后),如何在共享之前获得图像的大小 只有打开我在Example和其他任何地方看到的输入流的可能性: ContentResolver cr = getContentResolver(); InputStream is = cr.openInputStream(uri); 给定的博客文章示例使用了getBytesFromFile(is),因此可以在那里获得大小

我成功地编写了一个应用程序,但更简单,它使用POST请求通过HTTP传输图像

我不明白的是(在搜索网页并在android SDK文档中爬行之后),如何在共享之前获得图像的大小

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

ContentResolver cr = getContentResolver();
InputStream is = cr.openInputStream(uri);
给定的博客文章示例使用了
getBytesFromFile(is)
,因此可以在那里获得大小,但这不是一个解决方案。有些图像很大,而android应用程序的堆空间有限。我希望我的应用程序能适用于所有可想象大小的图像(在Wifi上共享时不是问题)


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

只需向InputStream查询可用字节数即可获得文件大小

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

这曾经相当可靠。不知道这是否仍然成立,因为结果不能保证包含文件中的所有字节。

您也可以通过以下方式进行检查:

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();
资料来源:

}

下面是我如何解决类似的问题,这将适用于KITKAT下面的Android API


根据:
“返回可读取或跳过的估计字节数:无需阻止更多输入。”
,因此很可能无法获得文件大小。我知道。。但是在我编写测试时,总是文件的大小。我使用了这个方法,问题是使用这个代码得到的文件大小可能是错误的哦,真的,我很想知道这是什么时候发生的,如果你能提供任何细节的话。这是我在试图解决这个问题时发现的:这发生在运行Android 5.1.1的Nexus 4上的一张图片上,我已经用ParcelFileDescriptor解决了这个问题。
@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();
            }

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