6
respostas

App Agenda não abre a lista de alunos e não rotaciona as fotos.

Olá, vejam se vocês conseguem encontrar o problema.Eu faço o debug pra rodar no meu celular mas o app não consegue abrir o ListaAlunosActivity, dentro do AndroidManifest já coloquei a para abrir o lista alunos inicialmente android:theme="@style/AppTheme">

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity> e mesmo assim dá um problema de Crash.Também não consigo rotacionar a foto do aluno para ser exibida na lista corretamente.Aí estão os códigos abaixo:
6 respostas

import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.ContextMenu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListView; import java.util.List;

import br.com.alura.agenda.adapter.AlunosAdapter; import br.com.alura.agenda.dao.AlunoDAO; import br.com.alura.agenda.modelo.Aluno;

public class ListaAlunosActivity extends AppCompatActivity { //Activity é uma tela //Toda vez q quiser ter uma tela, é preciso usar Activity

private ListView listaAlunos;
private Aluno aluno;
private FormularioHelper helper;

@Override
protected void onCreate(Bundle savedInstanceState) {//metodo onCreate é chamado pelo android
    //quando for criar a tela para ser exibida
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lista_alunos);// R é uma classe que é usada para se
    //referir a pasta res = resoucers;

    listaAlunos = (ListView) findViewById(R.id.lista_alunos);

    listaAlunos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Aluno aluno = (Aluno)  listaAlunos.getItemAtPosition(position);
            Intent intentVaiProFormulario = new Intent(ListaAlunosActivity.this, FormularioActivity.class);
            intentVaiProFormulario.putExtra("aluno", aluno);
            startActivity(intentVaiProFormulario);
        }
    });


    Button novoAluno = (Button) findViewById(R.id.novo_aluno);
    novoAluno.setOnClickListener((v) -> {
        Intent intentVaiProFormulario = new Intent(ListaAlunosActivity.this, FormularioActivity.class);
        startActivity(intentVaiProFormulario);
    });

    registerForContextMenu(listaAlunos);
}

/*O codigo do ListaStudents foi modificado para poder criar o bitmap e
 rotacionar as fotos toda vez que for chamar a Lista de estudantes*/
@NonNull
private ListView carregaLista() {
    AlunoDAO dao = new AlunoDAO(this);
    List<Aluno> alunos = dao.buscaAlunos();
    dao.close();
    helper.carregaImagem(aluno.getCaminhoFoto());/* Carregando foto rotacionada novamente para poder exibir na lista*/

    AlunosAdapter adapter = new AlunosAdapter(this, alunos);
    listaAlunos.setAdapter(adapter);
    return listaAlunos;
}

@Override
protected void onResume() {
    super.onResume();
    ListView listaAlunos = carregaLista();
}

@Override
// O ContextMenuInfo É  quem vai dizer qual item da lista foi clicado para gerar um ContextMenu
//Para isso, precisaremos informar que o ContextMenuInfo é um adapter
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)  {

    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
    final Aluno aluno = (Aluno) listaAlunos.getItemAtPosition(info.position);//declarando aluno como constante usando final

    MenuItem itemLigar = menu.add("Ligar");
    itemLigar.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            if (ActivityCompat.checkSelfPermission(ListaAlunosActivity.this, Manifest.permission.CALL_PHONE)
                    != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(ListaAlunosActivity.this,new String[]{Manifest.permission.CALL_PHONE}, 123);

            } else{
                Intent intentLigar = new Intent(Intent.ACTION_CALL);
                intentLigar.setData(Uri.parse("tel:" + aluno.getTelefone()));
                startActivity(intentLigar);
            }
            return false;
        }
    });

    MenuItem itemSMS = menu.add("Enviar SMS");
    Intent intentSMS = new Intent(Intent.ACTION_VIEW) ;
    intentSMS.setData(Uri.parse("sms:" + aluno.getTelefone()));
    itemSMS.setIntent(intentSMS);

    MenuItem itemMapa = menu.add("Visualizar no mapa");
    Intent intentMapa = new Intent(Intent.ACTION_VIEW);
    intentMapa.setData(Uri.parse("geo:0,0?q=" + aluno.getEndereco()));
    itemMapa.setIntent(intentMapa);

    MenuItem itemSite = menu.add("Visitar site");
    Intent intentSite = new Intent(Intent.ACTION_VIEW);

String site = aluno.getSite(); if(!site.startsWith("https://")) { site = "https://" + site; }

    intentSite.setData(Uri.parse(site));// Usa-se putExtra() quando o parâmetro é um dado opcional, o setData() é quando o dado é obrigatório
    itemSite.setIntent(intentSite);


    MenuItem deletar = menu.add("Deletar");//ADD COMMENTS

    deletar.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {

            AlunoDAO dao = new AlunoDAO(ListaAlunosActivity.this);
            dao.deleta(aluno);//Quando uma variável é usada numa classe anônima, é necessário declara-la como constant usando final
            // fora da classe anônima
            dao.close();
            carregaLista();//Como não saímos da Activity, não podemos depender apenas do ciclo
            // de vida da activity, teremos que chamar o método carregaLista.
            return false;
        }
    });
}

}

E aqui estão os códigos do FormulárioActivity e do CarregadorDeFoto que serve para rotacionar as fotos dos alunos:

import android.app.Activity; import android.content.Intent; import android.provider.MediaStore; import android.support.v4.content.FileProvider; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.File;

import br.com.alura.agenda.dao.AlunoDAO; import br.com.alura.agenda.modelo.Aluno;

public class FormularioActivity extends AppCompatActivity {

public static final int CODIGO_CAMERA = 123;//condigo anterior 567
private FormularioHelper helper;
private String caminhoFoto;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_formulario);
    helper = new FormularioHelper(this);

    Intent intent = getIntent();
    Aluno aluno = (Aluno)  intent.getSerializableExtra("aluno");
    if (aluno !=null) {
        helper.preencheFormulario(aluno);
    }

    Button botaoFoto = (Button) findViewById(R.id.formulario_botao_foto);
    botaoFoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tiraFoto();
        }
    });
}

/* Acrescentei o método tiraFoto() no codigo da ListaStudentsActivity.*/
public void tiraFoto() {

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

    // essa parte muda no Android 7, estamos construindo uma URI
    // para acessar a foto utilizando o FileProvider
    intent.putExtra(MediaStore.EXTRA_OUTPUT,
            FileProvider.getUriForFile(this,
                    BuildConfig.APPLICATION_ID + ".provider", arquivoFoto));

    startActivityForResult(intent, 123);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == CODIGO_CAMERA && resultCode == Activity.RESULT_OK) {
        helper.carregaImagem(caminhoFoto);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_formulario, menu);

    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case R.id.menu_formulario_ok:

            Aluno aluno = helper.pegaAluno();
            AlunoDAO dao = new AlunoDAO(this);
            if (aluno.getId() != null)  {
                dao.altera(aluno);
            } else {
                dao.insere(aluno);
            }

            dao.close();
            //Criaremos uma classe Toast que deve ser acompanhada do método makeText,
            // este último pede alguns parâmetros, por exemplo, um contexto
            Toast.makeText(FormularioActivity.this, "Aluno " + aluno.getNome() + " salvo!”", Toast.LENGTH_SHORT).show();
            finish();
            break;
    }
    return super.onOptionsItemSelected(item);
}

}

import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.media.ExifInterface; import java.io.IOException;

/**

  • Created by Thanatos on 05/02/2019. */

public class CarregadorDeFoto {

public static Bitmap carrega(String caminhoFoto) {

    ExifInterface exif = null;
    try {
        exif = new ExifInterface(caminhoFoto);
    } catch (IOException e) {
        e.printStackTrace();
    }
    String orientacao = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
    int codigoOrientacao = Integer.parseInt(orientacao);

    switch (codigoOrientacao) {
        case ExifInterface.ORIENTATION_NORMAL:
            return abreFotoERotaciona(caminhoFoto, 0);
        case ExifInterface.ORIENTATION_ROTATE_90:
            return abreFotoERotaciona(caminhoFoto, 90);
        case ExifInterface.ORIENTATION_ROTATE_180:
            return abreFotoERotaciona(caminhoFoto, 180);
        case ExifInterface.ORIENTATION_ROTATE_270:
            return abreFotoERotaciona(caminhoFoto, 270);
        default:
            return abreFotoERotaciona(caminhoFoto, 0);
    }
}

private static Bitmap abreFotoERotaciona(String caminhoFoto, int angulo) {
    // Abre o bitmap a partir do caminho da foto
    Bitmap bitmap = BitmapFactory.decodeFile(caminhoFoto);

    // Prepara a operação de rotação com o ângulo escolhido
    Matrix matrix = new Matrix();
    matrix.postRotate(angulo);

    // Cria um novo bitmap a partir do original já com a rotação aplicada
    return Bitmap.createBitmap(bitmap, 0, 0,
            bitmap.getWidth(), bitmap.getHeight(),
            matrix, true);
}

}

Por favor me ajudem.Eu adoro programar com java, gosto de programar para Android, mas esta ferramente Android Studio É UM LIXO.Sempre dá algum tipo de problema imbecil.Se conseguirem encontrar o erro, ficarei muito agradecido.

Oi Antonio, tudo bem? Você tem o projeto disponível para a gente analisar dentro da IDE e testar? Olhar todo esse código aqui no texto puro não é muito prático :(