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

Erro na Camera após a aula 2 (mesmo corrigindo pro código do Android 7)/ Apk Crashando

Erros ao fim da aula 2 com relação a câmera (no vídeo 1, que é só a criação de design tudo funcionou. No vídeo 2 aonde as funções do botão são implementadas e você pode tirar a foto de fato, só ao registrar a foto o apk parava de funcionar, a partir do vídeo 3 aonde a foto é salva na memoria, o apk nem executa mais e o emulador já abre dizendo que a agenda crashou se deseja abrir novamente. PS: Já segui as devidas correções e adaptações pro Android 7 e atualmente estou no Android 8 em minha maquina virtual.

Logcat: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. ... at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3621) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2862) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) at android.database.CursorWindow.nativeGetString(Native Method) at android.database.CursorWindow.getString(CursorWindow.java:438) at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) at com.tales.agenda.DAO.AlunoDAO.buscaAlunos(AlunoDAO.java:78) at com.tales.agenda.ListaAlunosActivity.carregaLista(ListaAlunosActivity.java:62) at com.tales.agenda.ListaAlunosActivity.onResume(ListaAlunosActivity.java:72) ...Linha relacionada ao AlunoDAO java 78: aluno.setFoto(c.getString(c.getColumnIndex("caminhoFoto")));

Relacionado ao ListaAlunos java 62: AlunoDAO dao = new AlunoDAO(this); List alunos = dao.buscaAlunos();

Relacionado ao ListaAlunos 72: carregaLista();

Codigo do AlunoDAO: public class AlunoDAO extends SQLiteOpenHelper { public AlunoDAO (Context context) { super(context, "Agenda", null, 1); } @Override public void onCreate (SQLiteDatabase db) { String sql = "CREATE TABLE Alunos (id INTEGER PRIMARY KEY, nome TEXT NOT NULL, endereco TEXT, telefone TEXT, site TEXT, nota REAL, caminhoFoto TEXT);"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql = ""; switch (oldVersion){ case 1: sql = "ALTER TABLE Alunos ADD COLUMN caminhoFoto TEXT"; } db.execSQL(sql); } public void insert(Aluno aluno) { SQLiteDatabase db = getWritableDatabase(); ContentValues dados = pegaDadosAluno(aluno); db.insert("Alunos", null, dados ); } @NonNull private ContentValues pegaDadosAluno(Aluno aluno) { ContentValues dados = new ContentValues(); dados.put("nome", aluno.getNome()); dados.put("endereco", aluno.getEndereco()); dados.put("telefone", aluno.getTelefone()); dados.put("site", aluno.getSite()); dados.put("nota", aluno.getNota()); dados.put("caminhoFoto", aluno.getFoto()); return dados; } public List buscaAlunos() { String sql = "SELECT * FROM Alunos;"; SQLiteDatabase db = getReadableDatabase(); Cursor c = db.rawQuery(sql, null); List alunos = new ArrayList(); while (c.moveToNext()) { Aluno aluno = new Aluno(); aluno.setId(c.getLong(c.getColumnIndex("id"))); aluno.setNome(c.getString(c.getColumnIndex("nome"))); aluno.setEndereco(c.getString(c.getColumnIndex("endereco"))); aluno.setTelefone(c.getString(c.getColumnIndex("telefone"))); aluno.setSite(c.getString(c.getColumnIndex("site"))); aluno.setNota(c.getDouble(c.getColumnIndex("nota"))); aluno.setFoto(c.getString(c.getColumnIndex("caminhoFoto")));

alunos.add(aluno); } //fecha conexao com o banco de dados c.close(); //retorna os alunos colhidos return alunos; } public void delet(Aluno aluno) { SQLiteDatabase db = getWritableDatabase(); String [] params = {String.valueOf(aluno.getId())};injection passando uma lista de parametros por string db.delete("Alunos", "id = ?", params); } public void alter(Aluno aluno) { SQLiteDatabase db = getWritableDatabase();

ContentValues dados = pegaDadosAluno(aluno);

String[] params ={aluno.getId().toString()}; db.update("Alunos", dados, "id = ?", params); } }

3 respostas

Codigo Lista Alunos:

public class ListaAlunosActivity extends AppCompatActivity { private ListView listaAlunos;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_lista_alunos);

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

listaAlunos.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> lista, View item, int posicao, long id) { Aluno aluno = (Aluno) listaAlunos.getItemAtPosition(posicao);

Intent vaiProFormulario = new Intent(ListaAlunosActivity.this, FormularioActivity.class); vaiProFormulario.putExtra("aluno", aluno); startActivity(vaiProFormulario); } });

Button novoAluno = (Button) findViewById(R.id.lista_alunos_novoAluno); novoAluno.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { Intent vaiProFormulario = new Intent(ListaAlunosActivity.this,FormularioActivity.class); startActivity(vaiProFormulario); } });

registerForContextMenu(listaAlunos); }

private void carregaLista() { AlunoDAO dao = new AlunoDAO(this); List alunos = dao.buscaAlunos(); dao.close();

listaAlunos = (ListView) findViewById(R.id.lista_alunos_listaAlunos); ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, alunos); listaAlunos.setAdapter(adapter); }

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

@Override public void onCreateContextMenu(ContextMenu menu, View v, final ContextMenu.ContextMenuInfo menuInfo) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;

final Aluno aluno = (Aluno) listaAlunos.getItemAtPosition(info.position);

MenuItem itemLigar = menu.add("Ligar para " + aluno.getNome()); itemLigar.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { 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 para " + aluno.getNome()); Intent intentSMS = new Intent(Intent.ACTION_VIEW);

intentSMS.setData(Uri.parse("sms:" + aluno.getTelefone())); itemSMS.setIntent(intentSMS);

MenuItem itemMapa = menu.add("Visualizar " + aluno.getNome() + " 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 do(a) " + aluno.getNome()); Intent intentSite = new Intent(Intent.ACTION_VIEW);

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

intentSite.setData(Uri.parse(site)); itemSite.setIntent(intentSite);

MenuItem deletar = menu.add("Deletar " + aluno.getNome()); deletar.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { AlunoDAO dao = new AlunoDAO(ListaAlunosActivity.this); dao.delet(aluno); dao.close();

carregaLista(); return false; } }); } }

Codigo Formulario Activity:

public class FormularioActivity extends AppCompatActivity {

public static final int CODIGO_CAMERA = 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.getId() != null){ helper.preencheFormulario(aluno); } Button botaoFoto = (Button) findViewById(R.id.formulario_botao_foto); botaoFoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg"; File arquivoFoto = new File(caminhoFoto); intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(FormularioActivity.this, BuildConfig.APPLICATION_ID + ".provider", arquivoFoto)); startActivityForResult(intentCamera, CODIGO_CAMERA); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == Activity.RESULT_OK){ if (requestCode == CODIGO_CAMERA){ helper.carregaImagem(caminhoFoto); } } super.onActivityResult(requestCode, resultCode, data); }

@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.alter(aluno); } else { dao.insert(aluno); } dao.close(); Toast.makeText(FormularioActivity.this, "Aluno " + aluno.getNome() + " salvo!", Toast.LENGTH_SHORT).show();

finish(); break; } return super.onOptionsItemSelected(item); } }

solução!

Oi Tales, tudo bem ?

Acho que a dúvida seja duplicada, naquela que estou te ajudando. Vou fechar essa e te ajudar por lá, combinado ?