Я провел много времени, ища решение для этого. И наконец управляемый, чтобы сделать это. Не забывайте к upvote @Jason ответ Робинсона, потому что мой на основе его.
Таким образом, первая вещь, вы, sholuld знают, что начиная с Android 7.0 мы должны использовать <кодируете> FileProvider , и что-то названное ContentUri
, иначе вы получите раздражающую ошибку при попытке призвать ваш Намерение
. Это - пример кода:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, getUriFromPath(context, "[Your path to save image]"));
startActivityForResult(intent, CAPTURE_IMAGE_RESULT);
Метод getUriFromPath (Контекст, Последовательность)
основание на пользовательской версии Android создает FileUri (file://...)
или ContentUri (content://...)
, и там это:
public Uri getUriFromPath(Context context, String destination) {
File file = new File(destination);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
return FileProvider.getUriForFile(context, context.getPackageName() + ".provider", file);
} else {
return Uri.fromFile(file);
}
}
После onActivityResult
можно поймать тот uri
, где образ сохраняется камерой, но теперь необходимо обнаружить вращение камеры, здесь мы будем использовать moddified @Jason ответ Робинсона:
First we need to create ExifInterface
based on Uri
@Nullable
public ExifInterface getExifInterface(Context context, Uri uri) {
try {
String path = uri.toString();
if (path.startsWith("file://")) {
return new ExifInterface(path);
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (path.startsWith("content://")) {
InputStream inputStream = context.getContentResolver().openInputStream(uri);
return new ExifInterface(inputStream);
}
}
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
Выше кода может быть упрощен, но я хочу показать все. Таким образом из FileUri
, который мы можем создать ExifInterface
на основе путь Последовательности
, но из ContentUri
мы не можем, Android не поддержать это.
В этом случае мы должны использовать другого конструктора на основе InputStream
. Помните, что этот конструктор не доступен по умолчанию, необходимо добавить дополнительную библиотеку:
compile "com.android.support:exifinterface:XX.X.X"
Теперь мы можем использовать getExifInterface
метод, чтобы получить наш угол:
public float getExifAngle(Context context, Uri uri) {
try {
ExifInterface exifInterface = getExifInterface(context, uri);
if(exifInterface == null) {
return -1f;
}
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
return 90f;
case ExifInterface.ORIENTATION_ROTATE_180:
return 180f;
case ExifInterface.ORIENTATION_ROTATE_270:
return 270f;
case ExifInterface.ORIENTATION_NORMAL:
return 0f;
case ExifInterface.ORIENTATION_UNDEFINED:
return -1f;
default:
return -1f;
}
}
catch (Exception e) {
e.printStackTrace();
return -1f;
}
}
Теперь у вас есть Энгл, чтобы правильно вращать вас изображение:).