1

phonegap (html5、JQuery、JS) でモバイル アプリを開発しましたが、BT プリンターに印刷するためのプラグインを開発したいと考えています。

プリンター メーカーの SDK をダウンロードし、適切な .jar ファイルをプロジェクトにインポートしました。

次のプラグインを作成します

js

var HelloPlugin = {

    callNativeFunction: function (success, fail, resultType) {
        return cordova.exec(success, fail, "com.tricedesigns.HelloPlugin", "nativeAction", [resultType]);
    }
};

ジャワ

package com.tricedesigns;

import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import com.starmicronics.stario.StarIOPort;
import com.starmicronics.stario.StarIOPortException;
import com.starmicronics.stario.StarPrinterStatus;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.util.Log;

public class HelloPlugin extends Plugin {

    public static final String NATIVE_ACTION_STRING="nativeAction";
    public static final String SUCCESS_PARAMETER="success";

    @Override
    public PluginResult execute(String action, JSONArray data, String callbackId) {

         Log.d("HelloPlugin", "Hello, this is a native function called from PhoneGap/Cordova!");

         //only perform the action if it is the one that should be invoked
         if (NATIVE_ACTION_STRING.equals(action)) {
             String resultType = null;
             StarIOPort port = null;
             byte[] texttoprint = new byte[]{0x1b,0x74,0x0D,(byte) 0x91,(byte) 0x92,(byte) 0x93,(byte) 0x94,(byte) 0x95,(byte) 0x96,(byte) 0x97,(byte) 0x98,(byte) 0x99,0x0A,0x0A,0x0A,0x0A,0x0A};
             try 
             {
                port = StarIOPort.getPort("BT:", "mini", 10000, null);
                    try
                    {
                        Thread.sleep(500);
                    }
                    catch(InterruptedException e) {}

                port.writePort(texttoprint, 0, texttoprint.length);
                    try
                    {
                        Thread.sleep(3000);
                    }
                    catch(InterruptedException e) {}

                resultType = "success";
             }
             catch (StarIOPortException e)
             {
                 resultType = "error";
             }


             if (resultType.equals(SUCCESS_PARAMETER)) {
                 return new PluginResult(PluginResult.Status.OK, "Yay, Success!!!");
             }
             else {
                 return new PluginResult(PluginResult.Status.ERROR, "Oops, Error :(");
             }

         }

         return null;
    }

}

html

<!DOCTYPE html>
<html>
  <head>
  <title></title>

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no;" />
    <meta charset="utf-8">

    <!-- If your application is targeting iOS BEFORE 4.0 you MUST put json2.js from http://www.JSON.org/json2.js into your www directory and include it here -->
    <script type="text/javascript" charset="utf-8" src="cordova-1.6.1.js"></script>

    <script type="text/javascript" charset="utf-8" src="HelloPlugin.js"></script>
    <script type="text/javascript">


    function onBodyLoad()
    {       
        document.addEventListener("deviceready", onDeviceReady, false);
    }

    /* When this function is called, Cordova has been initialized and is ready to roll */
    /* If you are supporting your own protocol, the var invokeString will contain any arguments to the app launch.
    see http://iosdevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
    for more details -jm */
    function onDeviceReady()
    {
        // do your thing!
        navigator.notification.alert("Cordova is working")
    }

    function callNativePlugin( returnSuccess ) {
        HelloPlugin.callNativeFunction( nativePluginResultHandler, nativePluginErrorHandler, returnSuccess );
    }

    function nativePluginResultHandler (result) {
       alert("SUCCESS: \r\n"+result );
    }

    function nativePluginErrorHandler (error) {
       alert("ERROR: \r\n"+error );
    }



    </script>
    </head>
    <body onload="onBodyLoad()">
        <h1>Hey, it's Cordova!</h1>

        <button onclick="callNativePlugin('success');">Click to invoke the Native Plugin with an SUCCESS!</button>
        <button onclick="callNativePlugin('error');">Click to invoke the Native Plugin with an ERROR!</button>
    </body>
</html>

仮想デバイスで実行している場合、プリンターへの接続がないため常にエラーが発生しますが、実際のデバイスで実行している場合は次のエラーが発生します。

エラー: Looper.prepare() を呼び出していないスレッド内にハンドラーを作成できません

4

2 に答える 2

1

一部のデバイスで発生したのと同じ問題がありました。一人の賢い男の子、トビーが私を助けてくれました。したがって、解決策は次のとおりです。
- StarIOPort のメソッドを呼び出す前に、ルーパーが存在するかどうかを確認する必要があります。

if (Looper.myLooper() == null) {
    Looper.prepare();
}

あなたの場合、それは次のようになります:

 try 
 {
    if (Looper.myLooper() == null) {
        Looper.prepare();
    }
    port = StarIOPort.getPort("BT:", "mini", 10000, null);
        try
        {
            Thread.sleep(500);
        }
        catch(InterruptedException e) {}

    port.writePort(texttoprint, 0, texttoprint.length);
        try
        {
            Thread.sleep(3000);
        }
        catch(InterruptedException e) {}

    resultType = "success";
 }
 catch (StarIOPortException e)
 {
     resultType = "error";
 }

もう1つのアドバイス:
代わりに

port = StarIOPort.getPort("BT:", "mini", 10000, null);

ただ使う

port = StarIOPort.getPort("BT:", "mini", 10000);

プラグインでは Context を使用しません

幸運を。

于 2012-09-13T13:53:44.143 に答える
1

以下のコード内に実行を含める必要があります

        this.ctx.runOnUiThread(new Runnable()
        {
            public void run()
            {
            // my code
            }
        });
于 2012-08-18T11:42:19.713 に答える