Я работаю над своим первым приложением для Android.Он использует предварительный просмотр камеры из API camera1 (я знаю, что он устарел, но я не могу найти простые для понимания ресурсы для camera2).
Приложение намного сложнее и выше моего уровня, так как API камеры не работает.не прост в использовании.Но я в основном там.
Проблема, с которой я столкнулся, заключается в том, что мой предварительный просмотр камеры всегда сохраняет изображения в альбомном режиме, независимо от ориентации.Я искал это и имел много проблем с реализацией Exifinterfaces, матриц и растровых изображений.
Вот код, который я сейчас использую.
public static File getPictureFile(int mediaType) {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Camera App");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d("Camera App", "Failed to create directory");
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (mediaType == MEDIA_TYPE_IMAGE) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
} else {
return null;
}
return mediaFile;
}
public void takePicturePreview() {
Camera.PictureCallback mPicture = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getPictureFile(MEDIA_TYPE_IMAGE);
if (pictureFile ==null) {
Log.d(TAG, "Error creating media file, check storage permissions");
return;
}
//ROTATION NEEDS TO OCCUR HERE
//String filePath = pictureFile.getPath();
//Bitmap bitmap = BitmapFactory.decodeFile(filePath);
/*ExifInterface exif = null;
try {
exif = new ExifInterface(filePath);
} catch (IOException e) {
e.printStackTrace();
}*/
//int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
//Matrix matrix = new Matrix();
//matrix.postRotate(orientation);
//bitmap = Bitmap.createBitmap(bitmap, 0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
//bitmap.compress(Bitmap.CompressFormat.JPEG,85,fos);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.d(TAG, "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d(TAG, "Error accessing file: " + e.getMessage());
}
}
};
mCamera.takePicture(null, null, mPicture);
}
Все в комментариях - это тестовый код, которыйЯ пытался использовать, но ничего не работает.Поэтому я попытался использовать BitmapFactory, Exifinterface, чтобы получить ориентацию, затем матрицу, чтобы повернуть ее, а затем создать и сохранить растровое изображение, но оно просто вылетает.
На данный момент целые выражения, растровые изображения настолько неясны дляМне действительно трудно понять, что происходит.
Может кто-нибудь дать какие-нибудь советы или помочь разрешить моему приложению сохранять фотографии в правильной ориентации?