Android的形象定位问题与自定义相机活动(Android image orientation i

2019-06-26 13:33发布

我写了一个定制相机的活动来处理调用的意图拍摄时我一直有与某些Android设备的一些问题。 用户能够或者选择保存图像或只使用返回的数据从后面OnPictureTakenCallback

我遇到的问题是相对于它采取的正确方向显示图像。 我强迫通过调用显示在人像活动SetRequestedOrientation

我怎么知道正确取向的相机是当用户拿着照片吗? 即,用户可能需要在90(肖像)的旋转的图像。

我试着去使用getRotation()的窗口管理器的默认显示上,但设置请求的方向为纵向,只有返回Surface.ROTATION_0

更新:为了澄清我的其他问题,我怎么能确定正好从方位byte[]中如果用户不保存图像画面回调数据?

更新:此代码尝试下面的答案,毕竟我得到的是ExifInterface.ORIENTATION_NORMAL。 我也改变了我的代码,以只保存在相机返回我不知道有一个简单的方法来确定只具有定向文件byte[]数据。

    private PictureCallback mPicture = new PictureCallback() 
    {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) 
        {
            File directory = new File(android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_PICTURES),
                    "MyApp");
            if(!directory.exists())
            {
                if(!directory.mkdirs())
                {
                    Log.d("CAMERA", "Unable to create directory to save photos.");
                    return;
                }
            }
            File file = new File(directory.getPath() + file.separator + "IMG_" + SimpleDateFormat.getDateTimeInstance().toString() + ".jpg");
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(data);
            fos.close();
            ExifInterface exif = new ExifInterface(file.getCanonicalPath());
            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
            int rotate = 0;

            switch (orientation) 
            {
                case ExifInterface.ORIENTATION_ROTATE_90:
                   rotate = 90;
                   break; 
                case ExifInterface.ORIENTATION_ROTATE_180:
                   rotate = 180;
                   break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                   rotate = 270;
                   break;
                case default:
                   break;
             }
        }
    };

Answer 1:

所以,你正面临着相机的方位一些问题。

此链接显示一个简单的摄像头采集活动的一个示例应用程序: http://labs.makemachine.net/2010/03/simple-android-photo-capture/

也许你应该尝试做这样的事情固定方向:

          ExifInterface exif = new ExifInterface(_path);
          int exifOrientation = exif.getAttributeInt(
          ExifInterface.TAG_ORIENTATION,
          ExifInterface.ORIENTATION_NORMAL);

          int rotate = 0;

          switch (exifOrientation) {
          case ExifInterface.ORIENTATION_ROTATE_90:
          rotate = 90;
          break; 

         case ExifInterface.ORIENTATION_ROTATE_180:
         rotate = 180;
         break;

         case ExifInterface.ORIENTATION_ROTATE_270:
         rotate = 270;
         break;
         }

           if (rotate != 0) {
          int w = bitmap.getWidth();
          int h = bitmap.getHeight();

// Setting pre rotate
          Matrix mtx = new Matrix();
          mtx.preRotate(rotate);

         // Rotating Bitmap & convert to ARGB_8888, required by tess
         bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false);
         bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
       }


Answer 2:

您将需要阅读从原来的JPEG元数据,以验证其照片的拍摄方向。

ExifInterface exif = new ExifInterface(SourceFileName);
String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION);

来源: 如何确定图片的方向,而不会ExifInterface?

编辑:在回答你的编辑,你尝试过使用getCameraInfo()方法,可在回调传递的Camera对象? 是否有您所需要的信息?

来源: http://developer.android.com/reference/android/hardware/Camera.html



Answer 3:

public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera.setPreviewDisplay(holder);
        Camera.Parameters parameters = mCamera.getParameters();
        if (this.getResources().getConfiguration().orientation !=
                Configuration.ORIENTATION_LANDSCAPE)
        {
            parameters.set("orientation", "portrait"); <----THis gets the job done!!!
            // For Android Version 2.2 and above
            mCamera.setDisplayOrientation(90);
            // For Android Version 2.0 and above
            parameters.setRotation(90);
        }


        // End Effects for Android Version 2.0 and higher
        mCamera.setParameters(parameters);
    }
    catch (IOException exception)
    {
        mCamera.release();
    }

}


Answer 4:

卸下setRequestedOrientation()允许getWindowManager().getDefaultDisplay().getRotation()给出正确的旋转。 我想设置请求的方向防止活动从重绘自己当配置改变因此设备不知道任何一种旋转的变化。 我唯一的问题是现在从横向模式在0度方向为横向模式的180度旋转不会触发此开关:

@Override
public void onConfigurationChanged(Configuration newconfig)
{
    super.onConfigurationChanged(newconfig);

}


文章来源: Android image orientation issue with custom camera activity