Configuração SDK
Configurar Gradle¶
Importar a lib “libposdigital.aar” no Gradle e a classe PosDigital estará disponível para uso.
No gradle do seu app adicione este trecho:
android {
compileSdkVersion 31
buildToolsVersion ’31.0.0’
defaultConfig {
minSdkVersion 22
targetSdkVersion 22
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.aar'])
}
Fazendo BIND no service¶
Adicione no AndroidManifest.xml a permissão abaixo:
<uses-permission android:name="com.getnet.posdigital.service.POSDIGITAL" />
O Posdigital.register() é melhor utilizado no contexto da Aplicação ou dentro de um BaseActivity onde todas as Activitys da aplicação irão herdar os métodos da BaseActivity. Somente após o método onConnected ser executado que os serviços irão funcionar. No código exemplo abaixo, o register é feito no BaseActivity:
public class BaseActivity extends AppCompatActivity {
private final String tag = this.getClass().getName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connectPosDigitalService();
}
private void connectPosDigitalService() {
PosDigital.register(getApplicationContext(), bindCallback);
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
if (PosDigital.getInstance().isInitiated()) {
PosDigital.unregister(getApplicationContext());
}
} catch (Exception e) {
Log.e(tag, "Erro de exception no Destroy da Activity");
}
}
private PosDigital.BindCallback bindCallback = new PosDigital.BindCallback() {
@Override
public void onError(Exception e) {
if (PosDigital.getInstance().isInitiated()) {
PosDigital.unregister(getApplicationContext());
}
connectPosDigitalService();
}
@Override
public void onConnected() {}
@Override
public void onDisconnected() {}
};
}
abstract class BaseActivity : AppCompatActivity() {
private val tag = javaClass.name
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.content_activity)
connectPosDigitalService()
}
private fun connectPosDigitalService() {
PosDigital.register(applicationContext, bindCallback)
}
override fun onDestroy() {
super.onDestroy()
try {
if (PosDigital.getInstance().isInitiated)
PosDigital.unregister(applicationContext)
} catch (e: Exception) {
Log.e(tag, "Erro de exception no Destroy da Activity")
}
}
private val bindCallback: PosDigital.BindCallback
get() = object : PosDigital.BindCallback {
override fun onError(e: Exception) {
if (PosDigital.getInstance().isInitiated)
PosDigital.unregister(applicationContext)
connectPosDigitalService()
}
override fun onConnected() {}
override fun onDisconnected() {}
}
}
Caso ocorra a desconexão do serviço no callback (onDisconnected) recomendamos:
- Exibir uma mensagem na tela permitindo o usuário fazer uma nova tentativa de conexão;
- Ou então fazer uma nova tentativa em background, mas por um número máximo de vezes - recomendamos 3 tentativas.
IMPORTANTE
Cada vez que o serviço de hardware do fabricante parar de funcionar é emitido um evento, este evento é recebido no onError() do bindCallback. É importante implementar a reconexão com o SDK como mostrado no exemplo acima, no método onError() do código.
A Activity que herdará da BaseActivity cada vez que irá fazer alguma operação com o SDK, deverá fazer a verificação PosDigital.getInstance().isInitiated para verificar se o SDK está inicializado, conforme código exemplo abaixo:
ActivityImpressão.kt
private void printReceipt() {
if (PosDigital.getInstance().isInitiated()){
try {
PosDigital.getInstance().getPrinter().init();
PosDigital.getInstance().getPrinter().setGray(5);
PosDigital.getInstance().getPrinter().defineFontFormat(FontFormat.MEDIUM);
PosDigital.getInstance().getPrinter().addText(AlignMode.LEFT, "Barcode:20");
PosDigital.getInstance().getPrinter().addText(AlignMode.LEFT, " ");
PosDigital.getInstance().getPrinter().print(getPrinterCallback());
} catch (Exception e) {}
} else {
// falha no service de impressão
// refaça o start da activity que
// extende a BaseActivity para reconectar o service
openErrorDialog("Falha na impressão\n Tente novamente.");
}
}
private IPrinterCallback.Stub getPrinterCallback() {
return new IPrinterCallback.Stub() {
@Override
public void onSuccess() throws RemoteException {
openInfoDialog("Sucesso");
}
@Override
public void onError(int cause) throws RemoteException {
openErrorDialog(parseStatus(cause));
}
};
}
fun printReceipt() {
if (PosDigital.getInstance().isInitiated){
try {
PosDigital.getInstance().printer.init()
PosDigital.getInstance().printer.setGray(5)
PosDigital.getInstance().printer.defineFontFormat(FontFormat.MEDIUM)
PosDigital.getInstance().printer.addText(AlignMode.LEFT, "Barcode:20")
PosDigital.getInstance().printer.addText(AlignMode.LEFT, " ")
PosDigital.getInstance().printer.print(getPrinterCallback())
} catch (e: Exception) {}
} else {
// falha no service de impressão
// refaça o start da activity que
// extende a BaseActivity para reconectar o service
openErrorDialog("Falha na impressão\n Tente novamente.")
}
}
private fun getPrinterCallback(): IPrinterCallback.Stub {
return object : IPrinterCallback.Stub() {
@Throws(RemoteException::class)
override fun onSuccess() {
openInfoDialog("Impresso com sucesso")
}
@Throws(RemoteException::class)
override fun onError(cause: Int) {
openErrorDialog(parseStatus(cause))
}
}
}
IMPORTANTE
Não utilizar o PosDigital.register() em uma thread separada, como em uma AsyncTask() do android, pode gerar problemas de concorrência de Threads e trazer instabilidade e erros nas chamadas ao SDK.