Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Erro ao abrir câmera

Boa noite, Tentei atualizar o código, usando o novo curso de android e agora implementando a câmera, mas ainda não consegui fazer funcionar mesmo com os tópicos já discutidos. Continuo recebendo Crash ao acionar o botão e não identifiquei meu erro ainda. Seguem os códigos:

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_formulario_aluno);
        inicializacaoDosCampos();
        carregaAluno();

        Button botaoCamera = (Button) findViewById(R.id.activity_formulario_aluno_botao_foto);

        botaoCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent vaiParaCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg";
                File arquivoFoto = new File(caminhoFoto);
                Uri fotoURI = FileProvider.getUriForFile(FormularioAlunoActivity.this, BuildConfig.APPLICATION_ID + ".provider", arquivoFoto);
                vaiParaCamera.putExtra(MediaStore.EXTRA_OUTPUT, fotoURI);
                startActivityForResult(vaiParaCamera, CODIGO_CAMERA);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == CODIGO_CAMERA) {
            if (resultCode == RESULT_OK) {

                Bitmap bm = BitmapFactory.decodeFile(caminhoFoto);
                bm = Bitmap.createScaledBitmap(bm, 100, 100, true);
                ImageView foto = (ImageView) findViewById(R.id.activity_formulario_aluno_foto);
                foto.setImageBitmap(bm);
                foto.setScaleType(ImageView.ScaleType.FIT_XY);

            }
        }
    }

Manifest (aqui recebo erro quando uso o android:name como v4, então usei essa versão do androidX que vi como sugestão em algum tópico)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="br.com.alura.agenda"
    tools:ignore="GoogleAppIndexingWarning">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:name=".AgendaApplication"
        tools:ignore="AllowBackup">
        <activity android:name=".ui.activity.ListaAlunosActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".ui.activity.FormularioAlunoActivity"/>


        <provider
            android:name="androidx.core.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>
    </application>

</manifest>
7 respostas

Aqui a lista de erros no Logcat

2020-01-14 22:54:50.739 9291-9321/br.com.alura.agenda E/eglCodecCommon: GoldfishAddressSpaceHostMemoryAllocator: ioctl_ping failed for device_type=5, ret=-1
2020-01-14 22:54:57.125 9291-9291/br.com.alura.agenda E/AndroidRuntime: FATAL EXCEPTION: main
    Process: br.com.alura.agenda, PID: 9291
    android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/br.com.alura.agenda/files/1579049697116.jpg exposed beyond app through ClipData.Item.getUri()
        at android.os.StrictMode.onFileUriExposed(StrictMode.java:1978)
        at android.net.Uri.checkFileUriExposed(Uri.java:2371)
        at android.content.ClipData.prepareToLeaveProcess(ClipData.java:963)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:10216)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:10201)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1667)
        at android.app.Activity.startActivityForResult(Activity.java:4586)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
        at android.app.Activity.startActivityForResult(Activity.java:4544)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
        at android.app.Activity.startActivity(Activity.java:4905)
        at android.app.Activity.startActivity(Activity.java:4873)
        at br.com.alura.agenda.ui.activity.FormularioAlunoActivity$1.onClick(FormularioAlunoActivity.java:78)
        at android.view.View.performClick(View.java:6597)
        at android.view.View.performClickInternal(View.java:6574)
        at android.view.View.access$3100(View.java:778)
        at android.view.View$PerformClick.run(View.java:25885)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Oi Thiago, você pode disponibilizar o projeto completo no GitHub por favor? Assim eu consigo testar tudo. Pode me dizer também qual versão do android está usando para rodar seu aplicativo?

Olá Wanderson,

Coloquei o código no GitHub https://github.com/FrancaThiago/Dividendo

Quando testo no meu dispositivo, a versão do android é a 8.0.0

E quando simulo com o emulador, com a API 28.

Já peço desculpas pela confusão, estou testando e desenvolvendo algumas ideias que estão no meio do projeto, mas a parte da câmera continua ali hehe. A principio ela está na tela de formulário do aluno/pessoa.

OI Thiago, investiguei o problema e acontece que o seu provider tá configurado para prover um acesso ao external-path, e você tá querendo usar o método getExternalFilesDir, que precisa na verdade de um provider do tipo external-files-path. (alterar isso no seu provider_paths.xml)

Depois disso, você vai ter um problema de permissão, para burlar essa parte sem codificar todo o processo de pedir permissão, você pode ir nas informações do seu aplicativo direto no emulador e permitir o uso do storage e da camera manualmente.

Seria só alterar dentro do provider_paths assim:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="external_files" path="."/>
</paths>

Ativei as permissões, mas mesmo assim o app deu crash ao clicar no botão. Talvez por alguma outra besteira que eu já tinha feito no código hehe. A principio demonstrou o seguinte erro:

    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
        at androidx.core.content.FileProvider.parsePathStrategy(FileProvider.java:605)
        at androidx.core.content.FileProvider.getPathStrategy(FileProvider.java:579)
        at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:417)
        at br.com.alura.agenda.ui.activity.FormularioAlunoActivity$1.onClick(FormularioAlunoActivity.java:67)

Sendo minha linha 67 dentro do OnClick

public void onClick(View v) {
                Intent vaiParaCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg";
                File arquivoFoto = new File(caminhoFoto);
                Uri fotoURI = FileProvider.getUriForFile(FormularioAlunoActivity.this, BuildConfig.APPLICATION_ID + ".provider", arquivoFoto);
                vaiParaCamera.putExtra(MediaStore.EXTRA_OUTPUT, fotoURI);
                startActivityForResult(vaiParaCamera, CODIGO_CAMERA);
            }
solução

Ah, vê se o import do BuildConfig é do pacote import br.com.alura.agenda.BuildConfig;. Por que por algum motivo, o import tava incorreto no projeto.

O seu tá: import android.support.constraint.BuildConfig;

Deu certo, também não faço ideia de porque estava assim.

Muito obrigado pela força.