Камера Android в портретном режиме на SurfaceView
-
23-09-2019 - |
Вопрос
Я попробовал несколько способов заставить предварительный просмотр камеры отображаться в портретном режиме на SurfaceView
.Ничего не получалось.Я тестирую на дроиде, у которого есть 2.0.1.Я пытался:
1) принудительно сделать макет портретным с помощью: this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
2) использование
Camera.Parameters parameters = camera.getParameters();
parameters.set("orientation", "portrait");
parameters.setRotation(90);
camera.setParameters(parameters);
Есть ли что-то еще, что я могу попробовать?Если это ошибка в Android или телефоне, как я могу убедиться, что это так, чтобы у меня были доказательства для информирования клиента?
Спасибо, Прасанна
Нет правильного решения
Другие советы
Начиная с API lvl 8, это доступно:
public final void setDisplayOrientation (int градусы)
т. е.с переносом в манифесте:
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
mCamera.setDisplayOrientation(90);
у меня есть рабочее решение для портретного режима, работающее в версии 2.1 (тестировалось по желанию), возможно, меньше.
Ориентация экрана активности установлена на книжную.(android: ориентация экрана="портретная")
параметры камеры:
Камера.Параметры p = mCamera.getParameters();
p.set("jpeg-quality", 100);
p.set("orientation", "landscape");
p.set("rotation", 90);
p.setPictureFormat(PixelFormat.JPEG);
p.setPreviewSize(h, w);// here w h are reversed
mCamera.setParameters(p);
и изображение будет портретным.
Держатель поверхности, который вы используете для камеры, должен иметь размер, совместимый с размером предварительного просмотра телефона обычное разрешение экрана.
Забавно, что Desire 2.2 не работает...Вот как это исправить:
At surfaceCreated(..) or when you have this line
camera = Camera.open();
add
camera.setDisplayOrientation(90);//only 2.2>
Camera.Parameters p = camera.getParameters();
p.set("jpeg-quality", 100);
p.setRotation(90);
p.setPictureFormat(PixelFormat.JPEG);
p.setPreviewSize(h, w);
camera.setParameters(p);
Вы можете попробовать это (подходит для версии 2.2 или ниже).Здесь я поворачиваю изображение перед сохранением его на SD-карту.Но это только для портретного режима.Если вам пришлось сделать это для обоих режимов, то вам следует проверить ориентацию камеры и поставить некоторые галочки перед захватом изображения.
PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
FileOutputStream outStream = null;
try {
imageFilePath = getFilename();
InputStream is = new ByteArrayInputStream(data);
Bitmap bmp = BitmapFactory.decodeStream(is);
// Getting width & height of the given image.
if (bmp != null){
int w = bmp.getWidth();
int h = bmp.getHeight();
// Setting post rotate to 90
Matrix mtx = new Matrix();
mtx.postRotate(90);
// Rotating Bitmap
Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, w, h, mtx, true);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
rotatedBMP.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
outStream = new FileOutputStream
(String.format(imageFilePath,System.currentTimeMillis()));
outStream.write(byteArray);
outStream.close();
} else {
outStream = new FileOutputStream
(String.format(imageFilePath,System.currentTimeMillis()));
outStream.write(data);
outStream.close();
}
preview.camera.startPreview();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
};
На многих современных устройствах, включая G1 и Droid, это невозможно сделать.Взгляните на соответствующий отчет об ошибке здесь:
Также смотрите комментарий одного из инженеров Android (Dave) здесь:
Ссылка, которую Роман дал в теме проблемы, содержит работоспособное решение, которое я использую сейчас.
Найдите это здесь:http://code.google.com/p/android/issues/detail?id=1193#c26
Вам не нужно устанавливать какие-либо параметры для ориентации до тех пор, пока вам не понадобится сделать это явно.По умолчанию он поддерживает эту функцию.В моем случае у меня есть действие, и над этим действием у меня есть вид камеры, поэтому я не устанавливал никакой ориентации для свойств камеры, вместо этого для действия я установил ориентацию как книжную в файле манифеста.теперь приложение выглядит и работает хорошо.Может быть, это кому-то пригодится..
Спасибо.