{the magic lies between the brackets}

Tag: 14. Januar 2013 (Seite 1 von 1)

Text in Android drucken

Einige Entwickler wollen, dass ihr Programm über einen normalen Drucker Textdateien ausdrucken kann.
Sei es für die Ausgabe von Log-Dateien oder für andere Dateien.
Das gleiche Problem hatte auch ich.
Mein Programm sollte einige Daten auslesen, in ein bestimmtes (vordefiniertes) Muster packen und speicher(als HTML-Datei).
Diese Datei sollte dann auf ein DIN A4 Blatt gedruckt werden.
Um anderen den Weg zu ersparen, alles googlen zu müssen. Habe ich hier den Code angehängt:

package com.x.y;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import android.os.AsyncTask;
import android.text.Html;
import android.text.Spanned;

public class PrintTask extends AsyncTask<Void, Void, Void> {

String printerAddress;
String printerPort;

    public PrintTask(String port) {
        printerAddress = ip;
        printerPort = port;
    }

    @Override
    protected Void doInBackground(Void... params){
        try{
        int PrinterPort =Integer.parseInt(printerPort);
        Socket clientSocket = null;
       DataOutputStream OutStream = null;

        // open connection
        clientSocket = new Socket(printerAddress, PrinterPort);
        // open data output stream
        OutStream = new DataOutputStream(clientSocket.getOutputStream());
        File f = new File("/sdcard/index.html");
        System.out.println("Reading from file.");
        StringBuilder text = new StringBuilder();
        Scanner scanner = new Scanner(new FileInputStream(f));
        String printthis = null;
        try {
          while (scanner.hasNextLine()){
            text.append(scanner.nextLine()+ "\r\n");
                String htmlcontent = text.toString();
                System.out.println(htmlcontent);
                // here comes the code from the html file
                 Spanned htmlencoded = Html.fromHtml(htmlcontent);
                 printthis = htmlcontent;

          }
              OutStream..writeChars(printthis);
              OutStream..equals(f);
        }
        finally{
          scanner.close();
        }
        System.out.println("Text read in: " + text);
        // close data stream and socket
        OutStream.close();
        clientSocket.close();
        }catch(IOException e){
            e.printStackTrace();
        }

        return null;
    }

    protected Void onPostExecute(Integer inte){
        return null;
    }

}

Dieser Code macht, einfach gesagt folgendes:
1. Öffnet einen Stream zum Drucker. IP und Port können über den Konstruktor (PrintTask) an den AsyncTask (Thread) übrgeben werden.
2. liest die Datei Zeile für Zeile ein und druckt diese aus. (Codiert in HTML)

Ich habe versucht, soweit wie mögich alle Fehler mit try-catch auszuschließen.
Dies muss aber ggf. angepasst werden.

Achtung:
Es müssen folgende Berechtigungen in der Manifest.xml gesetzt werden:

„android.permission.ACCESS_NETWORK_STATE“
„android.permission.ACCESS_WIFI_STATE“
„android.permission.INTERNET“
„android.permission.READ_EXTERNAL_STORAGE“

Dateien auf externen Speicher schreiben (SD-Karte)

In meinem vorigen Beispiel habe ich Dateien vom externen Speicher ausgelesen (HTML-Datei).
Nun muss diese natürlich vorher gespeichert werden.
Dies geht ganz simpel mit folgendem Code:

Es wird ein File / eine Datei mit Namen „print.txt“ in folgendem Pfad „/sdcard/“ erstellt.
Dann wird ein filewriter erstellt und eine Zeichenkette „xyz“ in das File geschrieben.

 File f = new File("/sdcard/print.txt");
FileWriter filewriter = new FileWriter(f);
BufferedWriter bfilewriter = new BufferedWriter(filewriter);
bfilewriter.write("xyz);

Danach muss der BufferedFileWriter geflusht und geschlossen werden:

 bfilewriter.flush();
bfilewriter.close();

Dieser Vorgang benötigt die Permission:

„android.permission.WRITE_EXTERNAL_STORAGE“

in der Manifest.xml

[C#] Verknüpfung auf dem Desktop anlegen

Eine Ordner-Verknüpfung auf dem Desktop(oder in sonstigen Ordnern) mittels C# und dem .NET Framework zu erstellen ist recht simple.

Dazu fügen wir einfach eine Referenz für

Windows Script Host Object Model

hinzu.
Im Visual Studio geht das ganz einfach mittels Rechtsklick auf das
Projekt -> Verweis hinzufügen -> COM

Nun beanspruchen wir die Ressource mittels:

using IWshRuntimeLibrary;

und erstellen eine Methode mit folgendem Inhalt

string deskDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

            WshShell shell = new WshShell();
            IWshShortcut link = (IWshShortcut)shell.CreateShortcut(deskDir + "\\Verknüpfung.lnk");
            link.IconLocation = Pfad + "\\Icon.ico";
            link.TargetPath = Pfad;
            link.Save();

[ratings]