各位大神,我在开发一个拍照的应用,不知道什么地方出了问题,如果把手机横着拍照,可以拍出正常的照片;但是如果把手机竖着拍照,拍出的照片会向逆时针旋转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;  
        }  
    };  
}  摄像头手机

解决方案 »

  1.   

    http://asysbang.com/forum.php?mod=viewthread&tid=58&extra=page%3D1
      

  2.   

    获取一下当前拍照的方向,orientationeventlistener 好像是。
    然后通过android exif 接口讲 补充的角度值填写到 orientation 信息里面去
      

  3.   

    // 设置拍照后照片的方向
    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);
    }