わかりました、Android のこのバグはしばらく修正されないようです。ExifInformation を実装して、両方のデバイス (適切な Exif タグと不適切な exif タグを持つデバイス) が連携する方法を見つけましたが..
したがって、問題は一部の(新しい)デバイスにあり、適切に回転された画像がAndroidのデフォルトフォルダーに保存されている間に、適切なexifタグなしでアプリフォルダーに保存された写真を作成するバグがあります(そうすべきではありません)。 .
今私がしていることは、アプリからカメラアプリを起動している時間を記録することです。次に、アクティビティの結果について、メディア プロバイダーに問い合わせて、保存したこのタイムスタンプの後に画像が保存されているかどうかを確認します。つまり、ほとんどの場合、OS は適切に回転された画像を既定のフォルダーに保存し、もちろんメディア ストアにエントリを配置し、この行から回転情報を使用できます。正しい画像が表示されていることを確認するために、このファイルのサイズを、アクセスできるファイル (自分のアプリ フォルダーに保存されている) と比較します。
int rotation =-1;
long fileSize = new File(filePath).length();
Cursor mediaCursor = content.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] {MediaStore.Images.ImageColumns.ORIENTATION, MediaStore.MediaColumns.SIZE }, MediaStore.MediaColumns.DATE_ADDED + ">=?", new String[]{String.valueOf(captureTime/1000 - 1)}, MediaStore.MediaColumns.DATE_ADDED + " desc");
if (mediaCursor != null && captureTime != 0 && mediaCursor.getCount() !=0 ) {
while(mediaCursor.moveToNext()){
long size = mediaCursor.getLong(1);
//Extra check to make sure that we are getting the orientation from the proper file
if(size == fileSize){
rotation = mediaCursor.getInt(0);
break;
}
}
}
この時点での回転がまだ -1 の場合、これは適切な回転情報を持つ電話機の 1 つであることを意味します。この時点で、onActivityResult に返されるファイルで通常の exif 方向を使用できます。
else if(rotation == -1){
rotation = getExifOrientationAttribute(filePath);
}
この質問の答えのようなexifの向きを見つける方法を簡単に見つけることができますAndroidのカメラの向きの問題
また、ExifInterface は Api レベル 5 以降でしかサポートされていないことにも注意してください。したがって、2.0 より前の電話をサポートしたい場合は、Drew Noakes の厚意により Java 用に見つけたこの便利なライブラリを使用できます。http://www.drewnoakes.com/code/exif/
画像の回転を頑張ってください!
EDIT:聞かれたので使った意図と始め方はこんな感じでした
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//mediaFile is where the image will be saved
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mediaFile));
startActivityForResult(intent, 1);