0

几天来我一直在尝试解决此问题,但仍然无法解决...请有人可以帮助我。

我目前正在尝试开发一个与starmicronic 应用程序具有相同功能的应用程序。您可以在下面找到 SDK。

http://www.starmicronics.com/support/ZipFile.aspx?sat2=195

一开始我只是将 Jar Library StarIOPort3.1.Jar 复制到工作区,然后导入到 Main.java

我试图将此功能复制到我的主类中,但起初我错过了在清单设置中添加互联网权限。添加互联网权限后,我仍然得到 E/AndroidRuntime(776) 的运行时异常:java.lang.IllegalStateException:无法执行活动的方法。

但它适用于 Star SDK……但不适用于我的版本。

public void PortDiscovery(View view)
{
    List<PortInfo> BTPortList;
    List<PortInfo> TCPPortList;
    final EditText editPortName;

    final ArrayList<PortInfo> arrayDiscovery;
    ArrayList<String> arrayPortName;

    arrayDiscovery = new ArrayList<PortInfo>();
    arrayPortName = new ArrayList<String>();

    try {

        BTPortList  = StarIOPort.searchPrinter("BT:");
        TCPPortList = StarIOPort.searchPrinter("TCP:");

        for (PortInfo portInfo : BTPortList) {
              arrayDiscovery.add(portInfo);
        }

        for (PortInfo portInfo : TCPPortList) {
            arrayDiscovery.add(portInfo);
        }

        arrayPortName = new ArrayList<String>();

        for(PortInfo discovery : arrayDiscovery)
        {
            String portName;

            portName = discovery.getPortName();

            if(discovery.getMacAddress().equals("") == false)
            {
                portName += "\n - " + discovery.getMacAddress();
                if(discovery.getModelName().equals("") == false)
                {
                    portName += "\n - " + discovery.getModelName();
                }
            }

            arrayPortName.add(portName);
        }


    } catch (StarIOPortException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    editPortName = new EditText(this);

    new AlertDialog.Builder(this)
    .setIcon(R.drawable.icon) 
    .setTitle("Please Select IP Address or Input Port Name") 
    .setView(editPortName) 
    .setPositiveButton("OK", new DialogInterface.OnClickListener()
    {
        public void onClick(DialogInterface dialog, int button)
        {
            EditText portNameField = (EditText)findViewById(R.id.editText_PortName);
            portNameField.setText(editPortName.getText());
            SharedPreferences pref = getSharedPreferences("pref", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);
            Editor editor = pref.edit();
            editor.putString("portName", portNameField.getText().toString());
            editor.commit();
        }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener()
    {
        public void onClick(DialogInterface dialog, int button)
        {
        }
    })
    .setItems(arrayPortName.toArray(new String[0]), new DialogInterface.OnClickListener()
    {
        public void onClick(DialogInterface dialog, int select)
        {
            EditText portNameField = (EditText)findViewById(R.id.editText_PortName);
            portNameField.setText(arrayDiscovery.get(select).getPortName());

            SharedPreferences pref = getSharedPreferences("pref", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);
            Editor editor = pref.edit();
            editor.putString("portName", portNameField.getText().toString());
            editor.commit();
        }
    })
    .show();
}
4

1 回答 1

0

好的,如果您查看堆栈跟踪中的其他异常,您会发现它获得了 NetworkOnMainThreadException。这意味着您需要在开始搜索打印机的代码之前离开主 UI 线程。您可以创建线程或使用任务。

这个 SO question的答案有一个很好的例子,其中包含一个简单的任务,您可以根据自己的目的进行调整。所以为了更清楚,我认为调用 PortDiscovery() 方法的代码需要在任务中。

Android 给出此异常的原因是尝试网络操作可能需要几分钟然后失败。这会在这段时间内锁定整个 UI,因此不是一个好的做法。

根据这篇文章,这个异常是在 Android 3.0 中引入的。您提到的 Starmicronics 网站上的 Android 项目的默认构建目标为 7(即 Android 2.1)。可能是新的示例 Eclipse 项目具有更高的构建目标,或者运行配置在模拟器中运行在更高版本的 Android 上。您可以在 project.properties 和 default.properties 文件中进行检查。

于 2013-03-11T07:36:22.760 回答