我创建了一个使用Zebra打印API的Mono for Android应用程序。我已设法获取Java Bindings Library和Android应用程序标准Mono中引用的ZSDK_API.jar文件,如定义HERE
DiscoveryHandler
public class DiscoveryHandler : IDiscoveryHandler
{
private Discovery _reference;
public DiscoveryHandler(Discovery reference)
{
_reference = reference;
}
public void DiscoveryError(string message)
{
new UIHelper(_reference).showErrorDialogOnGuiThread(message);
}
public void DiscoveryFinished()
{
_reference.RunOnUiThread(() =>
{
Toast.MakeText(_reference, " Discovered " + _reference.discoveredPrinters.Count + " devices", ToastLength.Short).Show();
_reference.SetProgressBarIndeterminateVisibility(false);
});
}
public void FoundPrinter(DiscoveredPrinter printer)
{
_reference.RunOnUiThread(() =>
{
DiscoveredPrinterBluetooth p = (DiscoveredPrinterBluetooth)printer;
_reference.discoveredPrinters.Add(p.Address + " (" + p.FriendlyName + ")");
_reference.mArrayAdapter.NotifyDataSetChanged();
});
}
public void Dispose()
{
}
public IntPtr Handle
{
get { return _reference.Handle; }
}
}
Discovery.cs
public class Discovery : ListActivity
{
public List<string> discoveredPrinters = null;
public ArrayAdapter<string> mArrayAdapter;
private static IDiscoveryHandler btDiscoveryHandler = null;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
RequestWindowFeature(WindowFeatures.IndeterminateProgress);
SetContentView(Resource.Layout.discovery_results);
SetProgressBarIndeterminateVisibility(true);
discoveredPrinters = new List<string>();
SetupListAdapter();
btDiscoveryHandler = new DiscoveryHandler(this);
try
{
new Thread(new ThreadStart(() =>
{
Looper.Prepare();
try
{
RunOnUiThread(() => Toast.MakeText(this, "Trying", ToastLength.Short).Show());
BluetoothDiscoverer.FindPrinters(this, btDiscoveryHandler);
RunOnUiThread(() => Toast.MakeText(this, "And...", ToastLength.Short).Show());
}
catch (ZebraPrinterConnectionException zex)
{
new UIHelper(this).showErrorDialogOnGuiThread(zex.Message);
}
catch (ThreadInterruptedException iex)
{
new UIHelper(this).showErrorDialogOnGuiThread(iex.Message);
}
catch (Exception ex)
{
new UIHelper(this).showErrorDialogOnGuiThread(ex.Message);
}
finally
{
RunOnUiThread(() => Toast.MakeText(this, "Quitting looper", ToastLength.Short).Show());
Looper.MyLooper().Quit();
RunOnUiThread(() => Toast.MakeText(this, "Finished", ToastLength.Short).Show());
}
})).Start();
}
catch (Exception ex)
{
new UIHelper(this).showErrorDialogOnGuiThread(ex.Message);
}
}
private void SetupListAdapter()
{
mArrayAdapter = new ArrayAdapter<string>(this, global::Android.Resource.Layout.SimpleListItem1, discoveredPrinters);
ListAdapter = mArrayAdapter;
}
}
我确保清单正在请求蓝牙和Bluetooth_Admin以及互联网。
应用程序构建,但运行时只是崩溃,没有例外,只是说“应用程序已意外停止”
正在检测和编译所有类,但我不知道为什么它会像这样轰炸。有没有人成功使用Mono for Android - Zebra集成?
答案 0 :(得分:1)
该死 - 我是一个印章!就像我发布它一样,我开始思考 - 它可能与我实施IntPtr Handle作为父母的句柄这一事实有关 - 我是对的。这是工作代码的第一步(第一步 - 如果我必须回答我自己的问题!):
public class Discovery : ListActivity, IDiscoveryHandler
{
public List<string> discoveredPrinters = null;
public ArrayAdapter<string> mArrayAdapter;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
RequestWindowFeature(WindowFeatures.IndeterminateProgress);
SetContentView(Resource.Layout.discovery_results);
SetProgressBarIndeterminateVisibility(true);
discoveredPrinters = new List<string>();
SetupListAdapter();
try
{
new Thread(new ThreadStart(() =>
{
Looper.Prepare();
try
{
BluetoothDiscoverer.FindPrinters(this, this);
}
catch (ZebraPrinterConnectionException zex)
{
new UIHelper(this).showErrorDialogOnGuiThread(zex.Message);
}
catch (ThreadInterruptedException iex)
{
new UIHelper(this).showErrorDialogOnGuiThread(iex.Message);
}
catch (Exception ex)
{
new UIHelper(this).showErrorDialogOnGuiThread(ex.Message);
}
finally
{
RunOnUiThread(() => Toast.MakeText(this, "Quitting looper", ToastLength.Short).Show());
Looper.MyLooper().Quit();
RunOnUiThread(() => Toast.MakeText(this, "Finished", ToastLength.Short).Show());
}
})).Start();
}
catch (Exception ex)
{
new UIHelper(this).showErrorDialogOnGuiThread(ex.Message);
}
}
private void SetupListAdapter()
{
mArrayAdapter = new ArrayAdapter<string>(this, global::Android.Resource.Layout.SimpleListItem1, discoveredPrinters);
ListAdapter = mArrayAdapter;
}
public void DiscoveryError(string message)
{
new UIHelper(this).showErrorDialogOnGuiThread(message);
}
public void DiscoveryFinished()
{
RunOnUiThread(() =>
{
Toast.MakeText(this, " Discovered " + discoveredPrinters.Count + " devices", ToastLength.Short).Show();
SetProgressBarIndeterminateVisibility(false);
});
}
public void FoundPrinter(DiscoveredPrinter printer)
{
RunOnUiThread(() =>
{
DiscoveredPrinterBluetooth p = printer.JavaCast<DiscoveredPrinterBluetooth>();
discoveredPrinters.Add(p.Address + " (" + p.FriendlyName + ")");
mArrayAdapter.NotifyDataSetChanged();
});
}
}
}