I'm developing an application that has a form where the user can attach a photo next to the form. But I'm having trouble implementing this. In my APK I have already captured the image, converted to base 64 and sent via Rest to my service.
public void tirarFoto(View view){
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if(data != null){
Bundle bundle = data.getExtras();
if(bundle != null){
Bitmap img = (Bitmap) bundle.get("data");
Toast toast = Toast.makeText(getApplicationContext(), "Foto anexada", Toast.LENGTH_LONG);
toast.show();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
img.compress(Bitmap.CompressFormat.JPEG, 100, stream);
foto = Base64.encodeToString(stream.toByteArray(), Base64.DEFAULT);
}
}
}
public void registerForms() {
final String address = frua.getText().toString().trim();
final String district = fbairro.getText().toString().trim();
final String city = fcidade.getText().toString().trim();
final String email = femail.getText().toString().trim();
final String complement = fcompl.getText().toString().trim();
final String state = festado.getText().toString().trim();
final String note = fobs.getText().toString().trim();
final String countries = fpais.getText().toString().trim();
progressDialog = ProgressDialog.show(DenunciaActivity.this, "Aguarde um momento", "Enviando...", true, false);
StringRequest stringRequest = new StringRequest( Request.Method.POST, REGISTER_URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if (response.contains("Erro")) {
progressDialog.dismiss();
Toast.makeText( DenunciaActivity.this, "Erro ao enviar", Toast.LENGTH_LONG ).show();
} else {
progressDialog.dismiss();
Intent intent = new Intent(DenunciaActivity.this, MainActivity.class);
Toast.makeText( DenunciaActivity.this, "Enviado com sucesso!", Toast.LENGTH_LONG ).show();
startActivity(intent);
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
Toast.makeText( DenunciaActivity.this, error.toString(), Toast.LENGTH_LONG ).show();
Log.i( TAG, "Lat: " + error );
}
} ) {
@Override
protected Map<String, String> getParams() {
Map<String, String> map = new HashMap<String, String>();
map.put( KEY_USERNAME, name );
map.put( KEY_DATE, dataFormatada );
map.put( KEY_STATE, state );
map.put( KEY_CITY, city );
map.put( KEY_DISTRICT, district );
map.put( KEY_ADDRESS, address );
map.put( KEY_EMAIL, email );
map.put( KEY_COMPLEMENT, complement );
map.put( KEY_COUNTRIE, countries );
map.put( KEY_LAT, String.valueOf( latitude ) );
map.put( KEY_LONG, String.valueOf( longitude ) );
map.put( KEY_NOTE, note );
map.put( KEY_STATUS, "ATIVO" );
map.put( KEY_IMAGE, foto );
Log.i( TAG, "Lat: " + longitude +" "+latitude);
return map;
}
};
RequestQueue requestQueue = Volley.newRequestQueue( this );
requestQueue.add( stringRequest );
}
At my service like this:
public class Services extends Controller {
public static void denuncia(@Valid String nome, String data, String rua, String bairro, String complemento, String cidade, String estado, String pais, String observacao, String email, String latitude, String longitude, Status status, String foto) {
if (validation.hasErrors()) {
String mensagem = "Erro ao cadastrar";
JsonObject j = new JsonObject();
j.addProperty("Erro", 404);
j.addProperty("msg", mensagem);
renderJSON(j);
} else {
String msgsucess = "Cadastrado com sucesso!";
Denuncia denuncia = new Denuncia();
denuncia.nome = nome;
denuncia.data = data;
denuncia.rua = rua;
denuncia.bairro = bairro;
denuncia.complemento = complemento;
denuncia.cidade = cidade;
denuncia.estado = estado;
denuncia.pais = pais;
denuncia.observacao = observacao;
denuncia.email = email;
denuncia.latitude = latitude;
denuncia.longitude = longitude;
denuncia.status = status;
denuncia.foto = foto;
denuncia.save();
JsonObject j = new JsonObject();
j.addProperty("Success", 200);
j.addProperty("msg", msgsucess);
renderJSON(j);
}
}
And my Model is:
@Entity
public class Denuncia extends Model{
@Required
public String nome;
@Required
public String rua;
@Required
public String bairro;
@Required
public String complemento;
@Required
public String data;
@Required
public String cidade;
@Required
public String estado;
@Required
public String pais;
@Required
public String observacao;
@Required
@Email
public String email;
public String foto;
public String latitude;
public String longitude;
@Enumerated(EnumType.STRING)
public Status status;
@Enumerated(EnumType.STRING)
public Status statusMsg;
public Denuncia() {
status = Status.ATIVO;
statusMsg = Status.NAO_LIDA;
}
The error I'm passing on is the size of the string I'm receiving in my bank, it's larger than the one supported, depending on the output:
Caused by: org.h2.jdbc.JdbcSQLException: Value too long for column "FOTO VARCHAR(255)": "STRINGDECODE('/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB\nAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB... (62229)"; SQL statement:
insert into Denuncia (id, bairro, cidade, complemento, data, email, estado, foto, latitude, longitude, nome, observacao, pais, rua, status, statusMsg) values (null, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [22001-193]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
at org.h2.message.DbException.get(DbException.java:179)
at org.h2.table.Column.validateConvertUpdateSequence(Column.java:335)
at org.h2.table.Table.validateConvertUpdateSequence(Table.java:784)
at org.h2.command.dml.Insert.insertRows(Insert.java:151)
at org.h2.command.dml.Insert.update(Insert.java:114)
at org.h2.command.CommandContainer.update(CommandContainer.java:98)
at org.h2.command.Command.executeUpdate(Command.java:258)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:160)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:146)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:186)
... 30 more
Someone help me find a way out of the problem?