diff --git a/app/src/main/java/com/example/lifegrid/InvoiceScannerHelper.java b/app/src/main/java/com/example/lifegrid/InvoiceScannerHelper.java index c49c21c..91d201c 100644 --- a/app/src/main/java/com/example/lifegrid/InvoiceScannerHelper.java +++ b/app/src/main/java/com/example/lifegrid/InvoiceScannerHelper.java @@ -23,7 +23,7 @@ import java.util.concurrent.Executors; public class InvoiceScannerHelper { - private static final String API_KEY = "YOUR_GEMINI_API_KEY_HERE"; // Substitua pela sua chave API + private static final String API_KEY = "AIzaSyCoUZSXfEk43LfPtkCCjsnQ_ZMWX7NG1xQ"; // Substitua pela sua chave API private static final String PROMPT = "Analisa esta fatura. Devolve APENAS um objeto JSON com os campos: 'valor' (Double, apenas números e ponto decimal), 'descricao' (String curta, nome do estabelecimento ou produto), 'categoria' (String, ex: Alimentação, Transporte, Lazer, Saúde, Casa, Educação, Outros), e 'data' (String formato DD/MM/AAAA). Se não conseguires ler algum, coloca valor padrão ou string vazia."; public interface ScanCallback { @@ -32,15 +32,20 @@ public class InvoiceScannerHelper { } public static void scanInvoice(Context context, Uri imageUri, ScanCallback callback) { - if (API_KEY.equals("YOUR_GEMINI_API_KEY_HERE")) { + if (API_KEY == null || API_KEY.isEmpty() || API_KEY.contains("YOUR_GEMINI_API_KEY")) { callback.onError("Chave API do Gemini não configurada."); return; } - try { - InputStream imageStream = context.getContentResolver().openInputStream(imageUri); + Executor executor = Executors.newSingleThreadExecutor(); + try (InputStream imageStream = context.getContentResolver().openInputStream(imageUri)) { Bitmap bitmap = BitmapFactory.decodeStream(imageStream); + if (bitmap == null) { + callback.onError("Não foi possível carregar a imagem da fatura."); + return; + } + GenerativeModel gm = new GenerativeModel( "gemini-1.5-flash", API_KEY @@ -52,7 +57,6 @@ public class InvoiceScannerHelper { .addImage(bitmap) .build(); - Executor executor = Executors.newSingleThreadExecutor(); ListenableFuture response = model.generateContent(content); Futures.addCallback(response, new FutureCallback() { @@ -74,6 +78,10 @@ public class InvoiceScannerHelper { } catch (JSONException e) { Log.e("InvoiceScanner", "Erro ao fazer parse do JSON: " + result.getText(), e); callback.onError("Erro ao ler dados da fatura."); + } finally { + if (executor instanceof java.util.concurrent.ExecutorService) { + ((java.util.concurrent.ExecutorService) executor).shutdown(); + } } } @@ -81,12 +89,18 @@ public class InvoiceScannerHelper { public void onFailure(Throwable t) { Log.e("InvoiceScanner", "Falha na API do Gemini", t); callback.onError("Falha ao comunicar com a IA: " + t.getMessage()); + if (executor instanceof java.util.concurrent.ExecutorService) { + ((java.util.concurrent.ExecutorService) executor).shutdown(); + } } }, executor); } catch (Exception e) { - e.printStackTrace(); + Log.e("InvoiceScanner", "Erro geral", e); callback.onError("Erro ao processar imagem: " + e.getMessage()); + if (executor instanceof java.util.concurrent.ExecutorService) { + ((java.util.concurrent.ExecutorService) executor).shutdown(); + } } } }