2011-12-18 1 views
8

Androidの[共有]メニューから写真URIを送信できるアプリを作成しています。ExifInterfaceをストリームまたはURIで使用する方法

入手するURIの種類はcontent://media/external/images/media/556ですが、ExifInterfaceには標準のファイル名が必要です。だから、どのように私はそのファイルのexifデータ(私はちょうど方向が欲しい)を読むのですか?

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

すべてのヘルプ(「あなたがあなた自身のExifInterfaceクラスを記述する必要があり」以外の)評価されて:ここに私の(非稼働)コードです!

+0

新しいExifInterface(uri.getPath())を試しましたか?また、オリエンテーションのためにコンテンツURIを照会することもできます。 –

答えて

16

FacebookのAndroid SDKの例でランダムに答えが見つかりました。私はそれをテストしていないが、それは動作するように見えます。ここでは、コードです:

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

こんにちは@timmmm、私はphotouriを使用して画像の向きを見つけるために、このコードを疲れました。しかし、カーソルがnullpointer例外を投げている可能性がありますphotouriを取得していません。あなたはそれに対して何か解決策を提案できますか? – Dory

+0

@timmmm上記のコードでカーソルを閉じるのを忘れました - それはメモリリークです – GregoryK

+1

@Gregory Facebookは忘れました!コードを修正していただきありがとうございます。 Btwこれはガベージコレクションがゴミである理由です。RAIIは使用できません。 – Timmmm

0

あなたのbuild.gradleファイルでサポートExifInterfaceをインポートすることにより、ファイル名の文字列またはInputStreamを使用してExifInterfaceを取得できます。

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

その後:

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

    return new ExifInterface(stream); 
} 

Androidでは複数のUriタイプがあり、Uriから実際のパスを取得するには、コンテンツリゾルバーやその他の方法を使用する必要があるかもしれないことに注意してください。

関連する問題