我成功编写了一个应用程序,based on this blog post,但更简单,它使用POST请求通过HTTP流式传输图像。
我无法弄清楚(在搜索网页并在Android SDK文档中抓取之后)是,在分享之前如何获取图片的大小?
我只能打开我在exampkle和其他任何地方看到的输入流:
ContentResolver cr = getContentResolver();
InputStream is = cr.openInputStream(uri);
给定的博客文章示例使用getBytesFromFile(is)
,因此可以获得大小,但这是不的解决方案。一些图像是巨大的,而Android应用程序在堆空间有限。我希望我的应用程序适用于所有可想象的图像尺寸(通过Wifi共享时不会出现问题)。
因此,对我来说唯一的选择是将输入流“转发”到某些HTTP输出流,我这样做,哪个有效。但是这种方法在发送之前不会给我图像大小。
答案 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();
这一次非常可靠。不知道是否仍然如此,因为结果不能保证计算文件中的所有字节。