Ich entwickle eine Kamera-Anwendung für Android API 16 bis 21, die Haupt- und einzigen Zweck ist, Porträt Foto zu nehmen. Ich kann Bilder mit mehreren Geräten aufnehmen (Nexus 4, Nexus 5, HTC ...) und sie korrekt ausrichten (das bedeutet, dass meine Vorschau dem aufgenommenen Bild in Größe und Ausrichtung entspricht).Android Kamera/Bildausrichtung Probleme mit Samsung Galaxy S3, S4, S5
Allerdings habe ich meine Anwendung auf mehreren anderen Geräten getestet und einige von ihnen geben mir viel Ärger: Samsung Galaxy S3/S4/S5.
Auf diesen drei Geräten wird die Vorschau korrekt angezeigt, jedoch sind die von der Methode onPictureTaken(final byte[] jpeg, Camera camera)
zurückgegebenen Bilder immer seitwärts.
Dies ist die Bitmap von byte[] jpeg
und angezeigt in der Image meines Benutzer erstellt, kurz bevor es auf die Festplatte zu speichern:
Und hier ist das Bild einmal gespeichert auf der Festplatte:
Wie Sie sehen können, wird das Bild in der Vorschau komplett gestreckt und nach dem Speichern auf der Festplatte falsch gedreht.
Hier ist meine CameraPreview Klasse (I verschleierte andere Methoden, da sie nichts mit Kameraparametern zu tun hatten):
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback
{
private SurfaceHolder surfaceHolder;
private Camera camera;
// Removed unnecessary code
public void surfaceCreated(SurfaceHolder holder)
{
camera.setPreviewDisplay(holder);
setCameraParameters();
camera.startPreview();
}
private void setCameraParameters()
{
Camera.Parameters parameters = camera.getParameters();
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(Camera.CameraInfo.CAMERA_FACING_BACK, info);
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(metrics);
int rotation = windowManager.getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation)
{
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int rotate = (info.orientation - degrees + 360) % 360;
parameters.setRotation(rotate);
// Save Parameters
camera.setDisplayOrientation(90);
camera.setParameters(parameters);
}
}
Wie kommt es genau dieses Stück Code für andere Geräte außer Samsung gearbeitet?
Ich habe versucht, Antworten auf die folgenden SO-Beiträge zu finden, aber nichts konnte mir bisher helfen: this one und this other one.
EDIT
Antwort Joey Chong Implementierung tut ändert nichts:
public void onPictureTaken(final byte[] data, Camera camera)
{
try
{
File pictureFile = new File(...);
Bitmap realImage = BitmapFactory.decodeByteArray(data, 0, data.length);
FileOutputStream fos = new FileOutputStream(pictureFile);
realImage.compress(Bitmap.CompressFormat.JPEG, 100, fos);
int orientation = -1;
ExifInterface exif = new ExifInterface(pictureFile.toString());
int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (exifOrientation)
{
case ExifInterface.ORIENTATION_ROTATE_270:
orientation = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
orientation = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
orientation = 90;
break;
case ExifInterface.ORIENTATION_NORMAL:
orientation = 0;
break;
default:
break;
}
fos.close();
}
Hier werden die EXIF-Ergebnisse sind ich für ein Arbeitsgerät erhalten:
- Orientierung: 0
Und hier die Ergebnisse für die S4:
- Orientierung: 0
möglich Duplikat [setRotation (90) Bild im Hochformat nehmen funktioniert nicht auf Samsung-Geräten] (http://stackoverflow.com/questions/11023696/setrotation90-to-take-picture-in- portrait-mode-does-not-work-on-samsung-device) –