StarXpand SDK for iOS / Android 開発者向けマニュアル Ver. 1.8.0

最終更新日: 2024年 11月 1日

Step.2 印刷データの送信 : 標準機能

Step1で生成した印刷データをプリンターに送信して印刷を行います。

手順はOSによって異なります。 表示するOSを選択してください。

iOS Android

以下の手順を参考に印刷データを送信してください。
ページ下部にサンプルコードがあります。

1プリンターの接続先情報を作ります。
通信に使用するinterfaceTypeと、接続先を指定するidentifierをセットしてください。
プリンターを検索するで接続先のプリンターを検索済みの場合、この実装は不要です。
手順2のprinter変数には、manager(_ manager: StarDeviceDiscoveryManager, didFind printer: StarPrinter)メソッドで取得したStarPrinterインスタンスをセットしてください。

let starConnectionSettings = StarConnectionSettings(interfaceType: .lan,
                                                            identifier: “00:11:62:00:00:01”)

2プリンターの接続先情報を与えて、StarPrinterインスタンスを取得します。

let printer = StarPrinter(starConnectionSettings)

3Step1で作った印刷データをcommands変数にセットします。

Task {
    do {
        let command = …

4プリンターに接続するためopenメソッドを呼び出します。

try await printer.open()

5印刷データの送信を行った後にプリンターとの接続を切断するため、deferブロックでcloseメソッドを呼び出します。

defer {
    Task {
        await printer.close()
    }
}

6プリンターに印刷データを送信するため、printメソッドを呼び出します。

try await printer.print(command: command)

7StarIO10Errorの値によりエラーを判別し、エラー時の処理を実装します。
発生する可能性のあるエラーはStarPrinterクラスのopenメソッド、printメソッドのAPIリファレンスに記載されています。

} catch StarIO10Error.notFound(message: let message, errorCode: let errorCode) {
    // Printer not found.
    // This may be due to the printer not being turned on or incorrect connection information.
} catch let error {
    print("Error: \(error)")
}
}

Memo

  • インターフェイス自動切り替え機能が動作している場合、プリンターへの接続に失敗したときのエラーはStarIO10Error.communicationに集約されます。
    またその際、autoSwitchInterfaceOpenErrorsプロパティ(オプショナル)に値がセットされます。その値を確認することで、インターフェイス自動切り替え機能で各インターフェイスの接続試行が失敗した原因を取得することができます。 詳しくはこちらを参照してください。
  • errorCode値から、より詳細なエラー要因が取得できる場合があります。
    こちらで、printメソッドで発生したエラーの例を用いて詳細を説明しています。
サンプルコード

func print() {
    let starConnectionSettings = StarConnectionSettings(interfaceType: .lan,
                                                            identifier: “00:11:62:00:00:01”)
    let printer = StarPrinter(starConnectionSettings)

    // Set the print data created in Step 1 to the command variable.
    let commands = …
    
    Task {
        do {
            try await printer.open()
        } catch StarIO10Error.communication(message: let message, errorCode: let errorCode) {
            // If Auto Switch Interface feature is working, the autoSwitchInterfaceOpenErrors property
            // is set to a value indicating errors of each interface.
            if let openErrors = printer.errorDetail.autoSwitchInterfaceOpenErrors {
                confirmAutoSwitchInterfaceOpenErrors(openErrors)
            }
            return
        } catch let error {
            print(error)
            return
        }
        
        do {
            defer {
                Task {
                    await printer.close()
                }
            }
            
            try await printer.print(command: commands)
        } catch StarIO10Error.unprintable(message: let message, errorCode: let errorCode, status: let status) {
            // If an error occurs and the print process fails, the StarIO10Error.unprintable is thrown.
            // More detailed error information may be obtained with the errorCode property.
            switch errorCode {
            case .deviceHasError:
                // An error (e.g. paper empty or cover open) has occurred in the printer.
                // Please retry after resolving the printer error.
                print("An error (e.g. paper empty or cover open) has occurred in the printer.")
            case .printerHoldingPaper:
                // The printer is holding paper.
                // Remove the pre-printed paper and printing will begin.
                print("The printer is holding paper.")
            default:
                // Other errors occurred.
                print("Other errors occurred.")
            }
        } catch let error {
            // Catch other exceptions.
        }
    }
}
	// Confirm the error that occurred when opening the printer with the Auto Switch Interface feature worked.
func confirmAutoSwitchInterfaceOpenErrors(_ openErrors: Dictionary<InterfaceType, StarIO10Error?>) {
    if let lanError = openErrors[.lan],
       let lanError = lanError {
        switch lanError {
        case .illegalDeviceState(message: let message, errorCode: let errorCode):
            // The network function of the host device cannot be used.
            // Make sure that the host device's Wi-Fi is on and
            // is connected to the network.
            print("illegalDeviceStat Error: \(lanError)")
        case .notFound(message: let message, errorCode: let errorCode):
            // Printer is not found.
            // Make sure that the printer is connected to the network.
            print("notFound Error: \(lanError)")
        default:
            // Other errors occurred.
            print("Other Error: \(lanError)")
        }
    }
    
    if let bluetoothError = openErrors[.bluetooth],
       let bluetoothError = bluetoothError {
        switch bluetoothError {
        case .illegalDeviceState(message: let message, errorCode: let errorCode):
            // The Bluetooth function of the host device cannot be used.
            // Make sure that the host device's Bluetooth is on.
            print("illegalDeviceState Error: \(bluetoothError)")
        case .notFound(message: let message, errorCode: let errorCode):
            // Printer is not found.
            // Make sure that the printer is paired and connected with the host device.
            print("notFound Error: \(bluetoothError)")
        default:
            // Other errors occurred.
            print("Other Error: \(bluetoothError)")
        }
    }
    
    if let usbError = openErrors[.usb],
       let usbError = usbError {
        switch usbError {
        case .notFound(message: let message, errorCode: let errorCode):
            // Printer is not found.
            // Make sure that the host device and printer are connected with a USB cable.
            print("notFound Error: \(usbError)")
        default:
            // Other errors occurred.
            print("Other Error: \(usbError)")
        }
    }
    
    // openErrors[InterfaceType.bluetoothLE] is always nil, because there is
    // no Auto Switch Interface feature enabled model that supports bluetoothLE InterfaceType.
}



インターフェイス自動切り替え機能動作時の失敗原因取得方法

autoSwitchInterfaceOpenErrorsプロパティは InterfaceType をキー、StarIO10Error? を値とする辞書です。インターフェイス自動切り替え機能動作時の各インターフェイスでの接続試行が失敗したときの例外が格納されています。値がnilの場合、そのインターフェイスをプリンターが持っていないか、そのインターフェイスでの接続試行は実行されなかったことを示します。
例えば、LANインターフェイスでの接続失敗原因は下記のように判別できます。  
  •  StarIO10Error.illegalDeviceState : ホスト端末のネットワーク機能が利用できません。ホスト端末のWi-Fiがオンであること、ネットワークに接続されていることを確認してください。
  •  StarIO10Error.notFound : プリンターが見つかりません。プリンターがネットワークに接続されていることを確認してください。
if let lanError = openErrors[.lan],
    let lanError = lanError {
    switch lanError {
    case .illegalDeviceState(message: let message, errorCode: let errorCode):
        // The network function of the host device cannot be used.
        // Make sure that the host device's Wi-Fi is on and
        // is connected to the network.
        print("illegalDeviceStat Error: \(lanError)")
    case .notFound(message: let message, errorCode: let errorCode):
        // Printer is not found.
        // Make sure that the printer is connected to the network.
        print("notFound Error: \(lanError)")
    default:
        // Other errors occurred.
        print("Other Error: \(lanError)")
    }
}        

失敗原因の取得処理全体は、サンプルコードのconfirmAutoSwitchInterfaceOpenErrorsメソッドを参照してください。


StarIO10ErrorCodeによるエラー詳細情報取得方法

errorCode値から、より詳細なエラー要因が取得できる場合があります。
例えば、printメソッドで印刷処理に失敗した場合、StarIO10Error.unprintableがスローされます。その際errorCode値を参照して、エラー要因ごとに下記のように対処できます。
  •  deviceHasError : プリンターが用紙無しやカバーオープンなどのエラー状態になっています。エラー状態を解消した後、印刷を再試行します。
  •  printerHoldingPaper : プリンターが用紙を保持しています。前に印刷した用紙を取り除くと、印刷が始まります。
} catch StarIO10Error.unprintable(message: let message, errorCode: let errorCode, status: let status) {
    // If an error occurs and the print process fails, the StarIO10Error.unprintable is thrown.
    // More detailed error information may be obtained with the errorCode property.
    switch errorCode {
    case .deviceHasError:
        // An error (e.g. paper empty or cover open) has occurred in the printer.
        // Please retry after resolving the printer error.
        print("An error (e.g. paper empty or cover open) has occurred in the printer.")
    case .printerHoldingPaper:
        // The printer is holding paper.
        // Remove the pre-printed paper and printing will begin.
        print("The printer is holding paper.")
    default:
        // Other errors occurred.
        print("Other errors occurred.")
    }
} catch let error {
    // Catch other exceptions.
}
		

以下の手順を参考に印刷データを送信してください。
ページ下部にサンプルコードがあります。

1プリンターの接続先情報を作ります。
通信に使用するinterfaceTypeと、接続先を指定するidentifierをセットしてください。
プリンターを検索するで接続先のプリンターを検索済みの場合、この実装は不要です。
手順2のprinter変数には、onPrinterFoundメソッドで取得したStarPrinterインスタンスをセットしてください。

val settings = StarConnectionSettings(InterfaceType.Lan, “00:11:62:00:00:01”)

2プリンターの接続先情報を与えて、StarPrinterインスタンスを取得します。

val printer = StarPrinter(settings, applicationContext)

3Step1で作った印刷データをcommands変数にセットします。

val job = SupervisorJob()
val scope = CoroutineScope(Dispatchers.Default + job)

scope.launch {
    try {
        val commands = …

4プリンターに接続するためopenAsyncメソッドを呼び出します。

printer.openAsync().await()

5プリンターに印刷データを送信するためprintAsyncメソッドを呼び出します。

printer.printAsync(commands).await()

6エラーの型によりエラー要因を判別し、エラー時の処理を実装します。
発生する可能性のあるエラーはStarPrinterクラスのopenAsyncメソッド、printAsyncメソッドのAPIリファレンスに記載されています。

} catch (e: StarIO10NotFoundException) {
    // Printer not found.
    // This may be due to the printer not being turned on or incorrect connection information.
} catch (e: Exception) {
    Log.d("Printing", "Error: ${e}")

Memo

  • インターフェイス自動切り替え機能が動作している場合、プリンターへの接続に失敗したときのエラーはStarIO10CommunicationExceptionに集約されます。
    またその際、autoSwitchInterfaceOpenErrorsプロパティ(オプショナル)に値がセットされます。その値を確認することで、インターフェイス自動切り替え機能で各インターフェイスの接続試行が失敗した原因を取得することができます。 詳しくはこちらを参照してください。
  • errorCodeプロパティから、より詳細なエラー要因が取得できる場合があります。
    こちらで、printAsyncメソッドで発生したエラーの例を用いて詳細を説明しています。


7プリンターとの接続を切断するためcloseAsyncメソッドを呼び出します。

} finally {
printer.closeAsync().await()
}
}
サンプルコード

fun print() {
    val settings = StarConnectionSettings(InterfaceType.Lan, “00:11:62:00:00:01”)
    val printer = StarPrinter(settings, applicationContext)

    val job = SupervisorJob()
    val scope = CoroutineScope(Dispatchers.Default + job)

// Set the print data created in Step 1 to the commands variable.
    val commands = …

    scope.launch {
        try {
            printer.openAsync().await()
        } catch (e: StarIO10CommunicationException) {
            // If Auto Switch Interface feature is working, the autoSwitchInterfaceOpenErrors property
            // is set to a value indicating errors of each interface.
            printer.errorDetail.autoSwitchInterfaceOpenErrors?.let { it ->
                confirmAutoSwitchInterfaceOpenErrors(it)
            }
            return@launch
        } catch (e: Exception) {
            // Catch other exceptions.
            return@launch
        }

        try {
            printer.printAsync(commands).await()
        } catch (e: StarIO10UnprintableException) {
            // If an error occurs and the print process fails, the StarIO10UnprintableException is thrown.
            // More detailed error information may be obtained with the errorCode property.
            when (e.errorCode) {
                StarIO10ErrorCode.DeviceHasError -> {
                    // An error (e.g. paper empty or cover open) has occurred in the printer.
                    // Please retry after resolving the printer error.
                }
                StarIO10ErrorCode.PrinterHoldingPaper -> {
                    // The printer is holding paper.
                    // Remove the pre-printed paper and printing will begin.
                }
                else -> {
                    // Other errors occurred.
                }
            }
        } catch (e: Exception) {
            // Catch other exceptions.
        } finally {
            printer.closeAsync().await()
        }
    }
}
	  
// Confirm the error that occurred when opening the printer with the Auto Switch Interface feature worked.
fun confirmAutoSwitchInterfaceOpenErrors(openErrors: Map<InterfaceType, StarIO10Exception?>) {
    openErrors[InterfaceType.Lan]?.let {
        when (it) {
            is StarIO10IllegalHostDeviceStateException -> {
                // The network function of the host device cannot be used.
                // Make sure that the host device's Wi-Fi is on and
                // is connected to the network.
            }
            is StarIO10NotFoundException -> {
                // Printer is not found.
                // Make sure that the printer is connected to the network.
            }
            else -> {
                // Other errors occurred.
            }
        }
    }

    openErrors[InterfaceType.Bluetooth]?.let {
        when (it) {
            is StarIO10IllegalHostDeviceStateException -> {
                // The Bluetooth function of the host device cannot be used.
                // Make sure that the host device's Bluetooth is on.
            }
            is StarIO10NotFoundException -> {
                // Printer is not found.
                // Make sure that the printer is paired with the host device.
            }
            else -> {
                // Other errors occurred.
            }
        }
    }

    openErrors[InterfaceType.Usb]?.let {
        when (it) {
            is StarIO10NotFoundException -> {
                // Printer is not found.
                // Make sure that the host device and printer are connected with a USB cable.
            }
            else -> {
                // Other errors occurred.
            }
        }
    }

    // openErrors[InterfaceType.BluetoothLE] is always null, because there is
    // no Auto Switch Interface feature enabled model that supports BluetoothLE InterfaceType.
}



インターフェイス自動切り替え機能動作時の失敗原因取得方法

autoSwitchInterfaceOpenErrorsプロパティは InterfaceType をキー、StarIO10Exception? を値とする辞書です。インターフェイス自動切り替え機能動作時の各インターフェイスでの接続試行が失敗したときの例外が格納されています。値がnullの場合、そのインターフェイスをプリンターが持っていないか、そのインターフェイスでの接続試行は実行されなかったことを示します。
例えば、LANインターフェイスでの接続失敗原因は下記のように判別できます。  
  •  StarIO10IllegalHostDeviceStateException : ホスト端末のネットワーク機能が利用できません。ホスト端末のWi-Fiがオンであること、ネットワークに接続されていることを確認してください。
  •  StarIO10NotFoundException : プリンターが見つかりません。プリンターがネットワークに接続されていることを確認してください。
openErrors[InterfaceType.Lan]?.let {
    when (it) {
        is StarIO10IllegalHostDeviceStateException -> {
            // The network function of the host device cannot be used.
            // Make sure that the host device's Wi-Fi is on and
            // is connected to the network.
        }
        is StarIO10NotFoundException -> {
            // Printer is not found.
            // Make sure that the printer is connected to the network.
        }
        else -> {
            // Other errors occurred.
        }
    }
}        

失敗原因の取得処理全体は、サンプルコードのconfirmAutoSwitchInterfaceOpenErrorsメソッドを参照してください。


StarIO10ErrorCodeによるエラー詳細情報取得方法

errorCodeプロパティから、より詳細なエラー要因が取得できる場合があります。
例えば、printAsyncメソッドで印刷処理に失敗した場合、StarIO10UnprintableExceptionがスローされます。その際errorCodeプロパティを参照して、エラー要因ごとに下記のように対処できます。  
  •  DeviceHasError : プリンターが用紙無しやカバーオープンなどのエラー状態になっています。エラー状態を解消した後、印刷を再試行します。
  •  PrinterHoldingPaper : プリンターが用紙を保持しています。前に印刷した用紙を取り除くと、印刷が始まります。
} catch (e: StarIO10UnprintableException) {
    // If an error occurs and the print process fails, the StarIO10UnprintableException is thrown.
    // More detailed error information may be obtained with the errorCode property.
    when (e.errorCode) {
        StarIO10ErrorCode.DeviceHasError -> {
            // An error (e.g. paper empty or cover open) has occurred in the printer.
            // Please retry after resolving the printer error.
        }
        StarIO10ErrorCode.PrinterHoldingPaper -> {
            // The printer is holding paper.
            // Remove the pre-printed paper and printing will begin.
        }
        else -> {
            // Other errors occurred.
        }
    }
} catch (e: Exception) {
    // Catch other exceptions.
}