我有以下问题:
我必须使用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
我如何使用上述功能,因为在我使用它的方式中,我没有收到任何错误,也没有收到任何警告信息。
答案 0 :(得分:2)
要显示Alert(或任何其他UI组件),您需要Activity上下文,这是正确的。如果此时没有运行任何活动,则无法显示警报。
但您可以使用类Toast的静态方法显示Toast:
public static Toast makeText(Context context, CharSequence text, int duration);
将Application Context作为第一个参数传递给它。
应用程序上下文在您的应用程序运行时始终可用,即使此时没有运行UI。您可以通过从上下文中调用 getApplicationContext()方法来获取它。如果您根本没有任何上下文,则可以始终使用在xml标记下的清单中定义的YourAppClass(公共类YourAppClass extends Application )。 最常见的做法是将 YourAppClass 设为单身,并且它始终可以在您应用中的任何代码点使用。
答案 1 :(得分:0)
Context是一个与Activity相关的类,你必须在show和AlertDialog,Toast,获取系统服务时使用它......它与arquitecture MVC有关,它有点长的解释。关于使用它,有两种方法。一个是由droidhot解释的,另一种方式是,例如,MainActivity.this,如果你在Main Activity(MainActivity.java文件)中使用AlertDialog,那么Main Activity将是启动Alert Dialog的那个。如果它是从另一个不是Activity的类启动的,则必须将上下文作为参数(例如,new Class(MainActivity.this))并在类中,例如,它将是公共类(Context) context)参数上下文是你必须使用的。
答案 2 :(得分:0)
Activity是Context的子类,因此如果您打印代码是Activity类的一部分,那么只需提供this
作为满足SDK要求所需的上下文:
port = StarIOPort.getPort(portName, portSettings, 10000, this);
以后
Builder dialog = new AlertDialog.Builder(this);
答案 3 :(得分: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();
}
}
}
答案 4 :(得分: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
祝你好运。