2012-01-19 111 views
9

我成功地编写了一个应用程序,based on this blog post,但更简单,它使用POST请求通过HTTP流式传输图像。Android:在分享之前获取图像的文件大小(Intent.ACTION_SEND)

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

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

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

给出的博客文章示例使用getBytesFromFile(is),所以一个能得到有大小,但是这是不是的解决方案。一些图像是巨大的,而android应用程序在堆空间中是有限的。我希望我的应用能够处理所有可能的图像大小(在通过Wifi共享时不会出现问题)。

因此,我唯一的选择是将输入流“转发”到某个HTTP输出流,这是我的工作,也是工作的。但是这种方法在发送之前不会给我图像的大小。

回答

0

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

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

这工作相当可靠一次。不知道这是否仍然适用,因为结果不能保证记录文件中的所有字节。

+0

谢谢,我会努力。 –

+3

根据http://developer.android.com/reference/java/io/InputStream.html:'“返回可读取或跳过的字节的估计数量:不会阻塞更多输入。”' 因此,很可能不会获得文件大小。 – mbonnin

+0

我知道..但在写作时,我的测试中始终是文件的大小。 – flob

14

你也可以检查一下这种方式:

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

+0

我已经使用过这种方法,问题是使用此代码的文件大小可能是错误的 – adi9090

+0

哦,真的,如果您能提供任何细节,我很想知道这种情况何时发生。 – wrapperapps

+1

这是我在尝试解决此问题时发现的:https://code.google.com/p/android/issues/detail?id=68672 这发生在运行Android 5.1的Nexus 4上的单个图像上.1并使用ParcelFileDescriptor解决了它。 – adi9090

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