【发布时间】:2012-10-12 06:18:39
【问题描述】:
我正在 android 中创建一个应用程序,用户只能在纵向模式下从前置摄像头拍照。我已经实现将相机视图固定为纵向,但是当拍摄照片时,它看起来是旋转的。最糟糕的是,不同手机的旋转方向不同,一种是右旋,另一种是左旋。
这是我的代码 sn-ps
确保活动仅以纵向播放
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
获取相机
@Override
public void onResume() {
super.onResume();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
Camera.CameraInfo info=new Camera.CameraInfo();
for (int i=0; i < Camera.getNumberOfCameras(); i++) {
Camera.getCameraInfo(i, info);
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
camera=Camera.open(i);
}
}
}
if (camera == null) {
camera=Camera.open();
}
}
旋转相机
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if(previewing){
camera.stopPreview();
previewing = false;
}
if (camera != null){
try {
camera.setPreviewDisplay(surfaceHolder);
camera.setDisplayOrientation(90);
initPreview(width, height);
startPreview();
previewing = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
拍照
PictureCallback myPictureCallback_JPG = new PictureCallback(){
@Override
public void onPictureTaken(byte[] data, Camera arg1) {
// new SavePhotoTask().execute(data);
Intent myIntent = new Intent(MainActivity.this, CropActivity.class);
Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data .length);
myIntent.putExtra("image", bitmap);
MainActivity.this.startActivity(myIntent);
}};
BMP 发送始终以旋转形式出现,但并不总是以 90 度显示。看起来 android 4.0 不仅会旋转,还会翻转图像。有没有什么好的方法可以检测并确保我总是得到正确的图片?
【问题讨论】:
-
只是一个建议:将位图直接附加到意图上并不是一个好习惯。这可能会导致 Java Binder Failed 错误。
-
我注意到在三星s2上使用相当于ICS 4.0.3的MIUI是前置摄像头的预览是一面镜子,图片还可以。我猜人们修头发只是在他们的爬行动物大脑中恢复到镜像模式。