CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-com-google-zxing--core

Core barcode encoding/decoding library supporting 17 formats including QR Code, Data Matrix, Aztec, PDF 417, and various 1D barcodes

Pending
Overview
Eval results
Files

result-parsing.mddocs/reference/

Result Parsing

Comprehensive result parsing system that converts raw barcode text into structured data types. Includes 37 parser implementations supporting 12 result types: contact information (vCard, MECARD), email addresses, URIs, geographic coordinates, phone numbers, SMS messages, calendar events, WiFi configurations, product barcodes, ISBN, and VIN. Parsers automatically detect format and extract structured fields from encoded data.

Capabilities

ResultParser

Abstract base class for all result parsers. Provides main entry point for parsing decoded barcode text into structured format.

/**
 * Abstract base class for parsing barcode results into structured data.
 * Subclasses detect and parse specific data formats (vCard, URLs, WiFi, etc.).
 */
public abstract class ResultParser {
    /**
     * Main parsing entry point. Automatically detects format and returns
     * appropriate ParsedResult type.
     *
     * @param result Decoded barcode result from Reader
     * @return ParsedResult subclass or TextParsedResult if no format detected
     */
    public static ParsedResult parseResult(Result result);

    /**
     * Attempts to parse result into specific format.
     * Subclasses implement format-specific parsing logic.
     *
     * @param result Decoded barcode result
     * @return ParsedResult if format matches, null otherwise
     */
    public abstract ParsedResult parse(Result result);
}

ParsedResult

Abstract base class for all parsed result types. Provides type information and display formatting.

/**
 * Abstract base class for parsed barcode results.
 * Subclasses provide structured access to specific data types.
 */
public abstract class ParsedResult {
    /**
     * Gets the type of parsed result.
     *
     * @return ParsedResultType enum value
     */
    public final ParsedResultType getType();

    /**
     * Gets human-readable display string.
     *
     * @return Formatted string for display
     */
    public abstract String getDisplayResult();

    /**
     * Gets the original raw text from barcode.
     *
     * @return Original decoded text
     */
    public String toString();
}

ParsedResultType

Enumeration of all supported parsed result types.

/**
 * Types of structured parsed results.
 */
public enum ParsedResultType {
    /** Contact information (vCard, MECARD, etc.) */
    ADDRESSBOOK,

    /** Email address with optional subject/body */
    EMAIL_ADDRESS,

    /** Product barcode (UPC/EAN) */
    PRODUCT,

    /** URI/URL */
    URI,

    /** Plain text (fallback) */
    TEXT,

    /** Geographic coordinates */
    GEO,

    /** Telephone number */
    TEL,

    /** SMS message */
    SMS,

    /** Calendar event */
    CALENDAR,

    /** WiFi network configuration */
    WIFI,

    /** ISBN book identifier */
    ISBN,

    /** Vehicle identification number */
    VIN
}

Parsed Result Types

AddressBookParsedResult

Contact information from vCard, MECARD, or BIZCARD formats.

/**
 * Parsed contact information.
 * Supports vCard, MECARD, BIZCARD, and other contact formats.
 */
public final class AddressBookParsedResult extends ParsedResult {
    public String[] getNames();
    public String[] getNicknames();
    public String getPronunciation();
    public String[] getPhoneNumbers();
    public String[] getPhoneTypes();
    public String[] getEmails();
    public String[] getEmailTypes();
    public String getInstantMessenger();
    public String getNote();
    public String[] getAddresses();
    public String[] getAddressTypes();
    public String getTitle();
    public String getOrg();
    public String[] getURLs();
    public String getBirthday();
    public String[] getGeo();
}

Usage:

ParsedResult parsed = ResultParser.parseResult(result);
if (parsed.getType() == ParsedResultType.ADDRESSBOOK) {
    AddressBookParsedResult contact = (AddressBookParsedResult) parsed;

    String[] names = contact.getNames();
    String[] phones = contact.getPhoneNumbers();
    String[] emails = contact.getEmails();

    System.out.println("Name: " + String.join(" ", names));
    System.out.println("Phone: " + (phones != null ? phones[0] : "N/A"));
    System.out.println("Email: " + (emails != null ? emails[0] : "N/A"));
}

EmailAddressParsedResult

Email address with optional subject, body, CC, and BCC fields.

/**
 * Parsed email address with optional subject/body.
 * Supports MATMSG, SMTP, and mailto: formats.
 */
public final class EmailAddressParsedResult extends ParsedResult {
    public String[] getTos();
    public String[] getCCs();
    public String[] getBCCs();
    public String getSubject();
    public String getBody();
    public String getMailtoURI();
}

URIParsedResult

URI/URL with optional title.

/**
 * Parsed URI/URL.
 * Supports http://, https://, and other URI schemes.
 */
public final class URIParsedResult extends ParsedResult {
    public String getURI();
    public String getTitle();
    public boolean isPossiblyMaliciousURI();
}

GeoParsedResult

Geographic coordinates (latitude, longitude, altitude).

/**
 * Parsed geographic coordinates.
 * Supports geo: URI format.
 */
public final class GeoParsedResult extends ParsedResult {
    public double getLatitude();
    public double getLongitude();
    public double getAltitude();
    public String getQuery();
    public String getGeoURI();
}

TelParsedResult

Telephone number.

/**
 * Parsed telephone number.
 * Supports tel: URI format.
 */
public final class TelParsedResult extends ParsedResult {
    public String getNumber();
    public String getTelURI();
    public String getTitle();
}

SMSParsedResult

SMS message with optional subject and body.

/**
 * Parsed SMS message.
 * Supports sms:, smsto:, mms:, mmsto: formats.
 */
public final class SMSParsedResult extends ParsedResult {
    public String[] getNumbers();
    public String[] getVias();
    public String getSubject();
    public String getBody();
    public String getSMSURI();
}

CalendarParsedResult

Calendar event (vCalendar/iCalendar).

/**
 * Parsed calendar event.
 * Supports VEVENT format.
 */
public final class CalendarParsedResult extends ParsedResult {
    public String getSummary();
    public Date getStart();
    public boolean isStartAllDay();
    public Date getEnd();
    public boolean isEndAllDay();
    public String getStartString();
    public String getEndString();
    public String getLocation();
    public String getOrganizer();
    public String[] getAttendees();
    public String getDescription();
    public double getLatitude();
    public double getLongitude();
}

WifiParsedResult

WiFi network configuration.

/**
 * Parsed WiFi configuration.
 * Supports WIFI: format for network credentials.
 */
public final class WifiParsedResult extends ParsedResult {
    public String getSsid();
    public String getNetworkEncryption();
    public String getPassword();
    public boolean isHidden();
    public String getIdentity();
    public String getAnonymousIdentity();
    public String getEapMethod();
    public String getPhase2Method();
}

Usage:

ParsedResult parsed = ResultParser.parseResult(result);
if (parsed.getType() == ParsedResultType.WIFI) {
    WifiParsedResult wifi = (WifiParsedResult) parsed;

    String ssid = wifi.getSsid();
    String password = wifi.getPassword();
    String encryption = wifi.getNetworkEncryption();

    System.out.println("SSID: " + ssid);
    System.out.println("Password: " + password);
    System.out.println("Encryption: " + encryption);

    // Connect to WiFi programmatically
    connectToWiFi(ssid, password, encryption);
}

ProductParsedResult

Product barcode (UPC/EAN).

/**
 * Parsed product barcode.
 * Supports UPC-A, UPC-E, EAN-8, EAN-13.
 */
public final class ProductParsedResult extends ParsedResult {
    public String getProductID();
    public String getNormalizedProductID();
}

ExpandedProductParsedResult

Expanded product information (RSS Expanded/GS1 DataBar).

/**
 * Parsed expanded product information.
 * Supports RSS Expanded with Application Identifiers.
 */
public final class ExpandedProductParsedResult extends ParsedResult {
    public String getRawText();
    public String getProductID();
    public String getSscc();
    public String getLotNumber();
    public String getProductionDate();
    public String getPackagingDate();
    public String getBestBeforeDate();
    public String getExpirationDate();
    public String getWeight();
    public String getWeightType();
    public String getWeightIncrement();
    public String getPrice();
    public String getPriceIncrement();
    public String getPriceCurrency();
    public Map<String,String> getUncommonAIs();
}

ISBNParsedResult

ISBN book identifier.

/**
 * Parsed ISBN number.
 * Supports ISBN-10 and ISBN-13 from EAN-13 barcodes.
 */
public final class ISBNParsedResult extends ParsedResult {
    public String getISBN();
}

VINParsedResult

Vehicle Identification Number.

/**
 * Parsed VIN (Vehicle Identification Number).
 * Extracts and validates 17-character VIN structure.
 */
public final class VINParsedResult extends ParsedResult {
    public String getVIN();
    public String getWorldManufacturerID();
    public String getVehicleDescriptorSection();
    public String getVehicleIdentifierSection();
    public String getCountryCode();
    public String getVehicleAttributes();
    public int getModelYear();
    public char getPlantCode();
    public String getSequentialNumber();
}

TextParsedResult

Plain text (fallback when no specific format detected).

/**
 * Fallback for plain text.
 * Used when no specific format is detected.
 */
public final class TextParsedResult extends ParsedResult {
    public String getText();
    public String getLanguage();
}

Usage Examples

Basic Parsing

import com.google.zxing.*;
import com.google.zxing.client.result.*;

// Decode barcode
Reader reader = new MultiFormatReader();
Result result = reader.decode(bitmap);

// Parse into structured data
ParsedResult parsed = ResultParser.parseResult(result);

System.out.println("Type: " + parsed.getType());
System.out.println("Display: " + parsed.getDisplayResult());

Type-Specific Handling

ParsedResult parsed = ResultParser.parseResult(result);

switch (parsed.getType()) {
    case URI:
        URIParsedResult uri = (URIParsedResult) parsed;
        openBrowser(uri.getURI());
        break;

    case WIFI:
        WifiParsedResult wifi = (WifiParsedResult) parsed;
        connectToWiFi(wifi.getSsid(), wifi.getPassword(),
                     wifi.getNetworkEncryption());
        break;

    case TEL:
        TelParsedResult tel = (TelParsedResult) parsed;
        dialNumber(tel.getNumber());
        break;

    case SMS:
        SMSParsedResult sms = (SMSParsedResult) parsed;
        composeSMS(sms.getNumbers()[0], sms.getBody());
        break;

    case EMAIL_ADDRESS:
        EmailAddressParsedResult email = (EmailAddressParsedResult) parsed;
        composeEmail(email.getTos()[0], email.getSubject(), email.getBody());
        break;

    case GEO:
        GeoParsedResult geo = (GeoParsedResult) parsed;
        openMaps(geo.getLatitude(), geo.getLongitude());
        break;

    case ADDRESSBOOK:
        AddressBookParsedResult contact = (AddressBookParsedResult) parsed;
        addToContacts(contact);
        break;

    case CALENDAR:
        CalendarParsedResult event = (CalendarParsedResult) parsed;
        addToCalendar(event);
        break;

    case PRODUCT:
        ProductParsedResult product = (ProductParsedResult) parsed;
        lookupProduct(product.getProductID());
        break;

    case ISBN:
        ISBNParsedResult isbn = (ISBNParsedResult) parsed;
        lookupBook(isbn.getISBN());
        break;

    case TEXT:
    default:
        TextParsedResult text = (TextParsedResult) parsed;
        displayText(text.getText());
        break;
}

Encoding Formats

WiFi QR Code

WIFI:T:WPA;S:MyNetwork;P:MyPassword;H:false;;
  • T: Network type (WPA, WPA2, WEP, nopass)
  • S: SSID
  • P: Password
  • H: Hidden (true/false)

vCard (Contact)

BEGIN:VCARD
VERSION:3.0
N:Doe;John
TEL:+1-555-1234
EMAIL:john@example.com
END:VCARD

MECARD (Contact)

MECARD:N:Doe,John;TEL:+15551234;EMAIL:john@example.com;;

Email

MATMSG:TO:john@example.com;SUB:Hello;BODY:Message text;;

or

mailto:john@example.com?subject=Hello&body=Message%20text

SMS

SMSTO:+15551234:Message text

Geographic Coordinates

geo:37.7749,-122.4194
geo:37.7749,-122.4194,100
geo:37.7749,-122.4194?q=San+Francisco

Calendar Event

BEGIN:VEVENT
SUMMARY:Meeting
DTSTART:20240115T140000Z
DTEND:20240115T150000Z
LOCATION:Office
END:VEVENT

Parser Implementations

ZXing includes 37 parser implementations:

Contact Parsers:

  • VCardResultParser
  • AddressBookDoCoMoResultParser
  • AddressBookAUResultParser
  • BizcardResultParser

Email Parsers:

  • EmailAddressResultParser
  • EmailDoCoMoResultParser
  • SMTPResultParser

Communication Parsers:

  • TelResultParser
  • SMSMMSResultParser
  • SMSTOMMSTOResultParser

Location Parsers:

  • GeoResultParser

URI Parsers:

  • URIResultParser
  • URLTOResultParser

Network Parsers:

  • WifiResultParser

Calendar Parsers:

  • VEventResultParser

Product Parsers:

  • ProductResultParser
  • ExpandedProductResultParser
  • ISBNResultParser
  • VINResultParser

And many more format-specific parsers

Best Practices

Always Parse Results:

  • Use ResultParser.parseResult() on all decoded barcodes
  • Provides structured access instead of raw text parsing
  • Handles multiple format variations automatically

Type Checking:

  • Always check ParsedResultType before casting
  • Use switch statement or if-else chain
  • Handle TEXT type as fallback

Error Handling:

  • Parsing never throws exceptions
  • Invalid data returns TextParsedResult
  • Check for null fields in parsed results

Security:

  • Validate URIs with isPossiblyMaliciousURI()
  • Sanitize all user-facing text
  • Don't automatically execute actions without user confirmation
  • Be cautious with WiFi passwords and contact information

User Experience:

  • Use getDisplayResult() for user-friendly display
  • Provide appropriate actions for each type (dial, open browser, save contact)
  • Ask user confirmation before automatic actions
  • Handle missing optional fields gracefully

See Also

  • Result Handling - Result object contains raw barcode data
  • QR Code Support - QR codes commonly encode WiFi, URLs, vCards
  • Core Reading and Writing - Decode produces Result for parsing
  • Barcode Formats - Different formats support different data types

Install with Tessl CLI

npx tessl i tessl/maven-com-google-zxing--core

docs

index.md

tile.json