2011-12-18 10 views
8

Piszę aplikację, w której można wysłać zdjęcie URI z menu "Udostępnij przez" w Androidzie.Jak korzystać z ExifInterface ze strumieniem lub identyfikatorem URI

Rodzaj odbieranego URI to content://media/external/images/media/556, jednak ExifInterface chce mieć standardową nazwę pliku. Jak więc odczytać dane exif (chcę tylko orientacji) tego pliku? Oto mój (bez pracy) Kod:

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

jakąkolwiek pomoc (inne niż „trzeba napisać własną klasę ExifInterface”) jest doceniana!

+0

czy wypróbowałeś nowy ExifInterface (uri.getPath()); również, możesz być w stanie zapytać o treść uri dla orientacji. –

Odpowiedz

16

Znalazłem odpowiedź losowo w przykładach Facebook SDK na Androida. Nie testowałem tego, ale wygląda na to, że powinno działać. Oto kod:

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, Zmęczony tym kodem, za znalezienie orientacji obrazu przy użyciu photouri. Ale kursor rzuca wyjątek nullpointer może być to, że nie dostaje fotouri. Czy możesz zaproponować jakieś rozwiązanie. – Dory

+0

@timmmm w powyższym kodzie zapomniałeś zamknąć kursor - to przeciek pamięci – GregoryK

+1

@Gregory Facebook zapomniałeś! Dzięki za naprawienie kodu. Przy okazji dlatego wywóz śmieci to śmieć - nie można korzystać z RAII. – Timmmm

0

można uzyskać ExifInterface użyciu ciąg nazwy pliku lub InputStream, wykonując importowania ExifInterface wsparcia w pliku build.gradle:

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

następnie:

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

    return new ExifInterface(stream); 
} 

Należy pamiętać, że w systemie Android istnieje wiele typów Uri i może zaistnieć potrzeba skorzystania z narzędzia Content Resolver i innych metod, aby uzyskać rzeczywistą ścieżkę z Uri.

Powiązane problemy