Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Erro ao abrir a câmera

@Override
 public void onClick(View v) {
     Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
     String caminhoFoto = getExternalFilesDir(null) + "/"+ System.currentTimeMillis() +".jpg";
     File arquivoFoto = new File(caminhoFoto);
    intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto));
    startActivity(intentCamera);
}



sempre da erro e sai do app quando clico na câmera 
5 respostas

quando você roda pela IDE ao debugar dá algum erro?

não da nenhum erro , mas ao usar no meu celular pois eu nao uso no emulador , sempre esta tudo ok só quando clico na na câmera que o app da uma mensagem que o app apresenta falhas constantes. ai sim aparece um erro no meu console do android studio .

E/AndroidRuntime: FATAL EXCEPTION: main Process: br.com.leco.agenda, PID: 30062 android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/br.com.leco.agenda/files/1542288485852.jpg exposed beyond app through ClipData.Item.getUri() at android.os.StrictMode.onFileUriExposed(StrictMode.java:1813) at android.net.Uri.checkFileUriExposed(Uri.java:2368) at android.content.ClipData.prepareToLeaveProcess(ClipData.java:832) at android.content.Intent.prepareToLeaveProcess(Intent.java:8957) at android.content.Intent.prepareToLeaveProcess(Intent.java:8942) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1583) at android.app.Activity.startActivityForResult(Activity.java:4228) at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767) at android.app.Activity.startActivityForResult(Activity.java:4187) at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754) at br.com.leco.agenda.FormularioActivity$1.onClick(FormularioActivity.java:55) at android.view.View.performClick(View.java:5612) at android.view.View$PerformClick.run(View.java:22285) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) Application terminated.

esse erro acontece apos eu tentar abrir a câmera

solução!

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

vou tentar aqui e qualquer coisa já aviso sobre o resultado. muito obrigado pela ajuda.

muito obrigado mesmo André Victor Ruiz Pedroso . salvou minha vida aqui . te agradeço mesmo pelo belo tutorial que me enviou. agora sim meu problema foi solucionado .

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software