Android-Bildausrichtungsproblem bei benutzerdefinierten Kameraaktivitäten
Ich habe eine benutzerdefinierte Kameraaktivität geschrieben, um einige Probleme zu lösen, die ich mit bestimmten Android-Geräten hatte, als ich Intent Image Capture anrief. Der Benutzer kann entweder Bild speichern auswählen oder nur die vom zurückgegebenen Daten verwendenOnPictureTakenCallback
.
Das Problem ist, dass das Bild in Bezug auf die Ausrichtung, in der es aufgenommen wurde, korrekt angezeigt wird. Ich erzwinge, dass die Aktivität im Porträt angezeigt wird, indem ich anrufeSetRequestedOrientation
.
Woher weiß ich, in welcher korrekten Ausrichtung sich die Kamera befand, als der Benutzer das Bild aufgenommen hat? d.h. der Benutzer könnte das Bild mit einer Drehung von 90 (Hochformat) aufnehmen.
Ich habe versucht, das zu benutzengetRotation()
auf der Standardanzeige des Fenstermanagers, aber mit der Einstellung der gewünschten Ausrichtung auf Hochformat, das nur zurückgibtSurface.ROTATION_0
.
Update: Um mein anderes Problem zu klären, wie könnte ich die Ausrichtung nur aus dem bestimmenbyte[]
Daten im Bild zurückrufen, wenn der Benutzer das Bild nicht speichern sollte?
Update: Nachdem ich die folgenden Antworten mit diesem Code ausprobiert habe, erhalte ich nur ExifInterface.ORIENTATION_NORMAL. Ich habe auch meinen Code geändert, um nur die von der Kamera zurückgegebene Datei zu speichern, da ich nicht sicher bin, ob es eine einfache Möglichkeit gibt, die Ausrichtung zu bestimmen, wenn ich nur die habebyte[]
Daten.
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;
}
}
};