我使用以下代码在Android中拍摄图片:
File image = new File(this.images_object_dir, loadedObjekt.getFilename());
Uri uri = FileProvider.getUriForFile(this, FILE_PROVIDER, image);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, CAMERA_ACTIVITY_CODE);
出于相机意图,在我的Huawei P20 Pro上,图像预览始终处于纵向模式。在另一台测试设备上,预览图像(您可以决定是否要重新拍摄图像的图像)也卡在“初始”旋转中,看起来很丑。例如,如果您想以横向模式拍摄图像,则预览会翻转为纵向模式。
有解决方案吗?
答案 0 :(得分:2)
大约有20亿个Android设备,分布在约20,000个设备模型中。这些设备型号中有数十个(甚至数百个)预装的相机应用程序。用户还可以下载并安装其他许多相机应用程序。
您的代码可能会启动其中任何一个。
出于摄影意图,我的Huawei P20 Pro上的图像预览始终处于纵向模式
这就是数百个相机应用程序的行为。
在另一台测试设备上,预览图像(您可以决定是否要重新拍摄该图像)也卡在“初始”旋转中,看起来很丑。
这就是数百个相机应用程序的行为。
相机应用程序无需以这种方式运行。当然,相机应用程序完全不需要预览图像。
有解决方案吗?
如果您想使用ACTION_IMAGE_CAPTURE
,则不会。数百种相机应用程序的行为取决于这些相机应用程序的开发人员,而不是您自己。
还有其他用于拍照的选项,例如直接使用相机API或使用第三方库(例如Fotoapparat或CameraKit-Android)。
答案 1 :(得分:0)
在解码图像时,使用ExifInterface
检查图像的方向。然后旋转图像以获得正确方向的所需图像。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;
Bitmap decoded = BitmapFactory.decodeFile(filePath, options);
if (decoded == null) return null;
try {
ExifInterface exif = new ExifInterface(filePath);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
int rotation = 0;
if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
rotation = 90;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
rotation = 270;
} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
rotation = 180;
}
if (rotation != 0) {
Matrix matrix = new Matrix();
matrix.postRotate(rotation);
Bitmap newBitmap = Bitmap.createBitmap(decoded, 0, 0, decoded.getWidth(),
decoded.getHeight(), matrix, true);
decoded.recycle();
Runtime.getRuntime().gc();
decoded = newBitmap;
}
} catch (IOException e) {
e.printStackTrace();
}
如果要使用支持库来支持API级别较低的设备,请使用以下依赖项:
implementation 'com.android.support:exifinterface:27.1.1'
并导入android.support.media.ExifInterface