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

Erro ao tentar acessar câmera.

Bom dia, estou usando a api 26 do android. Quando eu tento usar o código explicado na aula, está tendo falha na câmera. Pesquisei no google, e lá informa que deve ser usado FileProvider. Tem algum exemplo?

 Button botaoFoto = (Button) findViewById(R.id.formulario_botao_foto);
        botaoFoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ActivityCompat.checkSelfPermission(FormularioActivity.this, Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED ) {
                    ActivityCompat.requestPermissions(FormularioActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                } else {
                    Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    String caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg";
                    File arquivoFoto = new File(caminhoFoto);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto));
                    startActivity(intentCamera);
                }
            }
        });
6 respostas

Italo, tudo bem ?

Na própria solução do instrutor tem a solução para esse problema !

Também não estou conseguindo resolver o problema. Mesmo seguindo o que está escrito nas observações do autor, segue o erro do logcat:

10-19 00:57:31.227 24787-24793/? E/art: Failed sending reply to debugger: Broken pipe
10-19 00:57:40.687 24787-24787/br.com.ueder.agenda E/AndroidRuntime: FATAL EXCEPTION: main
                                                                     Process: br.com.ueder.agenda, PID: 24787
                                                                     java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.android.camera/.Camera clip={text/uri-list U:content://br.com.ueder.agenda.provider/external_files/Android/data/br.com.ueder.agenda/files/1508374660683.jpg} (has extras) } from ProcessRecord{674f2c9 24787:br.com.ueder.agenda/u0a72} (pid=24787, uid=10072) with revoked permission android.permission.CAMERA
                                                                         at android.os.Parcel.readException(Parcel.java:1684)
                                                                         at android.os.Parcel.readException(Parcel.java:1637)
                                                                         at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3101)
                                                                         at android.app.Instrumentation.execStartActivity(Instrumentation.java:1518)
                                                                         at android.app.Activity.startActivityForResult(Activity.java:4225)
                                                                         at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
                                                                         at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
                                                                         at android.app.Activity.startActivityForResult(Activity.java:4183)
                                                                         at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)

Segue o Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.ueder.agenda">
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <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">
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:grantUriPermissions="true"
            android:exported="false">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>
        <activity android:name=".ListaAlunosActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".FormularioActivity" android:label="@string/title_formulario"/>
    </application>

</manifest>

Método de captura:

btnFoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent vaiParaCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                String caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg";
                File arquivoFoto = new File(caminhoFoto);
                if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
                    vaiParaCamera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto));
                } else {
                    vaiParaCamera.putExtra(MediaStore.EXTRA_OUTPUT,
                            FileProvider.getUriForFile(FormularioActivity.this,
                                    BuildConfig.APPLICATION_ID + ".provider", arquivoFoto));
                }
                startActivity(vaiParaCamera);
            }
        });

Bom dia, eu não consegui achar onde ele explicar esse código. Em qual aula ele explica essa parte do código citado pelo Ueder Carlos Costa Caetano?

solução!

https://cursos.alura.com.br/course/android-studio-ii-integracoes-e-recursos/task/23374

Italo, quando você clica no botão Opinião do Autor, aparece um texto abaixo descrevendo como deve ser feito, e tem a observação dizendo que a partir do Android 7, muda a forma de ser feito. Porém, pra mim está dando o erro acima. Não sei se você conhece mas também tem esse:

http://ricardolecheta.com.br/?m=201611

Italo no meu eu descobri o meu erro, foi o suficiente remover essas permissões e o código funcionou.

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

Tente remover essa parte do seu código

 if (ActivityCompat.checkSelfPermission(FormularioActivity.this, Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED ) {
                    ActivityCompat.requestPermissions(FormularioActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                } else {

Declare essa parte no seu Manifest

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

E crie esse uma pasta com o nome xml dentro de res, logo em seguida crie um arquivo com o nome de provider_paths.xml. Edite o arquivo e deixe da seguinte forma:

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

E utilize esse código pra chamar a sua Intent

 Intent vaiParaCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    String caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg";
                    File arquivoFoto = new File(caminhoFoto);

                    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
                        Uri uri = Uri.fromFile(arquivoFoto);
                        vaiParaCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                    } else {
                        Uri uri = FileProvider.getUriForFile(FormularioActivity.this, getApplicationContext().getPackageName() + ".provider", arquivoFoto);
                        vaiParaCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                    }
                    startActivity(vaiParaCamera);

Creio que dessa forma deva funcionar.