Kamera-Capture-Orientierung auf Samsung-Geräten in Android

Ich schaffe eine Kamera-App. Das Bild wird in der Rasteransicht angezeigt. Jetzt funktioniert der Code ganz gut auf allen Geräten, außer bei Samsung-Geräten.

Ich bin vor der Orientierungsfrage. Wenn ich ein Bild im Hochformat aufnehme, dreht sich das Bild, wenn es in der Rasteransicht angezeigt wird. Ich habe keinen Drehcode gehalten. Zweitens, mit dem EXIF ​​habe ich das richtige Bild in der Rasteransicht erreicht, aber wenn sich die Geräteorientierung ändert, dreht sich das Bild wieder in einer gestörten Weise.

Bilder anhängen: Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Entschuldigung für die Auflösung des Bildes. Bitte lemme wissen, ob sie nicht richtig sichtbar sind. Wird wieder hochladen. Ich weiß, es gibt viel solche Hilfe auf SO. Aber ich glaube, ich stecke irgendwo auf.

Ich beziehe mich auf den folgenden Link:

How to show Captured Images dynamically in “GridView” Layout

  • Waben-Emulator umgekehrter Bildschirm im Porträt
  • Android: Orientierung ändern geändert
  • Ändern Sie die Bildschirmausrichtung programmgesteuert über eine Schaltfläche
  • Tablet Screen Orientation Change - No View gefunden für id für Fragment
  • Aktivität zweimal erstellt
  • Drehen des eigentlichen Videobuffers in Videoview
  • Verhindern Sie Live Wallpaper Orientierung ändern, wenn eine Anwendung geöffnet wird und Orientierung geändert wird?
  • Cordova ignoriert Bildschirmorientierungssperre
  • 3 Solutions collect form web for “Kamera-Capture-Orientierung auf Samsung-Geräten in Android”

    Dies ist der Code, den ich damit gemacht habe (es funktioniert für jedes Gerät):

    Dieser Teil ist, wo ich das aufgenommene Foto zur Bildansicht in der Haupttätigkeit setze:

    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); 

    Konstante Werte in der Kameraaktivität:

      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; 

    Callback-Funktion in der Kamera-Aktivität:

      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(); } }; 

    Foto-Funktion in der Kamera-Aktivität:

      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(); } 

    Orientierungs-Hörer, der in der Kamera-Aktivität aufgerufen wird:

     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; } } } } }; 

    Hier ist der Code, den ich in meiner App benutzt habe, um zu drehen und arbeitet in allen Geräten:

     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); } 

    Zuerst müssen Sie die ursprüngliche Datei Orientierung –

      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(); } 

    Sie müssen eine Methode schreiben, die die Bitmap zurückgibt, nachdem sie in die richtige Richtung gedreht wurde.

     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; } } 
    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.