DevCorner: le funzioni di stampa di Android 4.4

Roberto Orgiu
Roberto Orgiu
DevCorner: le funzioni di stampa di Android 4.4

Abbiamo già parlato delle novità per gli sviluppatori introdotte con Android 4.4 e la curiosità ha preso il sopravvento su di noi, portandoci ad esplorare una funzionalità semplice, immediata, ma che funzionerà, ad oggi, solamente sul Nexus 5 (o sull'emulatore di Android KitKat): la stampa dei documenti direttamente dalla nostra app.

Abbiamo volutamente implementato solamente la stampa di immagini e documenti HTML, perché la stampa dei documenti personalizzati richiederebbe un tutorial a sé, quindi, in principio, una base dobbiamo impostarla. Per prima cosa, ci conviene sempre controllare che il sistema supporti la stampa, e lo facciamo tramite una chiamata all'API sotto riportata, che ritornerà true in caso di supporto e false in caso contrario

PrintHelper.systemSupportsPrint()

Una volta che siamo sicuri che il dispositivo possa inviare documenti alla stampante, possiamo provare a riprodurre nel mondo fisico un'immagine.

PrintHelper helper = new PrintHelper(this);
helper.setScaleMode(PrintHelper.SCALE_MODE_FIT);
Bitmap image = BitmapFactory.decodeResource(getResources(),R.drawable.android_robot);
helper.printBitmap("DevCorner - stampiamo con la nostra app",image);

Analizziamo il codice: alla riga 2 creiamo l'helper per la stampa (che si occuperà di gestire i parametri ed inviare i comandi alla stampante) mentre la parte più interessante si trova alla riga 3, dove chiediamo all'helper appena creato di impostare la scala dell'immagine.

Grazie a questa istruzione, possiamo impostare il tipo di ridimensionamento che preferiamo, come spiegato dalla slide che hanno mostrato gli sviluppatori di Google tramite l'apposito DevBytes.

printing_bitmaps

Quello che invece facciamo alla riga 4 è solamente prelevare un'immagine dalla nostra cartella drawable ed inserirla in un oggetto Bitmap, che andremo poi a stampare (riga 5) grazie all'ausilio dell'helper che abbiamo creato. Ecco fatto, ci sono bastate 4 righe per chiedere al nostro robottino di stampare un'immagine prelevata dalle nostre risorse. Semplice, no?

Passiamo quindi alla stampa di una pagina HTML che abbiamo precedentemente caricato dentro una WebView chiamata customCode. Notiamo che sarebbe meglio chiamare la funzione di stampa una volta ricevuta la conferma che la pagina è stata scaricata completamente ma, per i nostri fini, va bene un metodo a parte che richiameremo al click su un apposito bottone (una variante potrebbe essere di far partire disabilitato il bottone e attivarlo nel callback del caricamento della pagina).

PrintManager manager = (PrintManager) getSystemService(Context.PRINT_SERVICE);
PrintDocumentAdapter adapter = customCode.createPrintDocumentAdapter();
String printJobName = getString(R.string.app_name) + " - DevCorner test";
PrintJob job = manager.print(printJobName,adapter,new PrintAttributes.Builder().build());

A differenza di quanto fatto per l'immagine, questa volta non ci basterà l'helper, ma avremo bisogno di riferirci ad un servizio di sistema (riga 6), creare un Adapter a partire dalla WebView che contiene la pagina (riga 7), ideare un nome che assegneremo al processo di stampa (riga 8) e finalmente creare un job che, attraverso il servizio di sistema richiamato all'inizio (che prende come parametri in ingresso il nome del job che abbiamo deciso alla riga 8, l'Adapter creato alla riga 7 e delle proprietà che non abbiamo modificato), invierà alla stampante la nostra pagina e ci darà modo di controllare l'avanzamento della stampa del documento (o di agire sul processo) grazie ai metodo contenuti nell'oggetto PrintJob che viene allocato.

Se volete dare uno sguardo a tutti i metodi che sono disponibili per queste due funzionalità, fate un salto sul sito per gli sviluppatori. Come al solito, tutte le risorse necessarie sono disponibili sul thread di DevCorner del nostro forum. Buona programmazione a tutti!