Ориентация камеры в устройстве 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 ответа:
Я решил свою ошибку, на самом деле я использую один трюк. Я взял изготовленное название программно, вот так
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, чтобы обеспечить равномерный вывод камеры с разных устройств.
Код, который я использую для этого , напоминает то, что указывает Хареш в своем комментарии, с некоторыми примечательными различия:
Код Хэреша, похоже, предполагает, что камера была в портретном режиме; мой нацелен на обработку любого случая.
Код Хареша выполняет всю тяжелую работу явно в главном потоке приложения, включая дисковый ввод-вывод, что является очень плохой идеей. Моя-это фоновая нить.
Его код уменьшает изображение. Я предполагаю, что это должно помочь предотвратить ошибки из-за нехватки памяти, что, безусловно, является проблемой здесь. В моем случае, я даю разработчики, использующие мою библиотеку возможность указания большой кучи, чтобы помочь гарантировать, что я могу выполнить поворот растрового изображения. В конце концов, я перенесу этот код в NDK,где выделение памяти не учитывается в соответствии с лимитом кучи Dalvik.
Мой код также отвечает за другие проблемы, связанные с устройством, такие как переключение образа FFC при необходимости или зеркальное отображение образа FFC по запросу разработчика.
Однако мой код специально разработан для использования моей библиотекой, и поэтому потребовалось бы изрядное количество работы, чтобы разбить логику на что-то, что можно было бы использовать независимо.
Обратите внимание, чтоссылка на мой код относится конкретно к v0.6.9 библиотеки. Более новые версии этого класса могут существовать в РЕПО, если Вы читаете это через несколько месяцев после того, как я написал этот ответ. И наоборот, класс может больше не существовать в репозитории
master
, хотя, если я переместил код в NDK.