Ich habe eine benutzerdefinierte Kamera-Implementierung in meinem Projekt. Es funktioniert gut, wenn ich die hintere Kamera des Geräts benutze. Bei der Aufnahme von Bildern mit der Frontkamera im Hoch- oder Querformat wird das Bild umgedreht. Im Querformat funktionieren beide Kameras einwandfrei.Das mit der vorderen Kamera aufgenommene Bild wird auf den Kopf gestellt
Ich habe SensorEventListener
und Berechnen den orientation
Wert in SensorChanged
Rückruf implementiert, um ExifInterface.TAG_ORIENTATION
in der aufgenommenen Datei zu setzen.
public void onSensorChanged(SensorEvent event) {
synchronized (this) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
if (event.values[0] < 4 && event.values[0] > -4) {
if (event.values[1] > 0 && orientation != ExifInterface.ORIENTATION_ROTATE_90) {
// UP
orientation = ExifInterface.ORIENTATION_ROTATE_90;
} else if (event.values[1] < 0 && orientation != ExifInterface.ORIENTATION_ROTATE_270) {
// UP SIDE DOWN
orientation = ExifInterface.ORIENTATION_ROTATE_270;
}
} else if (event.values[1] < 4 && event.values[1] > -4) {
if (event.values[0] > 0 && orientation != ExifInterface.ORIENTATION_NORMAL) {
// LEFT
orientation = ExifInterface.ORIENTATION_NORMAL;
} else if (event.values[0] < 0 && orientation != ExifInterface.ORIENTATION_ROTATE_180) {
// RIGHT
orientation = ExifInterface.ORIENTATION_ROTATE_180;
}
}
}
}
}
Der Grund, warum ich SensorEventListener
bin mit, weil ich Rotation Animation, die auf dem Bildschirm, um die Symbole am Hinzufügen, wenn der Benutzer den Bildschirm dreht. Hier ist meine PictureCallback
:
private Camera.PictureCallback mPictureCallBack = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
mCamera.stopPreview();
File pictureFile = new File(fileName);
try {
FileOutputStream purge = new FileOutputStream(pictureFile);
purge.write(data);
purge.close();
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
// Adding Exif data for the orientation.
try {
exif = new ExifInterface(fileName);
exif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + orientation);
exif.saveAttributes();
} catch (IOException e) {
e.printStackTrace();
}
}
};
Zum Debuggen, wenn ich exif.setAttribute()
den orientation
Wert ExifInterface.ORIENTATION_ROTATE_90
, falls es ist ExifInterface.ORIENTATION_ROTATE_270
und umgekehrt, es funktioniert gut. Meine Frage ist, was ist die beste und sicherste Sache, um dies zu beheben, so dass es am besten zu allen Geräten passt.
Note :
Ich benutze keine Bitmaps in diesem ganzen Prozess. Ich schreibe die data
in eine Datei und sende sie an eine andere Aktivität zurück, um das aufgenommene Bild anzuzeigen.
Jede Hilfe wird sehr geschätzt.