Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
SunmiPrinter Service
package com.marcomaldonado.sunmiv2.contracts;
import android.os.RemoteException;
public interface SunmiCallback {
void onRunResult(boolean isSuccess) throws RemoteException;
void onReturnString(String result) throws RemoteException;
void onRaiseException(int code, String msg) throws RemoteException;
}
package com.marcomaldonado.sunmiv2.services;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.graphics.Bitmap;
import android.os.IBinder;
import android.os.RemoteException;
import com.marcomaldonado.sunmiv2.contracts.SunmiCallback;
import woyou.aidlservice.jiuiv5.ICallback;
import woyou.aidlservice.jiuiv5.IWoyouService;
public class SunmiPrinter {
private static final SunmiPrinter printer = new SunmiPrinter();
private IWoyouService woyouService = null;
private final String UNREACHABLE = "unreachable";
private ServiceConnection connService = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
woyouService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
woyouService = IWoyouService.Stub.asInterface(service);
}
};
private SunmiPrinter(){}
public static SunmiPrinter getInstance() {
return printer;
}
public void initPrinter(Context context){
Intent intent=new Intent();
intent.setPackage("woyou.aidlservice.jiuiv5");
intent.setAction("woyou.aidlservice.jiuiv5.IWoyouService");
context.startService(intent);
context.bindService(intent, connService, Context.BIND_AUTO_CREATE);
}
// --------------------------------
public void updateFirmware() {
if (woyouService != null) {
try {
woyouService.updateFirmware();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
public int getFirmwareStatus() {
if (woyouService != null) {
try {
return woyouService.getFirmwareStatus();
} catch (RemoteException e) {
e.printStackTrace();
}
}
return -1;
}
public String getServiceVersion() {
if (woyouService != null) {
try {
return woyouService.getServiceVersion();
} catch (RemoteException e) {
e.printStackTrace();
}
}
return UNREACHABLE;
}
public void printerInit(SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.printerInit(makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void printerSelfChecking(SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.printerSelfChecking(makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public String getPrinterSerialNo() {
if (woyouService != null) {
try {
return woyouService.getPrinterSerialNo();
} catch (RemoteException e) {
e.printStackTrace();
}
}
return UNREACHABLE;
}
public String getPrinterVersion() {
if (woyouService != null) {
try {
return woyouService.getPrinterVersion();
} catch (RemoteException e) {
e.printStackTrace();
}
}
return UNREACHABLE;
}
public String getPrinterModal() {
if (woyouService != null) {
try {
return woyouService.getPrinterModal();
} catch (RemoteException e) {
e.printStackTrace();
}
}
return UNREACHABLE;
}
public void getPrintedLength(SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.getPrintedLength(makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void lineWrap(int n, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.lineWrap(n, makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void sendRAWData(byte[] data, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.sendRAWData(data, makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void setAlignment( int alignment, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.setAlignment(alignment, makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void setFontName(String typeface, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.setFontName(typeface, makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void setFontSize(float fontSize, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.setFontSize(fontSize, makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void printText(String text, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.printText(text, makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void printTextWithFont(String text, String typeface, float fontSize, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.printTextWithFont(text, typeface, fontSize, makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void printColumnsText(String[] colsTextArr, int[] colsWidthArr, int[] colsAlign, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.printColumnsText(colsTextArr, colsWidthArr, colsAlign, makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void printBitmap(Bitmap bitmap, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.printBitmap(bitmap, makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void printBarCode(String data, int symbology, int height, int width, int textposition, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.printBarCode(data, symbology, height, width, textposition, makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void printQRCode(String data, int moduleSize, int errorLevel, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.printQRCode(data, moduleSize, errorLevel, makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void printOriginalText(String text, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.printOriginalText(text, makeCallback(callback));
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void commitPrinterBuffer(SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.commitPrinterBuffer();
if (callback != null) {
callback.onRunResult(true);
}
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void enterPrinterBuffer(boolean clean, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.enterPrinterBuffer(clean);
if (callback != null) {
callback.onRunResult(true);
}
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
public void exitPrinterBuffer(boolean commit, SunmiCallback callback) {
if (woyouService != null) {
try {
woyouService.exitPrinterBuffer(commit);
if (callback != null) {
callback.onRunResult(true);
}
} catch (RemoteException e) {
e.printStackTrace();
ThrowErrorCallback(callback);
}
}
else {
ThrowErrorCallback(callback);
}
}
private void ThrowErrorCallback(SunmiCallback callback) {
if (callback != null) {
try {
callback.onRaiseException(500, UNREACHABLE);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
private ICallback makeCallback(final SunmiCallback callback) {
if (callback != null) {
return new ICallback.Stub() {
@Override
public void onRunResult(boolean isSuccess) throws RemoteException {
callback.onRunResult(isSuccess);
}
@Override
public void onReturnString(String result) throws RemoteException {
callback.onReturnString(result);
}
@Override
public void onRaiseException(int code, String msg) throws RemoteException {
callback.onRaiseException(code, msg);
}
};
}
return null;
}
}
@Dclase

This comment has been minimized.

Copy link

@Dclase Dclase commented Mar 6, 2020

Hola,
Me puedes por favor indicar en donde van ubicados estos archivos dentro del proyecto ?

@Mxrck

This comment has been minimized.

Copy link
Owner Author

@Mxrck Mxrck commented Mar 6, 2020

Hola @Dclase no necesitas tener una estructura en particular, puedes poner las clases donde desees, solo recuerda poner el package que uses correctamente, en mi caso por ejemplo estoy usando el paquete:

package com.marcomaldonado.sunmiv2.services;

Que representa en mi proyecto la carpeta src/com/marcomaldonado/sunmiv2/services/{CLASES}

La parte específica es donde se hace referencia a los servicios que ya tiene el dispositivo que representan a la impresora

public void initPrinter(Context context){
    Intent intent=new Intent();
    intent.setPackage("woyou.aidlservice.jiuiv5");
    intent.setAction("woyou.aidlservice.jiuiv5.IWoyouService");
    context.startService(intent);
    context.bindService(intent, connService, Context.BIND_AUTO_CREATE);
}
@Dclase

This comment has been minimized.

Copy link

@Dclase Dclase commented Mar 6, 2020

Cuando creo la clase SunmiPrinter.java, en el import no me reconoce las librerías ICallback & IWoyouService, me marca un error: "cannot resolve symbol ICallback"

@Mxrck

This comment has been minimized.

Copy link
Owner Author

@Mxrck Mxrck commented Mar 7, 2020

Cuando creo la clase SunmiPrinter.java, en el import no me reconoce las librerías ICallback & IWoyouService, me marca un error: "cannot resolve symbol ICallback"

Es porque no has cargado los AIDL necesarios para que tu aplicación pueda comunicarse con la impresora, puedes encontrar más información aquí:

https://marcomaldonado.com/2019/10/02/imprimir-en-sunmi-v2-usando-xamarin-y-aidl/

En la sección que se habla de ello es la que menciona:

"La documentación de mis AIDL dicen que la carpeta principal vaya a un lado de java y dentro las carpetas correspondientes al paquete de mis AIDL"

@Dclase

This comment has been minimized.

Copy link

@Dclase Dclase commented Mar 8, 2020

Cuando creo la clase SunmiPrinter.java, en el import no me reconoce las librerías ICallback & IWoyouService, me marca un error: "cannot resolve symbol ICallback"

Es porque no has cargado los AIDL necesarios para que tu aplicación pueda comunicarse con la impresora, puedes encontrar más información aquí:

https://marcomaldonado.com/2019/10/02/imprimir-en-sunmi-v2-usando-xamarin-y-aidl/

En la sección que se habla de ello es la que menciona:

"La documentación de mis AIDL dicen que la carpeta principal vaya a un lado de java y dentro las carpetas correspondientes al paquete de mis AIDL"

Coloqué el directorio aidl junto a la del directorio java, como se indica en la documentación, pero igual me sigue marcando el mismo mensaje de error. Alguna idea del por qué ?

error

@Mxrck

This comment has been minimized.

Copy link
Owner Author

@Mxrck Mxrck commented Mar 9, 2020

Cuando creo la clase SunmiPrinter.java, en el import no me reconoce las librerías ICallback & IWoyouService, me marca un error: "cannot resolve symbol ICallback"

Es porque no has cargado los AIDL necesarios para que tu aplicación pueda comunicarse con la impresora, puedes encontrar más información aquí:
https://marcomaldonado.com/2019/10/02/imprimir-en-sunmi-v2-usando-xamarin-y-aidl/
En la sección que se habla de ello es la que menciona:
"La documentación de mis AIDL dicen que la carpeta principal vaya a un lado de java y dentro las carpetas correspondientes al paquete de mis AIDL"

Coloqué el directorio aidl junto a la del directorio java, como se indica en la documentación, pero igual me sigue marcando el mismo mensaje de error. Alguna idea del por qué ?

Me parece que alguna vez me pasó algo parecido, y era por la codificación de los aidl, intenta abrirlos y quita los comentarios y vuelve a guardarlos, en caso de que no te funcione te puedo compartir el dll ya generado solo para usarlo ya en xamarin.

@Dclase

This comment has been minimized.

Copy link

@Dclase Dclase commented Mar 9, 2020

Cuando creo la clase SunmiPrinter.java, en el import no me reconoce las librerías ICallback & IWoyouService, me marca un error: "cannot resolve symbol ICallback"

Es porque no has cargado los AIDL necesarios para que tu aplicación pueda comunicarse con la impresora, puedes encontrar más información aquí:
https://marcomaldonado.com/2019/10/02/imprimir-en-sunmi-v2-usando-xamarin-y-aidl/
En la sección que se habla de ello es la que menciona:
"La documentación de mis AIDL dicen que la carpeta principal vaya a un lado de java y dentro las carpetas correspondientes al paquete de mis AIDL"

Coloqué el directorio aidl junto a la del directorio java, como se indica en la documentación, pero igual me sigue marcando el mismo mensaje de error. Alguna idea del por qué ?

Me parece que alguna vez me pasó algo parecido, y era por la codificación de los aidl, intenta abrirlos y quita los comentarios y vuelve a guardarlos, en caso de que no te funcione te puedo compartir el dll ya generado solo para usarlo ya en xamarin.

Ya quité los comentarios pero aun me continúa marca el error, si me pudieses compartir el dll para xamarin te lo agradecería mucho.

@Mxrck

This comment has been minimized.

Copy link
Owner Author

@Mxrck Mxrck commented Mar 9, 2020

Te paso el DLL, solo te quedaría hacer la implementación en xamarin usándolo:

https://www.dropbox.com/s/koz5u5nzcglsl9l/SunmiV2.dll?dl=0

@Dclase

This comment has been minimized.

Copy link

@Dclase Dclase commented Mar 11, 2020

Te paso el DLL, solo te quedaría hacer la implementación en xamarin usándolo:

https://www.dropbox.com/s/koz5u5nzcglsl9l/SunmiV2.dll?dl=0

Muchas gracias por tu ayuda. Ya descargué el dll y lo integré a mi proyecto en Xamarin. También ya implementé el botón para llamar la función para la impresión 'printer.PrintText("")', solo que cuando lo ejecuto, sí llama la función, pero no realiza ninguna acción.
Será que debo de agregar algo mas dentro de la clase "Printer.cs" ?
issue Xamarin Sunmi

@Mxrck

This comment has been minimized.

Copy link
Owner Author

@Mxrck Mxrck commented Mar 11, 2020

regar algo mas dentro de la clase "Printer.cs" ?

Desafortunadamente es la parte que me falta completar del post, con el dll ya tienes la instancia de la clase creada en android disponible para usar en el proyecto android de tu solución, tu clase Printer debe usarlas y cuando ejecutes el botón se llaman esas funciones que en este momento tienes vacías, tu implementación tendría que ser algo similar a lo siguiente:

using Com.Marcomaldonado.Sunmiv2.Services;
using ...;

[assembly: Xamarin.Forms.Dependency(typeof(...))]
namespace ...
{
    class Printer : IPrinter
    {
        private SunmiPrinter sunmi = SunmiPrinter.Instance;

        public void PrintImage(byte[] bitmap)
        {
            var _bitmap = BitmapFactory.DecodeByteArray(bitmap, 0, bitmap.Length);
            sunmi.PrintBitmap(_bitmap, null);
        }

        public void PrintText(string text)
        {
            sunmi.PrintText(text, null);
            return tcs.Task;
        }

el objeto sunmi tiene todos los métodos que se declararon en el dll, por lo que puedes ampliar tu interface con todos los métodos que quieras usar, personalmente implementé TaskCompletionSource para poder devolver un Task y usar async/await pero este es el ejemplo más corto para que ya le añadas lo que necesites.

Es necesario también que en tu MainActivity del proyecto android añadas esta línea

SunmiPrinter.Instance.InitPrinter(ApplicationContext);

Esto iría antes de LoadApplication(new App());.

@Dclase

This comment has been minimized.

Copy link

@Dclase Dclase commented Mar 13, 2020

Es necesario también que en tu MainActivity del proyecto android añadas esta línea

SunmiPrinter.Instance.InitPrinter(ApplicationContext);

Esto iría antes de LoadApplication(new App());.

Perfecto, ya me está funcionando el método PrintText(). Ahora trataré de probar y trabajar con las demás funcionalidades.
Una vez más, muchas gracias por tus aportes.

@rygogre

This comment has been minimized.

Copy link

@rygogre rygogre commented Oct 20, 2020

Hola, al generar el modulo, estoy teniendo este error:
public void commitPrint(com.sunmi.trans.TransBean[] transbean, woyou.aidlservice.jiuiv5.ICallback callback) throws android.os.RemoteException;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment