2012-01-19 38 views
9

Tôi đã viết thành công một ứng dụng, based on this blog post, nhưng đơn giản hơn, luồng hình ảnh qua HTTP, sử dụng yêu cầu POST.Android: nhận kích thước tệp hình ảnh trước khi chia sẻ hình ảnh (Intent.ACTION_SEND)

Những gì tôi không thể tìm ra (sau khi tìm kiếm trên web và thu thập dữ liệu bên trong tài liệu SDK Android), làm cách nào để có được kích thước của hình ảnh trước khi tôi chia sẻ?

Chỉ có một khả năng để mở thêm một input stream mà tôi nhìn thấy trong exampkle và bất cứ nơi nào khác:

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

Các bài đăng blog cho ví dụ sử dụng getBytesFromFile(is), vì vậy người ta có thể có được kích thước đó, nhưng đây là không phải một giải pháp. Một số hình ảnh rất lớn, trong khi các ứng dụng Android bị giới hạn trong không gian heap. Tôi muốn ứng dụng của tôi hoạt động cho tất cả các kích thước hình ảnh có thể nghĩ (không phải là vấn đề khi chia sẻ qua Wifi).

Do đó, tùy chọn duy nhất cho tôi là "chuyển tiếp" luồng đầu vào đến một số luồng đầu ra HTTP, mà tôi làm và hoạt động. Nhưng cách tiếp cận này không cho tôi kích thước hình ảnh trước khi gửi nó.

Trả lời

0

Chỉ cần yêu cầu InputStream cho số byte khả dụng để có kích thước tệp.

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

Điều này làm việc khá đáng tin cậy một lần. Không biết nếu điều đó vẫn đúng như kết quả là không đảm bảo tài khoản cho tất cả các byte trong tập tin.

+0

Cảm ơn bạn, tôi sẽ cố gắng. –

+3

Theo http://developer.android.com/reference/java/io/InputStream.html: '" Trả lại số byte ước tính có thể đọc hoặc bỏ qua: mà không chặn nhiều đầu vào hơn. "' Vì vậy, rất có thể sẽ không nhận được kích thước tệp. – mbonnin

+0

Tôi biết .. nhưng tại thời điểm viết trong khi kiểm tra, nó luôn là kích thước của tệp. – flob

14

Bạn cũng có thể kiểm tra xem nó theo cách này:

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

Nguồn: https://developer.android.com/training/secure-file-sharing/retrieve-info.html

+0

Tôi đã sử dụng phương pháp này và vấn đề là kích thước tệp nhận được bằng mã này có thể sai – adi9090

+0

oh thực sự, tôi muốn biết khi nào điều này xảy ra nếu bạn có thể cung cấp bất kỳ chi tiết nào. – wrapperapps

+1

Đây là những gì tôi đã tìm thấy trong khi cố gắng giải quyết vấn đề này: https://code.google.com/p/android/issues/detail?id=68672 Điều này xảy ra với tôi trên một hình ảnh duy nhất trên Nexus 4 chạy Android 5.1 .1 và đã giải quyết nó bằng cách sử dụng 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(); 
      } 

     } 
    } 

}

Dưới đây là làm thế nào tôi cố định vấn đề của tôi tương tự như sau, điều này sẽ làm việc cho Android API bên dưới KITKAT.

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"; 
} 
Các vấn đề liên quan