インテント画像キャプチャを呼び出すときに、特定の Android デバイスで発生していたいくつかの問題を処理するために、カスタム カメラ アクティビティを作成しました。ユーザーは、イメージの保存を選択するか、 から返されたデータを使用することができますOnPictureTakenCallback
。
私が抱えている問題は、撮影された方向に関して画像を正しく表示することです。を呼び出して、アクティビティを強制的に縦向きに表示しますSetRequestedOrientation
。
ユーザーが写真を撮ったときのカメラの正しい向きを知るにはどうすればよいですか? つまり、ユーザーは 90 度回転して写真を撮ることができます (ポートレート)。
ウィンドウマネージャーのデフォルトディスプレイでを使用しようとしましたgetRotation()
が、要求された向きを縦向きに設定すると、 のみが返されますSurface.ROTATION_0
。
更新: 私の他の問題を明確にするためにbyte[]
、ユーザーが画像を保存しない場合、画像コールバックのデータだけから方向を特定するにはどうすればよいですか?
更新: このコードで以下の回答を試した後、得られるのは ExifInterface.ORIENTATION_NORMAL だけです。byte[]
また、カメラから返されたファイルを保存するようにコードを変更しました。データを持っているだけで方向を簡単に判断できる方法があるかどうかわからないからです。
private PictureCallback mPicture = new PictureCallback()
{
@Override
public void onPictureTaken(byte[] data, Camera camera)
{
File directory = new File(android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_PICTURES),
"MyApp");
if(!directory.exists())
{
if(!directory.mkdirs())
{
Log.d("CAMERA", "Unable to create directory to save photos.");
return;
}
}
File file = new File(directory.getPath() + file.separator + "IMG_" + SimpleDateFormat.getDateTimeInstance().toString() + ".jpg");
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.close();
ExifInterface exif = new ExifInterface(file.getCanonicalPath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
int rotate = 0;
switch (orientation)
{
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case default:
break;
}
}
};