Выбор изображений на устройстве Samsung Galaxy вращается

Я работаю над Android-проектом, в котором пользователь может загрузить изображение как изображение профиля. Все работало нормально до определенного момента (в конце концов, до обновления Samsung). С тех пор изображения на устройствах Samsung Galaxy (возможно, также на других), но на моем HTC One XL он работает нормально, на моем планшете Lenovo Yoga и на Sony (точно не знаю, на каком) тоже. Но на Galaxy S6 и S5 он поворачивает изображение. Идея состоит в том, что Изображение устанавливается в "нормальном" ракурсе, как это воспринимал Пользователь. Это означает, что он должен занимать только квадрат, но, конечно, чтобы он был в вертикальном положении. В устройствах Samsung голова повернута на 90 градусов против часовой стрелки. Код отлично работает на других устройствах. Есть у кого-то такая же проблема? Любая идея? Вот код

// After image taken
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    try {
        // data returned
        if (resultCode != FragmentActivity.RESULT_CANCELED) {
            if (requestCode == RESULT_LOAD_IMAGE && resultCode == getActivity().RESULT_OK){
                // Set profile image from gallery
                try {

                    Uri selectedImage = data.getData();
                    photo = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), selectedImage);
                    photo = MainUtils.rotateBitmap(photo, data, getActivity());

                    photo = MainUtils.resizeBitmapIfNeeded(photo, 800, 800);

                    byte[] byteArray;
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    photo.compress(Bitmap.CompressFormat.JPEG, 90, stream);
                    byteArray = stream.toByteArray();

                    // Save image to parse as ParseFile and connect to the ParseUser (redacted)
            }

Методы MainUtils:

public static Bitmap resizeBitmapIfNeeded(Bitmap image, int maxWidth, int maxHeight) {
    if (maxHeight > 0 && maxWidth > 0) {

        int wid = image.getWidth();
        int hei = image.getHeight();

        MainUtils.log(" resizeBitmapIfNeeded, size is " + wid + " X " + hei);

        if (wid > maxWidth || hei > maxHeight) {
            int width = image.getWidth();
            int height = image.getHeight();
            float ratioBitmap = (float) width / (float) height;
            float ratioMax = (float) maxWidth / (float) maxHeight;

            int finalWidth = maxWidth;
            int finalHeight = maxHeight;
            if (ratioMax > 1) {
                finalWidth = (int) ((float) maxHeight * ratioBitmap);
            } else {
                finalHeight = (int) ((float) maxWidth / ratioBitmap);
            }
            image = Bitmap.createScaledBitmap(image, finalWidth, finalHeight, true);

            wid = image.getWidth();
            hei = image.getHeight();
            MainUtils.log(" resizeBitmapIfNeeded, resized size is " + wid + " X " + hei);
            return image;
        } else {
            return image;
        }
    } else {
        return image;
    }
}

public static Bitmap rotateBitmap(Bitmap bitmap, Intent data, Context context) {

    int orientation = 0;

    try {
        Uri selectedImage = data.getData();
        ExifInterface exif;
        exif = new ExifInterface(MainUtils.getRealPathFromUri(context, selectedImage));
        orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_UNDEFINED);

        MainUtils.log("Orientation is " + orientation);

    } catch (IOException excep) {
        MainUtils.log("Rotate " + excep.getMessage());
    }

    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.postRotate(180);
            break;
        case ExifInterface.ORIENTATION_FLIP_VERTICAL:
            matrix.postRotate(180);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_TRANSPOSE:
            matrix.postRotate(90);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_90:
            matrix.postRotate(90);
            break;
        case ExifInterface.ORIENTATION_TRANSVERSE:
            matrix.postRotate(-90);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_270:
            matrix.postRotate(-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;
    }
}

public static Bitmap rotateBitmapFromFile(String picturePath) {

    int orientation = 0;
    Bitmap bitmap = BitmapFactory.decodeFile(picturePath);

    try {
        ExifInterface exif = new ExifInterface(picturePath);
        orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);

        MainUtils.log("Orientation is " + orientation);

    } catch (IOException excep) {
        MainUtils.log("Rotate " + excep.getMessage());
    }

    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.postRotate(180);
            break;
        case ExifInterface.ORIENTATION_FLIP_VERTICAL:
            matrix.postRotate(180);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_TRANSPOSE:
            matrix.postRotate(90);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_90:
            matrix.postRotate(90);
            break;
        case ExifInterface.ORIENTATION_TRANSVERSE:
            matrix.postRotate(-90);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_270:
            matrix.postRotate(-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;
    }
}

Галерея намерений

Intent intent = new Intent(
                        Intent.ACTION_PICK,
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                intent.setType("image/*");
                startActivityForResult(
                        Intent.createChooser(intent, "Select File"),
                        galleryRequest);

person Stephan Boner    schedule 26.10.2016    source источник
comment
Почему два кода запроса? Пожалуйста, придерживайтесь одного. Опубликуйте использованное намерение в начале кода. Покажи, что ты делаешь с mCurrentPhotoPath.   -  person greenapps    schedule 26.10.2016
comment
Я просил вас сосредоточить вашу проблему только на одной. Итак, только одно намерение. И еще один запросCode. Выберите камеру или галерею. Адаптируйте свой пост. Я подожду.   -  person greenapps    schedule 26.10.2016
comment
@greenapps Спасибо, отредактировал.   -  person Stephan Boner    schedule 26.10.2016
comment
Вы вызываете rotateBitmap (), а затем жалуетесь, что изображение поворачивается?   -  person greenapps    schedule 26.10.2016
comment
И вы не сказали, какая ориентация подходит для игры. Какой случай этого оператора переключения? Расскажите, пожалуйста, что именно происходит. Как мы могли узнать?   -  person greenapps    schedule 26.10.2016
comment
@greenapps Я отредактировал свой пост. rotateBitmap должен исправить ошибки ориентации, что работает на других моих устройствах.   -  person Stephan Boner    schedule 26.10.2016
comment
Вы только повторяете себя. Мы уже знали. Но вы не даете информацию, которую я просил. Лучше ответь на мои вопросы, иначе тебе ничем не помогут.   -  person greenapps    schedule 26.10.2016
comment
@greenapps Это моя самая большая проблема - у меня нет затронутого устройства, поэтому я не могу отлаживать. Поэтому я не знаю, какой оператор switch и т. Д. Я надеялся, что у кого-то такая же ошибка ...   -  person Stephan Boner    schedule 27.10.2016
comment
У меня его тоже нет. Прости. Один из виновников - использование вами класса ExifInterface, для которого требуется путь к файлу. Итак, вы используете getRealPathFromUri(). Проклятье пользоваться такими функциями. Они могут вернуть null. Вы могли бы по крайней мере адаптировать свой код таким образом, чтобы он проверял значение null перед использованием. Затем покажите тост.   -  person greenapps    schedule 27.10.2016
comment
Пожалуйста, сделайте тест, чтобы увидеть, не вызовет ли exif = new Exifinterface(null) исключение. Если это разрешено, ориентация всегда будет равна 0.   -  person greenapps    schedule 27.10.2016
comment
Большое спасибо за ваши усилия @greenapps Проект теперь принадлежит тем, кто очень хорошо знает Android. Я попрошу его опубликовать ответ здесь / Я сам отправлю ответ, если он решен.   -  person Stephan Boner    schedule 28.10.2016
comment
Повторяющийся вопрос. См. Ответ stackoverflow.com/questions/13511356/   -  person myfknoll    schedule 28.10.2016


Ответы (1)


Повторяющийся вопрос, см. Изображение Android, выбранное из галереи Ориентация всегда 0: Exif TAG

Проверьте ответ MKJParekh. Что вам нужно сделать: 1.) Получить ориентацию хранилища растровых изображений 2.) При необходимости повернуть растровое изображение в соответствии с ориентацией.

person myfknoll    schedule 28.10.2016