Как получить тип ориентации при захвате изображения через Intent?

Я столкнулся с проблемой при захвате изображения с помощью намерения.

Я использую код намерения по умолчанию для захвата изображения. следующее.

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                 startActivityForResult(intent, TAKE_PHOTO_CODE);

и получение его в onActivityResult следующим образом.

  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if( TAKE_PHOTO_CODE==requestCode){

        try {
             Bundle extras = data.getExtras();
             Bitmap mImageBitmap = (Bitmap) extras.get("data");
             selectedImagePath = saveImageInfo(mImageBitmap, "image");
             ExifInterface exif = new ExifInterface(selectedImagePath);
            Toast.makeText(getBaseContext()," "+exif.getAttribute(ExifInterface.TAG_ORIENTATION), Toast.LENGTH_SHORT).show();

         try {
                showDialog(DIALOG_UPLOADING);

            } catch (Exception e) {

                e.printStackTrace();
            }
          } catch (Exception e) {

          e.printStackTrace();
          Toast.makeText(getApplicationContext(), "No image selected.. ", Toast.LENGTH_SHORT).show();
        }
    }

}

Мне нужна ориентация захваченного изображения в этом методе onActivityResult, у меня есть поиск и об этом, и я нашел ExifInterface, но у меня это не работает, я тестирую на устройстве LG Optimus Android, он всегда возвращает 0 для меня.

Проблема в том, что после захвата изображение поворачивается. Любое решение?


person Himanshu    schedule 31.08.2012    source источник
comment
почему бы вам не попробовать сравнить heightи его width? если h>=w, то портрет иначе пейзаж?   -  person Aprian    schedule 31.08.2012
comment
сравнение высоты и ширины создаст проблемы... Протестируйте его на nexus 1 и nexus S, вы увидите проблемы...   -  person Hitesh Sondhi    schedule 31.08.2012


Ответы (1)


Вы можете получить вращение, используя метод, а затем повернуть изображение в соответствии с результатом -

private int getDisplayRotation() {
    int rotation = getWindowManager().getDefaultDisplay().getRotation();
    switch (rotation) {
        case Surface.ROTATION_0: return 0;
        case Surface.ROTATION_90: return 90;
        case Surface.ROTATION_180: return 180;
        case Surface.ROTATION_270: return 270;
    }
    return 0;
}

чтобы избавиться от множества проблем, связанных с устройством, я создал камеру с нуля. Вы можете получить код по адресу https://github.com/vinsol/expense-tracker/tree/master/src/com/vinsol/расходтрекер/камерасервис

а затем вызовите его, используя следующий метод

private void startCamera() {
    if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
        Intent camera = new Intent(this, Camera.class);
        File file = new File("123.jpg");
        Log.d("camera file path "+file.toString() );
        camera.putExtra("FullSizeImagePath", file.toString());
        startActivityForResult(camera, PICTURE_RESULT);
    } else {
        Toast.makeText(this, "sdcard not available", Toast.LENGTH_LONG).show();
    }
}
person Hitesh Sondhi    schedule 31.08.2012
comment
Спасибо за ваш ответ, getDisplayRotation() всегда возвращает 0 во всех случаях. Также я не хочу реализовывать открытую камеру через класс. есть встроенный метод? по которому мы можем получить его ориентацию. - person Himanshu; 31.08.2012
comment
он вернется в соответствии с ориентацией и ориентацией в ваших файлах макета... если вы протестируете его на планшете, он вернет 90... вы можете проверить камеру с play.google.com/store/apps/details?id=com.vinsol.expensetracker, то же самое метод, используемый Google (я использовал код камеры 2.2 и 4.0 и объединил код, чтобы сделать камеру такой) - person Hitesh Sondhi; 31.08.2012