1

我有以下问题:

我必须使用 BT 打印机 SDK 中的以下功能:

    StarIOPort port = null;
    byte[] texttoprint = new byte[]{0x1b, 0x40, 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(portName, portSettings, 10000, context);
        port.writePort(textToPrint, 0, textToPrint.length);
        port.writePort(new byte[] {0x0a}, 0, 1);
    }
    catch (StarIOPortException e)
    {
        Builder dialog = new AlertDialog.Builder(context);
        dialog.setNegativeButton("Ok", null);
        AlertDialog alert = dialog.create();
        alert.setTitle("Failure");
        alert.setMessage("Failed to connect to printer");
        alert.show();
    }

除了上下文,我什么都懂。

制造商提到

 * @param context - Activity for displaying messages to the user

我如何使用上述功能,因为在我使用它的方式中,我没有收到任何错误,也没有收到任何警报消息。

4

5 回答 5

2

要显示警报(或任何其他 UI 组件),您需要 Activity 上下文,这是正确的。如果您目前没有任何活动正在运行,则无法显示警报。

但是您可以使用 Toast 类的静态方法显示Toast

public static Toast makeText(Context context, CharSequence text, int duration);

将应用程序上下文作为第一个参数传递给它。

应用程序运行时始终可用应用程序上下文,即使此时没有运行 UI。您可以通过从上下文中调用getApplicationContext()方法来获取它。如果您根本没有任何上下文,则始终可以使用您的清单中 xml 标记下定义的YourAppClass ( public class YourAppClass extends Application )。最常见的做法是让YourAppClass成为单例,并且它始终可以在应用程序中的任何代码点使用。

于 2012-09-03T12:58:46.560 回答
0

Context是一个与Activity相关的类,当你必须显示时使用它,AlertDialog,Toast,获取系统服务......它与arquitecture MVC相关,解释的有点长。关于使用它,有两种方法。一种由 droidhot 解释,另一种方式是,例如 MainActivity.this,如果您在 Main Activity(MainActivity.java 文件)中使用 AlertDialog,那么 Main Activity 将是启动 Alert Dialog 的那个。如果它是从另一个不是 Activity 的类启动的,则必须将上下文作为参数(例如 new Class(MainActivity.this))并在类内部,例如 public class( Context context) ant 参数 context 是您必须使用的参数。

于 2012-09-03T12:57:00.490 回答
0

Activity 是 Context 的子类,因此如果您打印代码是 Activity 类的一部分,则只需提供this所需的上下文即可满足 SDK 要求:

port = StarIOPort.getPort(portName, portSettings, 10000, this);

然后

Builder dialog = new AlertDialog.Builder(this);
于 2012-09-03T12:58:26.077 回答
0

上下文是您的活动。

private Context context;
context = this;

这是一个完整的示例活动。

package com.example.helloworld;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import <my_star_io_library>;

public class HelloWorld extends Activity 
{
    private Context context;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        //Save context
        context = this;

        StarIOPort port = null; 
        byte[] texttoprint = new byte[]{0x1b, 0x40, 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(portName, portSettings, 10000, context); 
            port.writePort(textToPrint, 0, textToPrint.length); 
            port.writePort(new byte[] {0x0a}, 0, 1); 
        } 
        catch (StarIOPortException e) 
        { 
            Builder dialog = new AlertDialog.Builder(context); 
            dialog.setNegativeButton("Ok", null); 
            AlertDialog alert = dialog.create(); 
            alert.setTitle("Failure"); 
            alert.setMessage("Failed to connect to printer"); 
            alert.show(); 
        } 
    }
}
于 2012-09-03T13:00:55.277 回答
0

我在这里发布了答案: Android Phonegap Plugin different result on virtual and real device (Looper.prepare() ERROR)

我遇到了在某些设备上出现的相同问题。一个聪明的男孩托比成功地帮助了我。因此,下一个解决方案是:
- 在调用任何 StarIOPort 的方法之前,您必须检查 looper 是否存在:

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";
 }

另一个建议:
相反

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

只用

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

在插件中你不会使用 Context

祝你好运。

于 2012-09-13T13:59:14.827 回答