Se o seu targetSdkVersion> = 24, então temos que usar a classe FileProvider para dar acesso ao arquivo específico ou pasta para torná-los acessíveis para outros aplicativos. Criamos nossa própria classe herdando o FileProvider para garantir que nosso FileProvider não esteja em conflito com FileProviders declarados em dependências importadas, conforme descrito aqui.
Etapas para substituir file: // URI por content: // URI:
Adicione uma classe que estenda o FileProvider
public class GenericFileProvider extends FileProvider {}
Adicione uma tag FileProvider <provider> no AndroidManifest.xml na tag <application>. Especifique uma autoridade exclusiva para o atributo android: authority para evitar conflitos, as dependências importadas podem especificar $ {applicationId} .provider e outras autoridades comumente usadas.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
<application
...
<provider
android:name=".GenericFileProvider"
android:authorities="${applicationId}.my.package.name.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
</manifest>
Em seguida, crie um arquivo provider_paths.xml na pasta res / xml. A pasta pode ser necessária para ser criada, se não existir. O conteúdo do arquivo é mostrado abaixo. Ele descreve que gostaríamos de compartilhar o acesso ao Armazenamento Externo na pasta raiz (path = ".") Com o nome external_files.
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="."/>
</paths>
O último passo é mudar esta linha de código abaixo
Uri photoURI = Uri.fromFile(createImageFile());
para
Uri photoURI = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".my.package.name.provider", createImageFile());
Se você estiver usando uma intenção de fazer o sistema abrir seu arquivo, você pode precisar adicionar a seguinte linha de código:
intent.addFlags (Intent.FLAG_GRANT_READ_URI_PERMISSION);
Mais informações em https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en