Ориентация захвата камеры на устройствах samsung в android

Я создаю приложение для камеры. Изображение при захвате отображается в виде сетки. Теперь код работает полностью на всех устройствах, кроме устройств samsung.

Я столкнулся с проблемой ориентации. Когда я снимаю изображение в портретном режиме, изображение поворачивается при отображении в режиме сетки. Я не сохранил код поворота. Во-вторых, с EXIF ​​я добился правильного изображения в виде сетки, но когда меняется ориентация устройства, снова изображение вращается в утонченном виде.

Присоединение изображений: Введите описание изображения здесь

Введите описание изображения здесь

Извините за разрешение изображения. Пожалуйста, дайте понять, правильно ли они видны. Выгрузите снова. Я знаю, что есть такая помощь на SO. Но я думаю, что я где-то застрял.

Я имею в виду следующую ссылку:

How to show Captured Images dynamically in “GridView” Layout

Solutions Collecting From Web of "Ориентация захвата камеры на устройствах samsung в android"

Это код, который я сделал с этим (он работает для каждого устройства):

Эта часть – это то, где я поставил выбранное фото в изображение в главном действии:

try { File imageFile = new File(cursor.getString(0)); ExifInterface exif = new ExifInterface( imageFile.getAbsolutePath()); int orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; } Log.v("", "Exif orientation: " + orientation); } catch (Exception e) { e.printStackTrace(); } Matrix matrix = new Matrix(); matrix.postRotate(rotate); bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); testImage.setImageBitmap(null); testImage.setImageBitmap(bmp); 

Постоянные значения в активности камеры:

  private static final int ORIENTATION_PORTRAIT_NORMAL = 1; private static final int ORIENTATION_PORTRAIT_INVERTED = 2; private static final int ORIENTATION_LANDSCAPE_NORMAL = 3; private static final int ORIENTATION_LANDSCAPE_INVERTED = 4; private OrientationEventListener mOrientationEventListener; private int mOrientation = -1; 

Функция обратного вызова в работе камеры:

  Camera.PictureCallback photoCallback=new Camera.PictureCallback(){ public void onPictureTaken(final byte[] data, final Camera camera){ dialog=ProgressDialog.show(CameraActivity.this,"","Please wait while the photo is being saved.."); new Thread(){ public void run(){ try{ Thread.sleep(1000); } catch(Exception ex){} onPictureTake(data,camera); } }.start(); } }; 

Выполнять фотофункцию в камере:

  public void onPictureTake(byte[] data, Camera camera){ switch (mOrientation) { case ORIENTATION_PORTRAIT_NORMAL: rotate = 90; break; case ORIENTATION_LANDSCAPE_NORMAL: rotate = 0; break; case ORIENTATION_PORTRAIT_INVERTED: rotate = 270; break; case ORIENTATION_LANDSCAPE_INVERTED: rotate = 180; break; } Matrix matrix = new Matrix(); matrix.postRotate(rotate); bmp = BitmapFactory.decodeByteArray(data, 0, data.length); bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); mutableBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true); savePhoto(mutableBitmap); dialog.dismiss(); flag = 0; finish(); } 

Ориентированный слушатель, который называется inresume в деятельности камеры:

 mOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) { @SuppressWarnings("deprecation") @Override public void onOrientationChanged(int orientation) { // determine our orientation based on sensor response int lastOrientation = mOrientation; Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); int rotation = getWindowManager().getDefaultDisplay().getRotation(); System.out.println(rotation+""); if (display.getOrientation() != Surface.ROTATION_0) { // landscape oriented devices System.out.println("LANDSCAPE"); if (orientation >= 315 || orientation < 45) { if (mOrientation != ORIENTATION_LANDSCAPE_NORMAL) { mOrientation = ORIENTATION_LANDSCAPE_NORMAL; } } else if (orientation < 315 && orientation >= 225) { if (mOrientation != ORIENTATION_PORTRAIT_INVERTED) { mOrientation = ORIENTATION_PORTRAIT_INVERTED; } } else if (orientation < 225 && orientation >= 135) { if (mOrientation != ORIENTATION_LANDSCAPE_INVERTED) { mOrientation = ORIENTATION_LANDSCAPE_INVERTED; } } else if (orientation <135 && orientation > 45) { if (mOrientation != ORIENTATION_PORTRAIT_NORMAL) { mOrientation = ORIENTATION_PORTRAIT_NORMAL; } } } else { // portrait oriented devices System.out.println("PORTRAIT"); if (orientation >= 315 || orientation < 45) { if (mOrientation != ORIENTATION_PORTRAIT_NORMAL) { mOrientation = ORIENTATION_PORTRAIT_NORMAL; } } else if (orientation < 315 && orientation >= 225) { if (mOrientation != ORIENTATION_LANDSCAPE_NORMAL) { mOrientation = ORIENTATION_LANDSCAPE_NORMAL; } } else if (orientation < 225 && orientation >= 135) { if (mOrientation != ORIENTATION_PORTRAIT_INVERTED) { mOrientation = ORIENTATION_PORTRAIT_INVERTED; } } else if (orientation <135 && orientation > 45) { if (mOrientation != ORIENTATION_LANDSCAPE_INVERTED) { mOrientation = ORIENTATION_LANDSCAPE_INVERTED; } } } } }; 

Вот код, который я использовал в своем приложении для поворота и работы на всех устройствах:

 private Bitmap adjustImageOrientation(Bitmap image) { ExifInterface exif; try { exif = new ExifInterface(picturePath); 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 = image.getWidth(); int h = image.getHeight(); // Setting pre rotate Matrix mtx = new Matrix(); mtx.preRotate(rotate); // Rotating Bitmap & convert to ARGB_8888, required by tess image = Bitmap.createBitmap(image, 0, 0, w, h, mtx, false); } } catch (IOException e) { return null; } return image.copy(Bitmap.Config.ARGB_8888, true); } 

Сначала вам нужно получить исходную ориентацию файла –

  try { ExifInterface exif = new ExifInterface("File AbsolutePath"); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); Bitmap bm = rotateBitmap("Old Bitmap", orientation); } catch (IOException e) { e.printStackTrace(); } 

Вам нужно написать метод, который возвращает битмап после поворота в правильном направлении.

 public Bitmap rotateBitmap(Bitmap bitmap, int orientation) throws IOException { Matrix matrix = new Matrix(); switch (orientation) { case ExifInterface.ORIENTATION_NORMAL: return bitmap; case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: matrix.setScale(-1, 1); break; case ExifInterface.ORIENTATION_ROTATE_180: matrix.setRotate(180); break; case ExifInterface.ORIENTATION_FLIP_VERTICAL: matrix.setRotate(180); matrix.postScale(-1, 1); break; case ExifInterface.ORIENTATION_TRANSPOSE: matrix.setRotate(90); matrix.postScale(-1, 1); break; case ExifInterface.ORIENTATION_ROTATE_90: matrix.setRotate(90); break; case ExifInterface.ORIENTATION_TRANSVERSE: matrix.setRotate(-90); matrix.postScale(-1, 1); break; case ExifInterface.ORIENTATION_ROTATE_270: matrix.setRotate(-90); break; default: return bitmap; } try { Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); bitmap.recycle(); return bmRotated; } catch (OutOfMemoryError e) { e.printStackTrace(); return null; } }