⚠️ APK-ul Actual NU Are Suport Printare Directă
APK-ul curent (app-debug.apk v1.0.0) este doar un WebView simplu. NU conține PrinterBridge - de aceea printarea merge doar prin RawBT/Share.
Ce lipsește din APK-ul actual:
window.PrinterBridge- JavaScript interface pentru printare- Conexiune la SDK-ul imprimantei Q2i (IposPrinter)
- Metoda
print(text)care trimite direct la imprimantă
Brief Tehnic - APK Anna Eats POS
Tot ce trebuie să dai unui dezvoltator Android
Obiectiv
🎯 User apasă "Print" → Bonul se printează INSTANT
Fără dialog, fără RawBT, fără Share - un singur click!
1. WebView
Deschide Anna Eats în aplicație
2. JS Bridge
Expune window.PrinterBridge
3. Print Direct
Trimite la imprimantă built-in
🔴 CRITIC: JavaScript Bridge
Site-ul nostru caută automat window.PrinterBridge. APK-ul trebuie să expună EXACT acest obiect:
window.PrinterBridge.print(text) → printează text
window.PrinterBridge.getPrinterStatus() → returnează "ok"
window.PrinterBridge.openCashDrawer() → opțional
MainActivity.java
Java
// MainActivity.java - WebView cu JavaScript Bridge pentru printare
package com.anna.pos;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebSettings;
import android.webkit.JavascriptInterface;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
// Import SDK imprimantă Q2i / IposPrinter
// Acesta variază în funcție de producător - verifică documentația dispozitivului
// import com.iposprinter.iposprinterservice.IPosPrinterService;
public class MainActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
webView = new WebView(this);
setContentView(webView);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setDomStorageEnabled(true);
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
settings.setMediaPlaybackRequiresUserGesture(false);
// IMPORTANT: Adaugă JavaScript Bridge
webView.addJavascriptInterface(new PrinterBridge(), "PrinterBridge");
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("https://anna-eats.base44.app");
}
// JavaScript Bridge - expus ca window.PrinterBridge în browser
public class PrinterBridge {
@JavascriptInterface
public void print(String text) {
// Aici conectezi la SDK-ul imprimantei Q2i
// Exemplu generic:
runOnUiThread(() -> {
try {
// ÎNLOCUIEȘTE cu codul real pentru imprimanta Q2i
// Exemplu pentru IposPrinter:
// IPosPrinterService printer = ...
// printer.printText(text);
// printer.printAndFeedPaper(100);
Toast.makeText(MainActivity.this, "Printing...", Toast.LENGTH_SHORT).show();
// TODO: Adaugă codul real de printare aici
printToBuiltInPrinter(text);
} catch (Exception e) {
Toast.makeText(MainActivity.this, "Print error: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
@JavascriptInterface
public void printReceipt(String jsonData) {
// Versiune alternativă care primește JSON
print(jsonData);
}
@JavascriptInterface
public String getPrinterStatus() {
// Returnează statusul imprimantei
// "ok", "no_paper", "overheating", "offline"
return "ok";
}
@JavascriptInterface
public void openCashDrawer() {
// Deschide sertarul de bani (dacă există)
runOnUiThread(() -> {
try {
// TODO: Comandă pentru cash drawer
Toast.makeText(MainActivity.this, "Cash drawer opened", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
// ignore
}
});
}
}
// Metodă pentru printare - ÎNLOCUIEȘTE cu SDK-ul real
private void printToBuiltInPrinter(String text) {
// Aici vine codul specific pentru Q2i / IposPrinter
// Exemplu generic ESC/POS:
/*
// Pentru IposPrinter SDK:
IPosPrinterService printerService = IPosPrinterService.getInstance(this);
printerService.printText(text, null);
printerService.printAndLineFeed();
printerService.printAndCutPaper(printerService.ONEHUNDRED);
*/
// SAU pentru Sunmi:
/*
SunmiPrinterService printer = SunmiPrintHelper.getInstance();
printer.printText(text);
printer.feedPaper();
*/
}
@Override
public void onBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
} else {
super.onBackPressed();
}
}
}build.gradle (app)
Gradle
// build.gradle (app level)
plugins {
id 'com.android.application'
}
android {
namespace 'com.anna.pos'
compileSdk 34
defaultConfig {
applicationId "com.anna.pos"
minSdk 21
targetSdk 34
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'
// IMPORTANT: Adaugă SDK-ul imprimantei Q2i
// Aceasta se obține de la producătorul dispozitivului
// implementation files('libs/iposprinter-sdk.aar')
}AndroidManifest.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.anna.pos">
<!-- Permisiuni necesare -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Permisiuni pentru imprimantă (dacă e necesară comunicare serial/USB) -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="Anna Eats POS"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.NoActionBar"
android:usesCleartextTraffic="true">
<activity
android:name=".MainActivity"
android:exported="true"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>Test JavaScript (pentru verificare)
JavaScript
// Cod JavaScript pentru testare în browser (consola)
// După ce APK-ul e instalat, acest cod va funcționa automat
// Verifică dacă bridge-ul există
if (window.PrinterBridge) {
console.log("✅ PrinterBridge detectat!");
// Test printare
window.PrinterBridge.print("Test receipt\n\nAnna Eats POS\n================\n\nMultumim!");
// Verifică status
console.log("Printer status:", window.PrinterBridge.getPrinterStatus());
} else {
console.log("❌ PrinterBridge nu există - rulezi în browser normal");
}📋 Pași pentru Dezvoltator
- Creează proiect Android în Android Studio
- Obține SDK-ul imprimantei de la producătorul Q2i (IposPrinter sau similar)
- Adaugă SDK-ul în folder
libs/și în build.gradle - Copiază MainActivity.java și completează metoda
printToBuiltInPrinter() - Testează - deschide consola JS și verifică
window.PrinterBridge - Build APK și instalează pe Q2i
✅ Cum Verifici Că APK-ul Nou Funcționează
După ce instalezi APK-ul nou pe Q2i, deschide consola JavaScript (DevTools) și rulează:
// Verifică dacă PrinterBridge există
console.log("PrinterBridge:", typeof window.PrinterBridge);
// Trebuie să afișeze "object" - nu "undefined"
// Test printare
if (window.PrinterBridge) {
window.PrinterBridge.print("Test receipt\\n\\nAnna Eats POS\\n================");
}
Rezultate așteptate:
typeof window.PrinterBridge= "object" ✅- Imprimanta printează textul de test instant, fără dialog
- În aplicație, butonul Print funcționează cu un singur click
