Камера Android и портретное вращение

У меня проблема в моем приложении для Android, я следил за эта статья, чтобы сделать снимок в моем приложении, и оно работает нормально, но, к сожалению, изображение находится в альбомном режиме, а не в портретном. Я нашел несколько сообщений на SO, а также статьи в сети по этой проблеме, насколько я понимаю, это поведение не поведение Android, а поведение устройства, и оно может меняться от устройства к устройству.

Итак, вопрос:, когда я получаю изображение из намерения, как мне узнать, нужно ли повернуть сделанное изображение или нет?

Здесь вы можете увидеть снимок, сделанный с помощью эмулятора (у меня такое же поведение на моем Sony Xperia):

Камера Android и портретное вращение

А затем, когда я отображаю его в ImageView:

Камера Android и портретное вращение

Разместите свой код там, где вы показываете это изображение, мы можем программно повернуть изображение

Sandeep Parish 04.06.2018 15:15

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

Moussa 04.06.2018 15:18

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

Sandeep Parish 04.06.2018 15:21
the question is how do I know if the picture actually need to be rotated. Изучите заголовок Exif.
greenapps 04.06.2018 15:39
when I get the picture from the intent, Вы получили это не намеренно. Ни из используемого приложения камеры. Сценарий другой. Пожалуйста, лучше опишите, что происходит.
greenapps 04.06.2018 15:42
4
5
1 293
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку я не нашел полного ответа на свой вопрос, я публикую свое решение.

1. Получить фото с камеры

protected File pictureFromCamera;
protected Uri photoUri;
...
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null)
{
    // Create the File where the photo should go
    pictureFromCamera = generateFile();
    if (pictureFromCamera != null)
    {
        String authority = BuildConfig.APPLICATION_ID + ".provider";
        photoUri = FileProvider.getUriForFile(DermatoPhotoCollectionActivity.this, authority, pictureFromCamera);
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
        startActivityForResult(takePictureIntent, REQUEST_PHOTO_FROM_CAMERA);
    }
}

2. Ориентируйтесь на фотографии.

Вот код для ориентации, он вдохновлен эта статья. Имейте в виду, что для этого требуется зависимость: compile "com.android.support:exifinterface:27.1.1"

Получение ориентации фотографии зависит от устройства и может не работать на некоторых устройствах (например, она отлично работает на моем Xperia, но не на эмуляторе Android).

public static int getOrientation(Context context, Uri photoUri)
{
    InputStream in = null;
    int orientation = ExifInterface.ORIENTATION_NORMAL;
    try
    {
        in = context.getContentResolver().openInputStream(photoUri);
        if (in != null)
        {
            android.support.media.ExifInterface exifInterface = new android.support.media.ExifInterface(in);
            orientation = exifInterface.getAttributeInt(android.support.media.ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        if (in != null)
        {
            try
            {
                in.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    return orientation;
}

3. При необходимости поверните изображение.

Я использую asyncTask для поворота фото

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (resultCode == RESULT_OK)
    {
        final String pathPhotoFromCamera = pictureFromCamera.getAbsolutePath();

        final ProgressDialog progressDialog = createProgressDialog();
        progressDialog.show();

        int orientation = getOrientation(this, photoUri);
        int rotationAngle = 0;

        if (orientation != ExifInterface.ORIENTATION_NORMAL)
        {
            switch (orientation)
            {
                case ExifInterface.ORIENTATION_ROTATE_90:
                    rotationAngle = 90;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    rotationAngle = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    rotationAngle = 270;
                    break;
            }
        }

        AsyncTaskRotatePicture.AsyncTaskParams params = new AsyncTaskRotatePicture.AsyncTaskParams(pathPhotoFromCamera, rotationAngle);

        AsyncTaskRotatePicture taskRotatePicture = new AsyncTaskRotatePicture(new CallBack()
        {
            @Override
            public void onPostExecute()
            {
                progressDialog.dismiss();
            }
        });

        taskRotatePicture.execute(params);
    }
}

4. Наконец код, который поворачивает фото

Функция перезаписывает исходное фото.

public static void rotatePhoto(String photoFilePath, int rotationAngle)
{
    Bitmap bm = BitmapFactory.decodeFile(photoFilePath);
    Matrix matrix = new Matrix();
    matrix.setRotate(rotationAngle, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2);
    byte[] extractedBitmap = extractByteFromBitmap(Bitmap.createBitmap(bm, 0, 0, bm.getWidth() - 1, bm.getHeight() - 1, matrix, true));
    saveBitmapOnSdcard(extractedBitmap, photoFilePath);
}

Ну вот, не могли бы вы показать, как у вас generateFile()?

jzeferino 28.06.2018 19:14

У меня есть настраиваемая функция для этого, которая соответствует моим требованиям, но функция, указанная в связанной статье, должна работать нормально: inthecheesefactory.com/blog/… Поиск fonction: private File createImageFile() throws IOException

Moussa 29.06.2018 09:56

Другие вопросы по теме