2017-03-21 8 views
0

ExifInterfaceを取得しようとすると、Raw画像が検出されないというエラーメッセージが表示されます。ExifInterface_JNI:未加工画像が検出されないエラー

ExifInterface exifInterface = new ExifInterface(filepath); 
int rotation=exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_UNDEFINED); 

これを引き起こす可能性があるのは誰ですか?

+0

あなたはJNIに関するエラーメッセージを取得しているという事実あなたが[間違った 'ExifInterface'、厄介なセキュリティ脆弱性を持つもの](https://commonsware.com/blog/2016/09/08/dealing-exifinterface-security-flaw.html)を使っていることを示唆しています。 [Androidサポートライブラリのもの](https://commonsware.com/blog/2016/12/15/about-support-exifinterface.html)または[別の実装](https://commonsware.com)をご検討ください。 /blog/2016/05/31/tale-two-exifinterfaces.html)。それを超えて、 'filepath'の価値は何ですか?どこから取得しましたか? – CommonsWare

+0

@CommonsWare私はUriから取得していますが、ファイルパスが存在することがわかります。 ExifInterfaceの別のバージョンはどこで入手できますか?私はAndroidサポート-v4:25.3.0を使用していますが、これはExifInterfaceの実装がどこから来ているのかわかりません(私は比較的新しいアンドロイド開発です) –

答えて

2

私はウリからそれを取得していますが、私は、ファイルパスが

これらのステートメントは、相互に矛盾している存在を知っています。 Uriはファイルではありません。 の場合、Uriのスキームはfile,そしての場合はgetPath()を使用してファイルシステムのパスを取得できます。もしスキームがならばのように、例えばcontentのようなものなら、ファイルが存在する必要はないので、ファイルシステムのパスを得ることはできません。たとえば、Urihttp://stackoverflow.com/questions/42930509/exifinterface-jni-raw-image-not-detected-errorの場合、Androidデバイスのファイルが/questions/42930509/exifinterface-jni-raw-image-not-detected-errorになっているわけではありません。

ExifInterfaceからcom.android.support:exifinterface(たとえば最新のバージョンが25.3.0の場合)はa constructor that takes an InputStreamです。 ActivityのようにContextgetContentResolver()を介してContentResolverを作成します。そのContentResolveropenInputStream()に電話し、Urifilecontentの両方の方式に対応)を提供してください。そのInputStreamをライブラリのExifInterfaceコンストラクタに渡します。これにより、ユーザーにセキュリティ上の問題が発生しないことが保証されます。は、調べたいコンテンツのファイルシステムパスを取得する心配がありません。

+0

私はgetPath()を呼び出してUriから取得しています。また、ファイルオブジェクトを作成し、trueを返すファイルが存在するかどうかをテストします。 –

+0

私たちは19の最小SDKバージョンを持っているので、ExifInterface(InputStream)コンストラクタを使用することはできません。あなたはこれを回避する方法を知っていますか? –

+0

@ JohnKane: "ExifInterface(InputStream)コンストラクタを使用できません" - そうです。あなたは 'android.support.media.ExifInterface'(私の答えで参照したライブラリからのもの)で' android.media.ExifInterface'(**誰も**使用してはならないビルトインのもの)を混乱させています。 。あなたの 'dependencies'クロージャに' support-v4:25.3.0'の依存関係とともに 'compile 'com.support.android:exifinterface:25.3.0''を追加してください。次に、 'android.support.media.ExifInterface'を使います。 – CommonsWare

0

かいつまんで、あなたのコードに以下の例を適用します。

Uri uri = Uri.fromFile(f); 
// where f of type File 
in = context.getApplicationContext().getContentResolver().openInputStream(uri); 
// context should refer to your context app 
ExifInterface exifInterface = new ExifInterface(in); 
// you'll need "exifInterface" 

そして、あなたの入力ストリームを閉じることを忘れないでください

in.close(); 
関連する問題