Napisałem niestandardową czynność kamery, aby poradzić sobie z niektórymi problemami, które miałem z niektórymi urządzeniami z Androidem podczas wywoływania świadomego przechwytywania obrazu. Użytkownik może albo wybrać zapis obrazu, albo po prostu użyć danych zwróconych z poziomu OnPictureTakenCallback
.Problem z orientacją obrazu na Androida przy niestandardowej aktywności aparatu fotograficznego
Problem, który mam, to prawidłowe wyświetlanie obrazu w odniesieniu do jego orientacji. Zmuszam, aby działanie było wyświetlane portretowo, dzwoniąc pod numer SetRequestedOrientation
.
Jak rozpoznać prawidłową orientację, w jakiej znajdowała się kamera, gdy użytkownik wykonał zdjęcie? tj. Użytkownik może wykonać zdjęcie z obrotem 90 (portret).
Próbowałem użyć getRotation()
na domyślnym wyświetlaczu menedżera okien, ale z ustawieniem żądanej orientacji na portret, który zwraca tylko Surface.ROTATION_0
.
Aktualizacja: Aby wyjaśnić inny problem, w jaki sposób mogę określić orientację z tylko danych byte[]
w oddzwanianiu obrazu, jeśli użytkownik nie zapisał obrazu?
Aktualizacja: Po wypróbowaniu poniższych odpowiedzi z tym kodem, wszystko, co dostaję, to ExifInterface.ORIENTATION_NORMAL. Zmieniłem również mój kod, aby zapisać plik zwrócony z aparatu, ponieważ nie jestem pewien, czy istnieje łatwy sposób określenia orientacji za pomocą danych 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;
}
}
};
może ktoś pomóc http://stackoverflow.com/questions/28379130/how -to-set-camera-image-orientation –