Pular para conteúdo

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.