Проблема с намерением и ориентацией камеры Android - PullRequest
3 голосов
/ 14 марта 2011

У меня возникает следующая проблема при запуске намерения камеры в моем приложении Android: если приложение запускается в ориентации, скажем, изобразить, камера работает только в изображении. Если вы измените ориентацию телефона на альбомную, когда приложение запущено или камера намерена работать, и попытаетесь сделать альбомную фотографию, приложение закроется и с ошибкой. Это похоже на намерение камеры снимать только в том направлении, в котором оно было при запуске.

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

        String path = (new StringBuilder()).append(Environment.getExternalStorageDirectory()).append("/"+fileName).toString();
        File file = new File(path);
        Uri outputFileUri = Uri.fromFile(file);
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra("output", outputFileUri);
        startActivityForResult(intent, CAMERA_RESULT);

Есть идеи, почему это происходит? У меня нет ничего, связанного с ориентацией камеры в манифесте, ни ...

Приветствия

Aram

Ответы [ 5 ]

5 голосов
/ 05 декабря 2012

Я решил это, поместив configChanges="orientation" в активность, которая вызывает камеру.Надеюсь, это поможет:)

1 голос
/ 27 июня 2016

Большинство телефонных камер имеют альбомную ориентацию. Это означает, что если вы сделаете фотографию в портретной ориентации, полученные фотографии будут повернуты на 90 градусов. В этом случае программное обеспечение камеры должно заполнять данные EXIF ​​в той ориентации, в которой должна просматриваться фотография.

ExifInterface ei = new ExifInterface(photoPath);
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);

switch(orientation) {
    case ExifInterface.ORIENTATION_ROTATE_90:
        rotateImage(bitmap, 90);
        break;
    case ExifInterface.ORIENTATION_ROTATE_180:
        rotateImage(bitmap, 180);
        break;
    // etc.
}

Вот метод rotateImage:

public static Bitmap rotateImage(Bitmap source, float angle) {
    Bitmap retVal;

    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    retVal = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);

    return retVal;
}
0 голосов
/ 02 мая 2017

Я считаю, что проблема в том, что значение outputFileUri становится нулевым после изменения ориентации действия.

Мне удалось решить эту проблему, добавив сохраненное состояние экземпляра для переменной, например:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    if(outputFileUri!=null) {
        outState.putString("outputFileUri", outputFileUri.toString());
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    outputFileUri = Uri.parse(savedInstanceState.getString("outputFileUri"));
}

Надеюсь, что это может помочь любому с этой проблемой!

0 голосов
/ 07 июля 2013

Хорошо, все, вот что-то, что работает для меня.В разработчиках Android они дали внутри блока ResultOK, чтобы проверить, если data! = Null, но если вы измените его с fileUri! = Null, он будет работать нормально, а позже, при сохранении файла, следует заменить data.getData () на fileUri, этотакже сохраняет изображениеНадеюсь, это поможет.

0 голосов
/ 08 апреля 2011

Я думаю, что проблема в вашей функции onActivityResult.Если вы запустите камеру в режиме Potrait, затем попытайтесь повернуть экран и сделать пейзажную фотографию, когда ваше первое занятие возобновится, он потерял значение outputFileUri, которое вы хотели сделать, сбросьте его на ноль и выбросите ошибку NullPointerException.

...