¿Como imprimir contenido con Android usando Google Cloud printing?

Android 4.4 alias Kitkat, vino con muchas mejoras una de ellas es la integración nativa de API para impresión, lo cual es muy importante para puntos de ventas como Pozool. En general la integración para google cloud printing solía ser basada en un webview, y constaba de una clase la cual era una actividad y esta se encargaba de imprimir con google cloud print.

Integración de Google Cloud printing con KitKat

Con KitKat la integración es mas nativa, y mas amistosa, en este sentido Google facilita el acceso a la impresión a través de un Print framework, sin embargo al ser relativamente nuevo la documentación es escasa, de hecho la mejor guía que puedes encontrar al momento es en el sitio oficial de desarrollo, Imprimir contenido. En caso de nuestra integración creamos una clase llamada SenderManager, que se encarga de realizar las diferentes creaciones de los archivos del POS y enviarlos, lo mas relevante es como realizar la integración con Kitkat, de esta forma:

@TargetApi(19)
public void printWithGoogleCloud() {

	File receiptFile = new File(getExternalFilesDir(null), getString(R.string.receipt_file_name) + ".pdf");
	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

	final String jobName = getString(R.string.app_name) + " " + getString(R.string.receipt_file_name);
	// Start a print job, passing in a PrintDocumentAdapter implementation
	// to handle the generation of a print document

	WebView webView = new WebView(this);
	webView.setWebViewClient(new WebViewClient() {

	public boolean shouldOverrideUrlLoading(WebView view, String url) {
		return false;
	}

	@Override
	public void onPageFinished(WebView view, String url) {
		createWebPrintJob(jobName, view);
		mWebView = null;
	}});

	// Generate an HTML document on the fly:
	String htmlDocument = OutputHelper.html(this, receiptFile, details, subtotal, taxes,total);
	webView.loadDataWithBaseURL(null, htmlDocument, "text/HTML", "UTF-8", null);
			
	// Keep a reference to WebView object until you pass the PrintDocumentAdapter
	// to the PrintManager
	mWebView = webView;

	} else {
		if (OutputHelper.save(this, receiptFile, details, subtotal, taxes, total)) {
			Uri file = Uri.fromFile(receiptFile);

			Intent printIntent = new Intent(this, PrintDialogActivity.class);
			printIntent.setDataAndType(file, "application/pdf");
			printIntent.putExtra("title",
							getString(R.string.subject_payment, total, KitchSettings.getInstance()
							.getBusinessName()));
			startActivity(printIntent);
			callback.printingFinished();
			}
		}
	}

La razon por la cual creamos un webview es por que realizamos la impresion a travez de formato HTML, creamos un Webview con el contexto de la actividad:

 WebView webView = new WebView(this); 

Creamos el documento y cargamos el contenido HTML:

	// Generate an HTML document on the fly:
	String htmlDocument = OutputHelper.html(this, receiptFile, details, subtotal, taxes,total);
	webView.loadDataWithBaseURL(null, htmlDocument, "text/HTML", "UTF-8", null);

Una vez que el documento haya cargado el método onPageFinished hará el trabajo de invocar al PrintManager para obtener los parametros de impresión

@Override
public void onPageFinished(WebView view, String url) {
		createWebPrintJob(jobName, view);
		mWebView = null;
}

@TargetApi(19)
	private void createWebPrintJob(String jobName, WebView webView) {

	// Get a PrintManager instance
	PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);
	// Get a print adapter instance
	PrintDocumentAdapter printAdapter = webView.createPrintDocumentAdapter();
	final PrintJob printJob = printManager.print(jobName, printAdapter, new PrintAttributes.Builder().build());
		
	new Thread(new Runnable() {
			@Override
			public void run() {
				while(!printJob.isCompleted()) {
					mHandler.sendEmptyMessage(0);
				}
			}
		}).start();;
	}

Y listo el resultado que obtenemos es algo similar a :

Lo bueno del nuevo API que trae Kitkat es la capacidad de conectarse con proveedores de impresoras, aplicaciones externas que permiten imprimir. Supongamos que epson tenga una aplicación para imprimir y se registra como proveedor, con las nuevas características este tipo de aplicación aparecerá en el dialogo antes de imprimir.

Facebook icon Twitter icon LinkedIn icon e-mail icon