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

Usando a Câmera

Ao executar o projeto, ele chega a abrir, porém, ao tentar abrir a câmera, o seguinte erro é exibido no Android Studio:

FATAL EXCEPTION: main
                                                                   Process: org.noctus.agenda, PID: 12042
                                                                   android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/org.noctus.agenda/files/1470173604586.jpg exposed beyond app through ClipData.Item.getUri()
                                                                       at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
                                                                       at android.net.Uri.checkFileUriExposed(Uri.java:2346)
                                                                       at android.content.ClipData.prepareToLeaveProcess(ClipData.java:832)
                                                                       at android.content.Intent.prepareToLeaveProcess(Intent.java:8909)
                                                                       at android.content.Intent.prepareToLeaveProcess(Intent.java:8894)
                                                                       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517)
                                                                       at android.app.Activity.startActivityForResult(Activity.java:4224)
                                                                       at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48)
                                                                       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75)
                                                                       at android.app.Activity.startActivityForResult(Activity.java:4183)
                                                                       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:871)
                                                                       at org.noctus.agenda.FormularioActivity$1.onClick(FormularioActivity.java:52)
                                                                       at android.view.View.performClick(View.java:5609)
                                                                       at android.view.View$PerformClick.run(View.java:22259)
                                                                       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:6077)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

Como resolver???

OBS: Até a aula 2 estava funcionando e camera abrindo.

6 respostas

Oi Rafael, tudo bem ?

Quando você está tratando o retorno da camera, você não está verificando se o resultado deu certo, no caso se o resultCode é igual a Result_Ok.

Além disso, pode tirar uma dúvida ? Qual é a versão que você está usando para desenvolver ? API 23 ou 24 ?

Aguardo retorno !

Acabei de ver aqui Rafael, que você já mandou as informações hehe

Cara, na versão 24, que o Android N, a galera do Google mudou algumas coisinhas.

Segundo a documentação, não podemos mais passar o caminho direto para outras aplicações, pois elas podem ter a ausência da permissão READ_EXTERNAL_STORAGE, por esse motivo não podemos passar file:// que é o que passamos ao invocarmos o método getExternalFilesDir(null).

A partir do Android N e das versões superiores teremos que utilizar um outro cara para fazer esse trabalho para nós, vamos ter que passar da mesma forma uma Uri para armazenar a foto.

Para criar essa Uri agora vamos usar um outro método, getUriForFile(), da classe FileProvider. Este método vai receber três parâmetros, o primeiro é um Context que serve para identificar o componente atual. Depois vamos passar uma String, a partir dessa String ele tirará todas as permissões necessárias fazer a inserção. E por último vai precisar receber o próprio arquivo, em File, para conseguir armazenar.

Dessa forma você teria algo do gênero :


Uri caminhoArmazenar = getUriForFile(this, "br.com.caelum.permissao", arquivo);

Além do código você terá que fazer algumas mudanças para que tudo funcione, inicialmente você precisa definir que aquela String realmente passa para outros aplicativos a permissão, para isso temos que adicionar uma nova propriedade no nosso manifest :

<manifest>
    ...
    <application>
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="br.com.caelum.permissao"
            android:exported="false"
            android:grantUriPermissions="true">
            ...
        </provider>
        ...
    </application>
</manifest>

O atributo grantUriPermissions libera a permissão para os demais aplicativos !

Fazendo essa refatoração, deve funcionar !

Espero ter ajudado !

Qualquer coisa, estamos a disposição

Abraços :D

Agora retornou o seguinte erro:

FATAL EXCEPTION: main
    Process: org.noctus.agenda, PID: 13891
    java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider: java.lang.IllegalArgumentException: Missing android.support.FILE_PROVIDER_PATHS meta-data
       at android.app.ActivityThread.installProvider(ActivityThread.java:5814)
       at android.app.ActivityThread.installContentProviders(ActivityThread.java:5403)
       at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5342)
       at android.app.ActivityThread.-wrap2(ActivityThread.java)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6077)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
    Caused by: java.lang.IllegalArgumentException: Missing android.support.FILE_PROVIDER_PATHS meta-data
       at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:564)
       at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:535)
       at android.support.v4.content.FileProvider.attachInfo(FileProvider.java:353)
       at android.app.ActivityThread.installProvider(ActivityThread.java:5811)
       at android.app.ActivityThread.installContentProviders(ActivityThread.java:5403) 
       at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5342) 
       at android.app.ActivityThread.-wrap2(ActivityThread.java) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:154) 
       at android.app.ActivityThread.main(ActivityThread.java:6077) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
solução!
  • FormularioActivity.java

    // ...
    Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File caminhoFoto = new File(getApplicationContext().getFilesDir(), "images");
    File arquivoFoto = new File(caminhoFoto, System.currentTimeMillis() + ".jpg");
    Uri caminhoArmazenar = FileProvider.getUriForFile(getApplicationContext(), "org.noctus.permissao", arquivoFoto);
    intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, caminhoArmazenar);
    startActivity(intentCamera);
  • AndroidManifest.xml

<manifest>
    <application>
        <provider
            android:authorities="org.noctus.permissao"
            android:name="android.support.v4.content.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>
        </provider>
    </application>
</manifest>
    ...
</application
  • file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="my_images" path="images"/>
</paths>

Porém.... rs

ImageView foto = (ImageView) findViewById(R.id.formulario_foto);
Bitmap bitmap = BitmapFactory.decodeFile(String.valueOf(arquivoFoto));
Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap, 300, 300, true);
foto.setImageBitmap(bitmapReduzido);

me retorna o seguinte:

08-03 14:14:43.913 14233-14233/org.noctus.agenda E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /data/user/0/org.noctus.agenda/files/images/1470244476139.jpg (No such file or directory)

Rafael,

Tenta fazer criar a instância de File da forma que estavámos fazendo antes, pois é daquela forma que criamos o arquivo e você não pode passar o caminho absoluto, por isso precisamos utilizar o getUriForFile(), que terá o caminho direto mas invés de passar como file:// passará content://

Faz esse teste e avisa nos avise, solicito apenas que abra outro tópico por gentileza !

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