各位大神,我在开发一个拍照的应用,不知道什么地方出了问题,如果把手机横着拍照,可以拍出正常的照片;但是如果把手机竖着拍照,拍出的照片会向逆时针旋转90度,也就是横着的。下面是我们的代码,为了使预览的照片是正的,我用了camera.setDisplayOrientation(90)。哪位大神帮忙指点一下,多谢了!public class CameraActivity extends Activity{
private final static String TAG = "CameraActivity";
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Camera camera;
private File picture;
private View takePicBtn;
private View backspaceBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 用于设置横竖屏,sensor是指根据sensor设置
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.camera);
setupViews();
}
private void setupViews(){
surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // Camera interface to instantiate components
surfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate components
surfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHolder
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
takePicBtn = this.findViewById(R.id.takepic);
backspaceBtn = this.findViewById(R.id.backspace);
takePicBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
takePic();
}
});
backspaceBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(CameraActivity.this, PhotoshareActivity.class);
startActivity(i);
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_CAMERA
|| keyCode == KeyEvent.KEYCODE_SEARCH) {
takePic();
return true;
}
return super.onKeyDown(keyCode, event);
}
private void takePic() {
camera.stopPreview();// stop the preview
camera.takePicture(null, null, pictureCallback); // picture
}
// Photo call back
Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
//@Override
public void onPictureTaken(byte[] data, Camera camera) {
new SavePictureTask().execute(data);
camera.startPreview();
}
};
// save pic
class SavePictureTask extends AsyncTask<byte[], String, String> {
@Override
protected String doInBackground(byte[]... params) {
String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString()+".jpg";
Log.i(TAG, "fname="+fname+";dir="+Environment.getExternalStorageDirectory());
picture = new File(Environment.getExternalStorageDirectory() + "/PhotoshareStore/" + fname);
try {
FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output stream
fos.write(params[0]); // Written to the file
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
// SurfaceHodler Callback handle to open the camera, off camera and photo size changes
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCallback====");
camera = Camera.open(); // Turn on the camera
try {
camera.setPreviewDisplay(holder); // Set Preview
} catch (IOException e) {
camera.release();// release camera
camera = null;
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.i(TAG,"====surfaceChanged");
Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtain
parameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format
Log.i(TAG,"getSceneMode: " + parameters.getSceneMode());
parameters.setSceneMode("portrait");
camera.setDisplayOrientation(90);
camera.setParameters(parameters); // Setting camera parameters
camera.startPreview(); // Start Preview
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG,"====surfaceDestroyed");
camera.stopPreview();// stop preview
camera.release(); // Release camera resources
camera = null;
}
};
} 摄像头手机
private final static String TAG = "CameraActivity";
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Camera camera;
private File picture;
private View takePicBtn;
private View backspaceBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 用于设置横竖屏,sensor是指根据sensor设置
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.camera);
setupViews();
}
private void setupViews(){
surfaceView = (SurfaceView) findViewById(R.id.camera_preview); // Camera interface to instantiate components
surfaceHolder = surfaceView.getHolder(); // Camera interface to instantiate components
surfaceHolder.addCallback(surfaceCallback); // Add a callback for the SurfaceHolder
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
takePicBtn = this.findViewById(R.id.takepic);
backspaceBtn = this.findViewById(R.id.backspace);
takePicBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
takePic();
}
});
backspaceBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(CameraActivity.this, PhotoshareActivity.class);
startActivity(i);
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_CAMERA
|| keyCode == KeyEvent.KEYCODE_SEARCH) {
takePic();
return true;
}
return super.onKeyDown(keyCode, event);
}
private void takePic() {
camera.stopPreview();// stop the preview
camera.takePicture(null, null, pictureCallback); // picture
}
// Photo call back
Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
//@Override
public void onPictureTaken(byte[] data, Camera camera) {
new SavePictureTask().execute(data);
camera.startPreview();
}
};
// save pic
class SavePictureTask extends AsyncTask<byte[], String, String> {
@Override
protected String doInBackground(byte[]... params) {
String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString()+".jpg";
Log.i(TAG, "fname="+fname+";dir="+Environment.getExternalStorageDirectory());
picture = new File(Environment.getExternalStorageDirectory() + "/PhotoshareStore/" + fname);
try {
FileOutputStream fos = new FileOutputStream(picture.getPath()); // Get file output stream
fos.write(params[0]); // Written to the file
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
// SurfaceHodler Callback handle to open the camera, off camera and photo size changes
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "surfaceCallback====");
camera = Camera.open(); // Turn on the camera
try {
camera.setPreviewDisplay(holder); // Set Preview
} catch (IOException e) {
camera.release();// release camera
camera = null;
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.i(TAG,"====surfaceChanged");
Camera.Parameters parameters = camera.getParameters(); // Camera parameters to obtain
parameters.setPictureFormat(PixelFormat.JPEG);// Setting Picture Format
Log.i(TAG,"getSceneMode: " + parameters.getSceneMode());
parameters.setSceneMode("portrait");
camera.setDisplayOrientation(90);
camera.setParameters(parameters); // Setting camera parameters
camera.startPreview(); // Start Preview
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i(TAG,"====surfaceDestroyed");
camera.stopPreview();// stop preview
camera.release(); // Release camera resources
camera = null;
}
};
} 摄像头手机
然后通过android exif 接口讲 补充的角度值填写到 orientation 信息里面去
public void cameraSetRotation() {
int rotation = this.getWindowManager().getDefaultDisplay().getRotation();
//Log.i(TAG, "rotation: " + rotation);
int degrees = 0;
switch (rotation) {
case 0:
degrees = 90;
break;
case 1:
degrees = 0;
break;
case 2:
degrees = 270;
break;
case 3:
degrees = 180;
break;
}
Camera.Parameters parameters = camera.getParameters();
parameters.set("rotation", degrees);
camera.setParameters(parameters);
}