Ориентация камеры в устройстве samsung проблема


Я успешно щелкаю по изображению и сохраняю его в карточке. Он отлично работает на всех устройствах, но проблема в том, что когда я тестирую его в устройстве Samsung, то, как я нажимаю изображение в портретном режиме, то он сохраняет изображение по умолчанию в ландшафтном режиме. Но я не делаю никакого типа вращающегося кода. Так что, пожалуйста, помоги мне. Как я могу ее решить??

private void takePicture() {

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    try {
        Uri mImageCaptureUri = null;
        String state = Environment.getExternalStorageState();
        if (Environment.MEDIA_MOUNTED.equals(state)) {
            mImageCaptureUri = Uri.fromFile(mFileTemp);
        } else {
            mImageCaptureUri = InternalStorageContentProvider.CONTENT_URI;
        }
        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,
                mImageCaptureUri);
        intent.putExtra("return-data", true);
        startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
    } catch (ActivityNotFoundException e) {

        Log.d("", "cannot take picture", e);
    }
}

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

    if (resultCode != RESULT_OK) {

        return;
    }

    Bitmap bitmap;

    switch (requestCode) {

    case REQUEST_CODE_TAKE_PICTURE:

        startCropImage();
        break;
    case REQUEST_CODE_CROP_IMAGE:

        String path = data.getStringExtra(CropImage.IMAGE_PATH);
        if (path == null) {

            return;
        }

        bitmap = BitmapFactory.decodeFile(mFileTemp.getPath());
        resizedBitmap = ScalingUtilities.createScaledBitmap(bitmap, 320,
                320, ScalingLogic.CROP);
        imgPreview.setImageBitmap(resizedBitmap);
        break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}


private void startCropImage() {

    Intent intent = new Intent(this, CropImage.class);
    intent.putExtra(CropImage.IMAGE_PATH, mFileTemp.getPath());
    intent.putExtra(CropImage.SCALE, true);

    intent.putExtra(CropImage.ASPECT_X, 2);
    intent.putExtra(CropImage.ASPECT_Y, 2);

    startActivityForResult(intent, REQUEST_CODE_CROP_IMAGE);
}

Я добавил следующие разрешения в манифест.

   <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2 4

2 ответа:

Я решил свою ошибку, на самом деле я использую один трюк. Я взял изготовленное название программно, вот так

 String device_name = Build.MANUFACTURER;

После этого я сохранил его в объекте sharedpreferences.

 deviceIdPreferences = getSharedPreferences("USER_INFO", Context.MODE_PRIVATE);
    SharedPreferences.Editor   editor = deviceIdPreferences.edit();
    editor.putString("Device_id",deviceId);
    editor.putString("device_name",device_name);
    editor.commit();

После этого в файле назначения java я извлекаю значение из sharedpreference.

preferences = this.getSharedPreferences(
            "USER_INFO", Context.MODE_PRIVATE);
    device_name = preferences.getString("device_name", "Empty");

И затем

    mBitmap = getBitmap(mImagePath);
    if(device_name.equals("samsung")){

            switch (Integer.parseInt(gotOrientation)) {

                case ExifInterface.ORIENTATION_ROTATE_90:
                    mBitmap = Util.rotateImage(mBitmap, 90);
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    mBitmap = Util.rotateImage(mBitmap, 90);
                    break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    mBitmap = Util.rotateImage(mBitmap, 90);
                    break;
                default:
                    mBitmap = Util.rotateImage(mBitmap, 90);
                    break;
            }

        }




 private Bitmap getBitmap(String path) {

    Uri uri = getImageUri(path);
    InputStream in = null;
    try {
        in = mContentResolver.openInputStream(uri);

        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;

        BitmapFactory.decodeStream(in, null, o);
        in.close();

        int scale = 1;
        if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
            scale = (int) Math.pow(2, (int) Math.round(Math.log(IMAGE_MAX_SIZE / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
        }

        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        in = mContentResolver.openInputStream(uri);
        Bitmap b = BitmapFactory.decodeStream(in, null, o2);
        in.close();

        return b;
    } catch (FileNotFoundException e) {
        Log.e(TAG, "file " + path + " not found");
    } catch (IOException e) {
        Log.e(TAG, "file " + path + " not found");
    }
    return null;
}

Многие устройства-но не все-не будут сохранять портретные изображения. Они сохранят альбомные изображения с заголовком EXIF, который скажет программе просмотра изображений повернуть изображение к портрету. Не все зрители изображений справляются с этим.

Это одна из причин, по которой я написал библиотеку CWAC-Camera, чтобы обеспечить равномерный вывод камеры с разных устройств.

Код, который я использую для этого , напоминает то, что указывает Хареш в своем комментарии, с некоторыми примечательными различия:

  1. Код Хэреша, похоже, предполагает, что камера была в портретном режиме; мой нацелен на обработку любого случая.

  2. Код Хареша выполняет всю тяжелую работу явно в главном потоке приложения, включая дисковый ввод-вывод, что является очень плохой идеей. Моя-это фоновая нить.

  3. Его код уменьшает изображение. Я предполагаю, что это должно помочь предотвратить ошибки из-за нехватки памяти, что, безусловно, является проблемой здесь. В моем случае, я даю разработчики, использующие мою библиотеку возможность указания большой кучи, чтобы помочь гарантировать, что я могу выполнить поворот растрового изображения. В конце концов, я перенесу этот код в NDK,где выделение памяти не учитывается в соответствии с лимитом кучи Dalvik.

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

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

Обратите внимание, чтоссылка на мой код относится конкретно к v0.6.9 библиотеки. Более новые версии этого класса могут существовать в РЕПО, если Вы читаете это через несколько месяцев после того, как я написал этот ответ. И наоборот, класс может больше не существовать в репозитории master, хотя, если я переместил код в NDK.