Como obter orientação do arquivo de imagem, tirado da classe FileProvider?

fundo

Com a API de segmentação 24 ou superior, em vez de usar um comando "Uri.fromFile" simples, os desenvolvedores precisam usar o FileProvider (ou seu próprio ContentProvider), para permitir que outros aplicativos acessem os arquivos do aplicativo.

O problema

Tento abrir um aplicativo de câmera para permitir que ele salve um arquivo no armazenamento privado do meu aplicativo, usando este código:

    final Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    final File photoFile = FileHelper.generateTempCameraFile(this);
    mCameraCachedImageURI = FileProvider.getUriForFile(this, getPackageName()+ ".provider", photoFile);
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCameraCachedImageURI);
    takePictureIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    startActivityForResult(takePictureIntent, REQ_CODE_PICK_IMAGE_FROM_CAMERA);

provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="."/>
</paths>

arquivo de manifesto

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

Isso começa bem, quando o aplicativo da câmera é iniciado, mas no resultado retornado, não consigo obter a orientação do arquivo de imagem usando o código que anteriormente funcionava bem:

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    int orientation = getOrientation(this,mCameraCachedImageURI );
    ...

public static int getOrientation(final Context context, final Uri photoUri) {
    Cursor cursor = null;
    try {
        cursor = context.getContentResolver().query(photoUri,
                new String[]{MediaStore.Images.ImageColumns.ORIENTATION}, null, null, null);
    } catch (final Exception ignored) {
    }
    if (cursor == null) {
        // fallback
        return getOrientation(photoUri.getPath());
    }
    int result = 0;
    if (cursor.getCount() > 0) {
        cursor.moveToFirst();
        result = cursor.getInt(0);
    }
    cursor.close();
    return result;
}

public static int getOrientation(final String filePath) {
    if (TextUtils.isEmpty(filePath))
        return 0;
    try {
        final ExifInterface exifInterface = new ExifInterface(filePath);
        final int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL);
        int rotate = 0;
        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_270:
                rotate = 270;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                rotate = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                rotate = 90;
                break;
        }
        return rotate;
    } catch (final IOException ignored) {
    }
    return 0;
}

Isso travará, porque o cursor não possui nenhuma coluna durante a execução desse código.

Não apenas isso, mas mesmo a função de fallback (ao alterar o código para usá-lo) não funciona, pois adiciona uma parte adicional ao caminho do arquivo ("externo" neste caso).

O que eu encontrei

Parece que o contentResolver usa o FileProvider aqui, em vez do que foi usado nas versões anteriores do Android.

O problema é que preciso do ContentProvider desse URI para conceder ao aplicativo da câmera permissão para acessar este arquivo ...

A questão

Como obtenho a orientação usando o código acima (ou mesmo um código melhor), usando o novo FileProvider Uri? Talvez eu possa forçar o ContentResolver a usar o ContentProvider anteriormente para obter os dados da coluna necessária do cursor?

Eu realmente tenho que criar meu próprio ContentProvider aqui?

questionAnswers(1)

yourAnswerToTheQuestion