>

Fórum

Fórum da RL System, voltado para analistas, programadores etc. Tudo sobre linguagem de programação e desenvolvimento Full Stack: Banco de Dados, Android, C#, Java, .NET, PHP, Node, Javascript, TypeScript, Front, HTML e muito mais.



Erro curso android avançado


Pessoal, estou com um erro que encontrei assistindo ao final da segunda aula do curso de android avanaçado.

O erro acontece quando tento salvar a venda.

quando clico no botão salvar o app da erro e volta para a tela principal e meu logcat retorna isso:

"java.lang.IllegalStateException: Could not execute method of the activity"

o que seria isso??

segue meu NovaVendaActivity.class


package com.example.vendas2;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteCursor;
import android.database.sqlite.SQLiteDatabase;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.Toast;


public class NovaVendaActivity extends ActionBarActivity implements LocationListener {

private double la;
private double lo;

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

Spinner spProdutos = (Spinner)findViewById(R.id.spProdutos);

SQLiteDatabase db = openOrCreateDatabase("vendas.db", Context.MODE_PRIVATE, null);

Cursor cursor = db.rawQuery("SELECT *FROM produtos ORDER BY nome ASC", null);

String[] from = { "_id", "nome", "preco" };
int [] to = {R.id.txvID, R.id.txvNome, R.id.txvPreco, };

SimpleCursorAdapter ad = new SimpleCursorAdapter(getBaseContext(), R.layout.spinner, cursor, from, to);

spProdutos.setAdapter(ad);

db.close();

}

public void Salvar_Click(View view){

LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
la = location.getLatitude();
lo = location.getLongitude();

SQLiteDatabase db = openOrCreateDatabase("vendas.db", Context.MODE_PRIVATE, null);

Spinner spProdutos = (Spinner)findViewById(R.id.spProdutos);

SQLiteCursor dados = (SQLiteCursor) spProdutos.getAdapter().getItem(spProdutos.getSelectedItemPosition());

//inserindo os dados no banco
ContentValues ctv = new ContentValues();
ctv.put("produto", dados.getInt(0));
ctv.put("preco", dados.getDouble(2));
ctv.put("la", la);
ctv.put("lo", lo);

if(db.insert("vendas", "_id", ctv) > 0){
Toast.makeText(getBaseContext(), "Sucesso", Toast.LENGTH_LONG).show();
}
}

@Override
public void onLocationChanged(Location location) {
//la = location.getLatitude();
//lo = location.getLongitude();

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub

}

@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub

}
}









6 Respostas


Não sei se resolve mas segue o meus arquivos

MainActivity.java e ListarVendasActivity.java


package com.example.vendas2;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.os.Build;

public class MainActivity extends ActionBarActivity {

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

SQLiteDatabase db = openOrCreateDatabase("vendas.db", Context.MODE_PRIVATE, null);

StringBuilder sqlProdutos = new StringBuilder();
sqlProdutos.append("CREATE TABLE IF NOT EXISTS [produtos](");
sqlProdutos.append("[_id] INTEGER PRIMARY KEY AUTOINCREMENT, ");
sqlProdutos.append("nome varchar(100), ");
sqlProdutos.append("preco DOUBLE(10,2));");
db.execSQL(sqlProdutos.toString());

db.execSQL("INSERT INTO produtos(nome, preco) VALUES ('Coca Cola', '2.50')");
db.execSQL("INSERT INTO produtos(nome, preco) VALUES ('Red Bull', '6.50')");

StringBuilder sqlVendas = new StringBuilder();
sqlVendas.append("CREATE TABLE IF NOT EXISTS [vendas](");
sqlVendas.append("[_id] INTEGER PRIMARY KEY AUTOINCREMENT, ");
sqlVendas.append("produto INTEGER,");
sqlVendas.append("preco DOUBLE(10,2),");
sqlVendas.append("la DOUBLE(10,9),");
sqlVendas.append("lo DOUBLE(10,9));");
db.execSQL(sqlVendas.toString());

db.close();

if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}


//outra maneira de fazer click do botão
/*public void NovaVenda_Click(View v){
Intent itent = new Intent(MainActivity.this, NovaVendaActivity.class);
startActivity(itent);
}*/


public void NovaVenda_Click(View v){
startActivity(new Intent(getBaseContext() ,NovaVendaActivity.class));
}

public void ListarVendas_Click(View v){
startActivity(new Intent(getBaseContext() ,ListarVendasActivity.class));
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {

public PlaceholderFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
}

}




package com.example.vendas2;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.app.ActionBarActivity;
import android.widget.ListView;

public class ListarVendasActivity extends ActionBarActivity {

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


SQLiteDatabase db = openOrCreateDatabase("vendas.db", Context.MODE_PRIVATE, null);

ListView ltwVendas = (ListView)findViewById(R.id.ltwVendas);


Cursor cursor = db.rawQuery("SELECT vendas._id, vendas.preco, vendas.la, vendas.lo, produtos.nome "
"FROM vendas INNER JOIN produtos on produtos._id = vendas.produto", null);

String[] from = { "_id", "preco", "nome", "la", "lo" };
int [] to = {R.id.txvID, R.id.txvPreco, R.id.txvPreco, R.id.txvListarLA, R.id.txvListarLO};

SimpleCursorAdapter ad = new SimpleCursorAdapter(getBaseContext(), R.layout.model_listar, cursor, from, to);

ltwVendas.setAdapter(ad);

db.close();


}
}




Segue também o LogCat, se alguém puder dar uma luz... estou ansioso para continuar o curso


05-19 03:13:16.560: W/dalvikvm(3100): threadid=1: thread exiting with uncaught exception (group=0xb3aa7ba8)
05-19 03:13:16.590: E/AndroidRuntime(3100): FATAL EXCEPTION: main
05-19 03:13:16.590: E/AndroidRuntime(3100): Process: com.example.vendas2, PID: 3100
05-19 03:13:16.590: E/AndroidRuntime(3100): java.lang.IllegalStateException: Could not execute method of the activity
05-19 03:13:16.590: E/AndroidRuntime(3100): at android.view.View$1.onClick(View.java:3823)
05-19 03:13:16.590: E/AndroidRuntime(3100): at android.view.View.performClick(View.java:4438)
05-19 03:13:16.590: E/AndroidRuntime(3100): at android.view.View$PerformClick.run(View.java:18422)
05-19 03:13:16.590: E/AndroidRuntime(3100): at android.os.Handler.handleCallback(Handler.java:733)
05-19 03:13:16.590: E/AndroidRuntime(3100): at android.os.Handler.dispatchMessage(Handler.java:95)
05-19 03:13:16.590: E/AndroidRuntime(3100): at android.os.Looper.loop(Looper.java:136)
05-19 03:13:16.590: E/AndroidRuntime(3100): at android.app.ActivityThread.main(ActivityThread.java:5017)
05-19 03:13:16.590: E/AndroidRuntime(3100): at java.lang.reflect.Method.invokeNative(Native Method)
05-19 03:13:16.590: E/AndroidRuntime(3100): at java.lang.reflect.Method.invoke(Method.java:515)
05-19 03:13:16.590: E/AndroidRuntime(3100): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-19 03:13:16.590: E/AndroidRuntime(3100): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-19 03:13:16.590: E/AndroidRuntime(3100): at dalvik.system.NativeStart.main(Native Method)
05-19 03:13:16.590: E/AndroidRuntime(3100): Caused by: java.lang.reflect.InvocationTargetException
05-19 03:13:16.590: E/AndroidRuntime(3100): at java.lang.reflect.Method.invokeNative(Native Method)
05-19 03:13:16.590: E/AndroidRuntime(3100): at java.lang.reflect.Method.invoke(Method.java:515)
05-19 03:13:16.590: E/AndroidRuntime(3100): at android.view.View$1.onClick(View.java:3818)
05-19 03:13:16.590: E/AndroidRuntime(3100): ... 11 more
05-19 03:13:16.590: E/AndroidRuntime(3100): Caused by: java.lang.NullPointerException
05-19 03:13:16.590: E/AndroidRuntime(3100): at com.example.vendas2.NovaVendaActivity.Salvar_Click(NovaVendaActivity.java:61)
05-19 03:13:16.590: E/AndroidRuntime(3100): ... 14 more




Olá

Veja se este objeto não está retornando NULL


Location location = locationManager.getLastKnownLocation(provider);


Ex:

if (location == null){
Log.d("NovaVendaActivity", "ESTÁ NULLL");
}

Se estiver NULL, veja a ultima vídeo aula do curso, onde explicado uma solução.




Realmente, ao que me parece está retornando null, não usei o Log.d para testar fiz um try catch em:


public void Salvar_Click(View view){

LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);


try {

la = location.getLatitude();
lo = location.getLongitude();

} catch(Exception e) {
e.printStackTrace();
}


e ele salva com sucesso as informações, mas o porque desse erro? está exatamente como no código original da video aula... vou dar uma olhada na ultima video aula




consegui resolver após ver a última vídeo-aula, não sei se implementei da maneira correta mas resolvi da seguinte maneira (segue o pedaço do método Salvar_Click:


public void Salvar_Click(View view){

lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

String provider = "gps";

lm.requestLocationUpdates(provider, 4000, 0, this);

Location location = lm.getLastKnownLocation(provider);

la = location.getLatitude();
lo = location.getLongitude();




Opa

Exatamente como o moderador informou.

Ele retorna NULL por que você não tinha uma localização conhecida.

Por exemplo, se você estiver em uma rua X e não pedir updates, ele vai retornar seu último local.

Como você não tinha local, veio NULL.