2012-01-19 161 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"; 
}