Android:在共享图像之前获取图像的文件大小(Intent.ACTION\u SEND)
我成功地编写了一个应用程序,但更简单,它使用POST请求通过HTTP传输图像 我不明白的是(在搜索网页并在android SDK文档中爬行之后),如何在共享之前获得图像的大小 只有打开我在Example和其他任何地方看到的输入流的可能性: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),因此可以在那里获得大小
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";
}