2011-12-18 20 views
8

Tôi đang viết ứng dụng có thể được gửi URI ảnh từ trình đơn "Chia sẻ qua" trong Android.Cách sử dụng ExifInterface với luồng hoặc URI

Loại URI bạn nhận được là content://media/external/images/media/556 tuy nhiên ExifInterface muốn có tên tệp chuẩn. Vậy làm cách nào để đọc dữ liệu exif (tôi chỉ muốn định hướng) của tệp đó? Đây là mã (không hoạt động) của tôi:

Uri uri = (Uri)extras.getParcelable(Intent.EXTRA_STREAM); 
ContentResolver cr = getContentResolver(); 
InputStream is = cr.openInputStream(uri); 
Bitmap bm = BitmapFactory.decodeStream(is); 

// This line doesn't work: 
ExifInterface exif = new ExifInterface(uri.toString()); 
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 

Bất kỳ trợ giúp nào (ngoài "bạn phải viết lớp ExifInterface của riêng bạn") được đánh giá cao!

+0

bạn đã thử ExifInterface mới (uri.getPath()); ngoài ra, bạn có thể truy vấn uri nội dung để định hướng. –

Trả lời

16

Tôi tìm thấy câu trả lời ngẫu nhiên trong ví dụ về SDK Android của Android. Tôi đã không thử nghiệm nó, nhưng có vẻ như nó sẽ làm việc. Dưới đây là các mã:

public static int getOrientation(Context context, Uri photoUri) { 
    /* it's on the external media. */ 
    Cursor cursor = context.getContentResolver().query(photoUri, 
      new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); 

    int result = -1; 
    if (null != cursor) { 
     if (cursor.moveToFirst()) { 
      result = cursor.getInt(0); 
     } 
     cursor.close(); 
    } 

    return result; 
} 
+3

hello @timmmm, tôi đã mệt mỏi mã này, vì đã tìm ra hướng của hình ảnh bằng photouri. Nhưng con trỏ là ném ngoại lệ nullpointer có thể là nó không nhận được photouri. Bạn có thể đề xuất bất kỳ giải pháp cho nó. – Dory

+0

@timmmm trong mã ở trên bạn quên đóng con trỏ - đó là một rò rỉ bộ nhớ – GregoryK

+1

@Gregory Facebook quên! Cảm ơn bạn đã sửa mã. Btw đây là lý do tại sao bộ sưu tập rác là rác - bạn không thể sử dụng RAII. – Timmmm

0

Bạn có thể nhận được một ExifInterface sử dụng một chuỗi tên tập tin hoặc InputStream, bằng cách thực hiện nhập khẩu các ExifInterface hỗ trợ trong tập tin build.gradle của bạn:

compile 'com.android.support:exifinterface:26.1.0' 

thì:

private getExifInterfaceFromUri(Uri uri) throws IOException{ 
    FileInputStream fi = new FileInputStream(uri.getPath()); 

    return new ExifInterface(stream); 
} 

Hãy nhớ rằng trong Android có nhiều loại Uri và bạn có thể cần sử dụng Trình giải quyết nội dung và các cách tiếp cận khác để có được đường dẫn thực từ một Uri.

Các vấn đề liên quan