Android 设置正确的方向以预览相机和最终结果图像
我正在开发我的自定义相机应用程序,但我的方向有问题 当手机处于纵向时,预览屏幕和结果图像以横向显示 当手机处于左横向时,预览屏幕和结果图像将正确显示 当手机处于右横向时,预览屏幕和结果图像以横向模式显示,但垂直翻转 我读过有关使用setDisplayorientation更改方向的内容,但我还没有设法修复它 有人能帮我吗 谢谢你的帮助 这是启动预览的摄影机活动的代码Android 设置正确的方向以预览相机和最终结果图像,android,android-camera,Android,Android Camera,我正在开发我的自定义相机应用程序,但我的方向有问题 当手机处于纵向时,预览屏幕和结果图像以横向显示 当手机处于左横向时,预览屏幕和结果图像将正确显示 当手机处于右横向时,预览屏幕和结果图像以横向模式显示,但垂直翻转 我读过有关使用setDisplayorientation更改方向的内容,但我还没有设法修复它 有人能帮我吗 谢谢你的帮助 这是启动预览的摄影机活动的代码 @Override public void surfaceChanged(SurfaceHolder hol
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
System.out.println("!!!!!!!CAMBIO!!!!!!!!" );
initPreview(width, height);
startPreview();
}
private void initPreview(int width, int height) {
if (myCamera!=null && mySurfaceHolder.getSurface()!=null) {
try {
myCamera.setPreviewDisplay(mySurfaceHolder);
}
catch (Throwable t) {
Log.e("PreviewDemo-surfaceCallback",
"Exception in setPreviewDisplay()", t);
Toast
.makeText(CameraHandler.this, t.getMessage(), Toast.LENGTH_LONG)
.show();
}
if (!cameraConfigured) {
Camera.Parameters parameters=myCamera.getParameters();
Camera.Size size=getBestPreviewSize(width, height,
parameters);
if (size!=null) {
parameters.setPreviewSize(size.width, size.height);
myCamera.setParameters(parameters);
cameraConfigured=true;
}
}
}
}
private void startPreview() {
if (cameraConfigured && myCamera!=null) {
myCamera.startPreview();
inPreview=true;
}
}
private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {
Camera.Size result=null;
for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
System.out.println("Soportados " + size.width + "x" + size.height);
if (size.width<=width && size.height<=height) {
if (result==null) {
result=size;
}
else {
int resultArea=result.width*result.height;
int newArea=size.width*size.height;
if (newArea>resultArea) {
result=size;
}
}
}
}
return(result);
}
@覆盖
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
//TODO自动生成的方法存根
System.out.println(“!!!!!!!!!CAMBIO!!!!!!!”);
初始预览(宽度、高度);
startPreview();
}
私有void initPreview(整数宽度、整数高度){
if(myCamera!=null&&mySurfaceHolder.getSurface()!=null){
试一试{
myCamera.setPreviewDisplay(mySurfaceHolder);
}
捕获(可丢弃的t){
Log.e(“PreviewDemo surfaceCallback”,
“setPreviewDisplay()中的异常”,t);
干杯
.makeText(CameraHandler.this,t.getMessage(),Toast.LENGTH\u LONG)
.show();
}
如果(!cameraConfigured){
Camera.Parameters=myCamera.getParameters();
Camera.Size Size=getBestPreviewSize(宽度、高度、,
参数);
如果(大小!=null){
parameters.setPreviewSize(size.width、size.height);
myCamera.setParameters(参数);
cameraConfigured=true;
}
}
}
}
私有void startPreview(){
if(cameraConfigured&&myCamera!=null){
myCamera.startPreview();
inPreview=true;
}
}
私人相机。大小getBestPreviewSize(整数宽度、整数高度、相机。参数){
Camera.Size结果=null;
对于(Camera.Size:parameters.getSupportedPreviewSizes()){
System.out.println(“Soportados”+大小.宽度+“x”+大小.高度);
如果(size.width样本代码在主文档中:
如果要使摄影机图像以与相同的方向显示
显示时,可以使用以下代码
从API级别14开始,预览时可以调用此方法
它是活动的
这不适用于使用捕获的图片。为此,您可以使用。不幸的是,一些设备仅根据此设置EXIF旋转标志,更不幸的是,一些流行的图像查看器忽略了此标志。在这种情况下,您必须自己旋转生成的JPEG。为此,您可以使用Java库,请参阅e.g..f或者语法错误。关于方向,我也有同样的问题。我在帖子中发布了我的解决方案。请检查它将帮助您设置方向。我解决了它,setRotation
必须在setDisplayOrientation
之后执行。谢谢
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().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 result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}