我成功点击图片并将其保存在卡片中。它在所有设备上都运行良好,但问题是当我在三星设备上测试时,然后当我在纵向模式下点击图像时,它默认在横向模式下保存图像。但我没有做任何类型的旋转代码。所以请帮助我。我怎么解决呢?
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" />
答案 0 :(得分:6)
我解决了我的错误,实际上我使用了一个技巧。我在程序上采用了制造的名称,就像这样
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;
}
答案 1 :(得分:3)
许多设备 - 但不是全部 - 不会保存肖像图像。他们将使用EXIF标题保存风景图像,告诉图像查看器将图像旋转为肖像。并非所有图像查看器都能处理此问题。
这是我写the CWAC-Camera library的原因之一,用于提供来自不同设备的统一摄像头输出。
The code that I use for this让人回想起Haresh在评论中指出的内容,以及一些值得注意的差异:
Haresh的代码似乎假设相机处于纵向模式;我的目标是处理这两种情况。
Haresh的代码在主应用程序线程上明确地完成了所有的工作,包括磁盘I / O,这是一个非常糟糕的主意。我是一个后台主题。
他的代码对图像进行了下采样。我的猜测是,这有助于防止内存不足错误,这绝对是一个挑战。在我的例子中,我给开发人员使用我的库指定一个大堆的选项,以帮助确保我可以执行位图旋转。最后,我将此代码移动到NDK,其中内存分配不计入Dalvik堆限制。
我的代码还负责其他特定于设备的问题,例如在需要时翻转FFC图像或在开发人员要求时镜像FFC图像。
但是,我的代码专门设计为我的库使用,因此需要大量的工作才能将逻辑划分为可以独立使用的东西。
请注意,the link to my code专门针对库的v0.6.9。如果您在写完这个答案后几个月正在阅读这个类的更新版本可能存在于回购中。相反,如果我已将代码移动到NDK中,则可能在repo master
中不再存在该类。