Implementar un External Object para SmartDevices Genexus 16


Antes de comenzar a trabajar en esta implementación, primero hay que tener claro que tipo de objecto vamos a crear o que funcionalidad queremos tener, en mi caso tube la necesidad de implementar un impresion desde un app hacia una impresora Mini.

Primero desarrolle la APP en el entorno de Android utilizando el Android Studio, hice las pruebas de impresion, y una vez que logre crear la app y que me funcionara, hice la migracion de ese codigo y librerias para usarlas en genexus Evol3, luego hice la migracion a Genexus 16 U7, aca les detallo paso a paso como lo implemente.


Cree una carpeta con los componente del proyecto que me registro mi Android Studio, las carpetas basicas como Library, Gradle, y los archivos necesarios.
Adjunto dejare el enlace para que descarguen este proyecto.



Hay que ubicar las carpeta library, hasta llegar a las carpeta de main\Java\com\example\samplemodule  (Estos nombres dependeran de los nombres originales de los modulos segun criterio)

Los archivos mas importantes para este External object, son PrintToBluetooth.java y SampleModule.Java

PrintToBluetooth.Java contiene toda la codificacion para la impresion, y el SampleModule.Java contiene la relacion del modulo y la sincronizacion con Genexus

Dentro del archivo PrintToBluetooth

@Override
public @NonNull
ExternalApiResult execute(String method, List<Object> params)
    {
List<String> parameterValues = toString(params);
if (method.toLowerCase().startsWith("imprimir")) {
final String PrintName = parameterValues.get(0);
final String PrintText = parameterValues.get(1);
int lresultado;
int lresultado2;

lresultado = imprimir(PrintName,PrintText);
if (lresultado==1){
result = 0;
}else {
lresultado2 = imprimir(PrintName,PrintText);
if (lresultado2==1){
result = 1;
}else {
result = Error;
}
}
}else if (method.toLowerCase().startsWith("cerrar")) {
boolean lresultadocerrar;
lresultadocerrar= closeBT();
if (lresultadocerrar==true){
result = 0;
}else {
result = Error;
}
}

return ExternalApiResult.success(result);
}
Estas lineas son fundamentales para que el external object, pueda ser reconocido por genexus,
el constructor y el ExternalAPIResult.

y en el archivo Samplemodule.java se debe relacionar el Archivo BASE Java.

    @Override
    public void initialize(Context context) {
        ExternalApiDefinition printToBluetooth = new ExternalApiDefinition(
                PrintToBluetooth.NAME,
                PrintToBluetooth.class
        );
        ExternalApiFactory.addApi(printToBluetooth);

Estos son los primeros pasos basicos para poder crear el external object.

Luego, que hemos terminado, hay que registrar donde estan las Dll de compilacion del generador
del external object para genexus.

Que archivos hay que modificar para que funciona.

Dentro de la carpeta PrintToBluetooth\library
hay un archivo llamada build.gradle

repositories {
maven { url "file:///C://Program%20Files%20(x86)//GeneXus//GeneXus16//Android/m2Repository" }
google()
jcenter()
maven { url "https://jitpack.io" }
}

Se deben modificar el maven la url de la ubicacion de nuestros repositorios de genexus, aca
se toman la librerias de sincronizacion.

Otro de los archivo a revisar y asegurarse que las ubicacion sean correctas
es en la carpeta raiz de PrintToBluetooth, aca buscar el archivo gradle-mvn-push.gradle


uploadArchives {
repositories {
mavenDeployer {
repository(url: "file:///C://Program%20Files%20(x86)//GeneXus//GeneXus16//Android/m2Repository")
}
}

Igual asegurarse que las ubicaciones de la url esten correctamente mapeadas.

una vez que tenemos esta informacion correcta, bien el procedimiento que debemos ejecutar
para que se compile y se integre al genexus.

Dentro de la carpeta: C:\Program Files (x86)\GeneXus\GeneXus16\Libraries\SampleLibrary
Samplelibrary es el nombre de nuestro proyecto principal, aca hay que agregar
en el archivo samplelibrary el redireccionamiento de el object external.

<Implements> <ExternalObject name="PrintToBluetooth"/> </Implements> <Android> <GroupId>com.example</GroupId> <Name>library</Name> <Version>1.0</Version> <ModuleClass>com.example.samplemodule.SampleModule</ModuleClass> </Android>

Otro paso muy importante es agregar los permisos de uso de bluetooth para nuestra app, para eso
hay que ubicar el archivo C:\Program Files (x86)\GeneXus\GeneXus16\Android\Templates\ApplicationProject\src\main

editar el siguiente archivo
usespermission.Extension.AndroidManifest.xml

y agregarle las siguientes lineas de codigo

<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>

y aca ya listo. estamos para generar nuestra aplicacion

Entrar a windows en modo comando, y en la carpeta de printtobluetoth

Microsoft Windows [Versión 10.0.17134.228]
(c) 2018 Microsoft Corporation. Todos los derechos reservados.

C:\WINDOWS\system32>cd..

C:\Windows>cd..

C:\ModelosGx15\PrintToBluetooth>dir
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: 201B-3B0C

 Directorio de C:\ModelosGx15\PrintToBluetooth

Ejecutar el comando: gradlew uploadArchives

Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.6.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 8s
25 actionable tasks: 1 executed, 24 up-to-datees of :library:releaseCompileClasspath > Transform artifact core.aar (and

C:\ModelosGx15\PrintToBluetooth>

El resultado deberia ser SATISFACTORIO, y listo, ahora solo es de instalar el xpz


Como usarlo:


--MODO DE USO--
Modo de uso &IsOk = &PrintToBluetooth.imprimir(&PrinterName,&Texto)

Ejmplo:

&Texto = ''
&Texto += "test de Impresion 1" + NEWLINE()
&Texto += "test de Impresion 2" 

&PrinterName = '00:XA:00'  /*mac address de la printer */
&lOk = &PrintToBluetooth.imprimir(&PrinterName,&Texto)
if &lOk
interop.Msg("Ticket Impreso")
else
interop.Msg("Conectar Impresora")
Endif


!!Buena Suerte!!






s

Comentarios

  1. Buenas tardes, tengo un inconveniente al usar el comando gradlew uploadArchives. Me da el siguiente error

    Could not deploy to remote repository | Failed to deploy artifacts/metadata: No connector available to access repository remote (C:\Program Files (x86)\GeneXus\GeneXus16Trial\Android\m2repository) of type default using the available factories WagonRepositoryConnectorFactory

    Se te ocurre por que puede estar pasando?
    Desde ya gracias.

    ResponderBorrar
  2. Hola! vendes el External Object para usarlo directamente ??? es compatible con cualquier impresora Bluetooth ???

    ResponderBorrar
  3. Hola, me interesa descargar el external Object para probar con una impresora APPEX 2 EXTECH
    Me puedes apoyar

    ResponderBorrar
  4. Hola buenas, como estas? quisiera contactar contigo para realizar la implementacion

    ResponderBorrar
  5. Hola Jóvenes ,disculpen la molestias pudieron encontrar alguna forma para manda a imprimir,y estoy loco de probar muchas cosas y nada ,me podrían dar una mano

    ResponderBorrar
  6. Hola, excelente trabajo!
    Podrías compartirme el link del proyecto de Android? el que comentaste que dejarías adjunto.
    Muchas gracias!

    ResponderBorrar
  7. Hola, excelente trabajo!
    Podrías compartirme el link del proyecto de Android? el que comentaste que dejarías adjunto.
    Muchas gracias!

    No se porque salgo como anónimo en los comentarios

    ResponderBorrar

Publicar un comentario

Entradas más populares de este blog

Como generar archivos csv y textos desde Genexus

Menu Accordeon Para genexus Evol3 16