Quero definir a orientação da câmera de acordo com a orientação do dispositivo no Android, mas nada parece estar funcionando. Tentei girar a superfície e também os parâmetros da câmera, mas a visualização da câmera no modo retrato sempre fica de cabeça para baixo. Eu precisaria girá-lo 90 graus no sentido horário para que ficasse correto. Aqui está o código que estou usando agora, que funciona apenas no modo paisagem.
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
camera = null;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCamera();
}
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.2;
double targetRatio = (double) w / h;
if (sizes == null)
return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
// Try to find an size match aspect ratio and size
for (Size size : sizes) {
Log.d(TAG, "Checking size " + size.width + "w " + size.height
+ "h");
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
// Cannot find the one match the aspect ratio, ignore the
// requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters parameters = camera.getParameters();
List<Size> sizes = parameters.getSupportedPreviewSizes();
Size optimalSize = getOptimalPreviewSize(sizes, width, height);
Log.d(TAG, "Surface size is " + width + "w " + height + "h");
Log.d(TAG, "Optimal size is " + optimalSize.width + "w " + optimalSize.height + "h");
parameters.setPreviewSize(optimalSize.width, optimalSize.height);
// parameters.setPreviewSize(width, height);
camera.setParameters(parameters);
camera.startPreview();
}
};
android
camera
orientation
surfaceview
Abhinav
fonte
fonte
Respostas:
De outro membro e meu problema:
O problema de rotação da câmera depende de diferentes dispositivos e certas versões.
Versão 1.6: para corrigir o problema de rotação, e é bom para a maioria dos dispositivos
Versão 2.1: depende do tipo de dispositivo, por exemplo, não é possível corrigir o problema com XPeria X10, mas é bom para X8 e Mini
Versão 2.2: não para todos os dispositivos
http://code.google.com/p/android/issues/detail?id=1193#c42
fonte
Dos Javadocs para
setDisplayOrientation(int)
(requer API de nível 9):fonte
CameraInfo
não foi introduzida até a API de nível 9, então o método que postei requer a API de nível 9.result = (360 - result) % 360; // compensate the mirror
deve ser excluída , as fotos da câmera frontal são giradas incorretamenteEsta solução funcionará para todas as versões do Android. Você pode usar a reflexão em Java para fazê-lo funcionar em todos os dispositivos Android:
Basicamente, você deve criar um wrapper de reflexão para chamar o setDisplayOrientation do Android 2.2, em vez de chamar o método específico.
O método:
E em vez de usar camera.setDisplayOrientation (x), use setDisplayOrientation (camera, x) :
fonte
Camera.Parameters
. Tente adicionar a seguinte linha:Camera.Parameters p = camera.getParameters();
Eu enfrentei o problema quando estava usando o ZBar para digitalização em guias. Problema de orientação da câmera. Usando o código abaixo, consegui resolver o problema. Este não é o trecho de código inteiro, por favor, leve apenas ajuda disso.
fonte
Eu finalmente consertei isso usando o aplicativo de câmera do Google. Ele obtém a orientação do telefone usando um sensor e, em seguida, define a etiqueta EXIF de forma adequada. O JPEG que sai da câmera não é orientado automaticamente.
Além disso, a visualização da câmera funciona corretamente apenas no modo paisagem. Se você precisa que o layout da atividade seja orientado em retrato, você terá que fazer isso manualmente usando o valor do sensor de orientação.
fonte
Este problema foi resolvido há muito tempo, mas encontrei algumas dificuldades para juntar todas as peças, então aqui está a minha solução final, espero que ajude outras pessoas:
fonte
verifique esta solução
fonte