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

jav*_*top 9 android share android-intent

基于这篇博文成功编写了一个应用程序,但更简单,它使用POST请求通过HTTP流式传输图像.

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

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

ContentResolver cr = getContentResolver();
InputStream is = cr.openInputStream(uri);
Run Code Online (Sandbox Code Playgroud)

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

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

wra*_*pps 17

您也可以这样检查:

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();
Run Code Online (Sandbox Code Playgroud)

资料来源:https: //developer.android.com/training/secure-file-sharing/retrieve-info.html

  • 这是我在尝试解决此问题时发现的:https://code.google.com/p/android/issues/detail?id=68672 这发生在我身上,在运行 Android 5.1.1 的 Nexus 4 上的单个图像上并使用 ParcelFileDescriptor 解决了它。 (2认同)

Abd*_*ail 5

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

        }
    }
Run Code Online (Sandbox Code Playgroud)

}

这是我修复与此类似的问题的方法,这适用于 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";
}
Run Code Online (Sandbox Code Playgroud)


flo*_*lob -2

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

ContentResolver cr = getContentResolver();
InputStream is = cr.openInputStream(uri);
int size = is.available();
Run Code Online (Sandbox Code Playgroud)

这曾经非常可靠。不知道这是否仍然成立,因为结果不能保证考虑到文件中的所有字节。

  • 根据http://developer.android.com/reference/java/io/InputStream.html:“返回可以读取或跳过的估计字节数:不会阻塞更多输入。”所以这很可能无法获取文件大小。 (4认同)