Java 在Cordova Android上扫描网络打印机
我正在尝试在cordova上构建一个插件,可以找到蓝牙、USB和网络打印机,并打印文本、图像、二维码、条形码。。。我有一个问题,在网络打印机扫描,需要一些帮助。我有下面的代码,可以搜索连接到wifi的网络打印机。它在安卓7和6上运行良好,但在安卓5上,它无法返回回调。这可能是安卓5上的线程限制或其他原因造成的Java 在Cordova Android上扫描网络打印机,java,android,cordova-plugins,Java,Android,Cordova Plugins,我正在尝试在cordova上构建一个插件,可以找到蓝牙、USB和网络打印机,并打印文本、图像、二维码、条形码。。。我有一个问题,在网络打印机扫描,需要一些帮助。我有下面的代码,可以搜索连接到wifi的网络打印机。它在安卓7和6上运行良好,但在安卓5上,它无法返回回调。这可能是安卓5上的线程限制或其他原因造成的 scanWifi(ips, new OnIPScanningCallback() { @Override public void onSc
scanWifi(ips, new OnIPScanningCallback() {
@Override
public void onScanningComplete(List<String> results) {
Log.d("TAG", "onScanningComplete: " + results.size()+" : "+results.toString());
Printers printerList =null;
for(String printerIps:results) {
String mac = getHardwareAddress(printerIps);
printerList = new Printers(printerIps, mac);
printers.put(printerIps);
list.add(printerList);
}
Log.d(TAGS,"The List of all wifi Printers : "+list);
}
});
isStart = false;
}
private static void scanWifi(final List<String> ips, final
OnIPScanningCallback callback) {
final Vector<String> results = new Vector<String>();
final int totalSize = ips.size();
final int splitSize = 10;
final int[] index = {0};
final long start = System.currentTimeMillis();
for (int i = 0; i < totalSize; i += splitSize) {
final List<String> child = new ArrayList<String>(ips.subList(i, Math.min(totalSize, i + splitSize)));
new Thread() {
@Override
public void run() {
for (String ip : child) {
Log.d("TAG", " scanning : " + index[0] + ", ip: " + ip);
boolean isPrinter = connect(ip);
if (isPrinter) {
results.add(ip);
}
if (index[0] == ips.size() - 1) {
long end = System.currentTimeMillis();
Log.d("TAG", "scanning time: " + (end - start) / 1000);
callback.onScanningComplete(results);
} else {
index[0]++;
}
}
}
}.start();
}
}
public interface OnIPScanningCallback {
void onScanningComplete(List<String> results);
}
我们将非常感谢您以任何方式帮助我们实现这一目标(android 5上的第一个代码或第二个更快、更高效的代码)。我已经研究了与此相关的问题,但我不想使用打印服务 由于索引值是未发送回调的原因,因此要解决这个问题,只要在发现网络打印机后立即发送回调并将其存储在var(在我的例子中是JSONArray)中,就可以得到打印机列表及其有效值
scanWifi(ips, new PrintingPlugin.OnIPScanningCallback() {
@Override
public void onScanningComplete(List<String> results) {
Log.d(TAGS, "onScanningComplete: " + results.size() + " : " + results.toString());
Printers printerList;
for (String printerIps : results) {
String mac = getHardwareAddress(printerIps);
printerList = new Printers(printerIps, mac);
printers.put(printerIps);
list.add(printerList);
}
Log.d(TAGS, "The List of all wifi Printers : " + list);
}
});
isStart = false;
} catch (Exception e) {
Log.e(TAGS, "Error while scanning for wifi"+e.getMessage());
}
return printers;
}
private Integer index = 0;
void resetIndex() {
index = 0;
}
private void scanWifi(final List<String> ips, final PrintingPlugin.OnIPScanningCallback callback) {
Log.d(TAGS, " scanWifi" );
final Vector<String> results = new Vector<String>();
final int totalSize = ips.size();
final int splitSize = 10;
resetIndex();
final long start = System.currentTimeMillis();
for (int i = 0; i < totalSize; i += splitSize) {
final List<String> child = new ArrayList<String>(ips.subList(i, Math.min(totalSize, i + splitSize)));
executeTask(new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
synchronized (index) {
for (String ip : child) {
Log.d(TAGS, " scanning : " + index + ", ip: " + ip);
boolean isPrinter = connect(ip);
if (isPrinter) {
results.add(ip);
}
if (index == ips.size() - 1) {
long end = System.currentTimeMillis();
Log.d(TAGS, "scanning time: " + (end - start) / 1000);
callback.onScanningComplete(results);
} else {
index++;
}
}
}
return null;
}
});
}
public void executeTask(AsyncTask asyncTask) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
asyncTask.execute();
}
}
D/ConnectivityManager.CallbackHandler: CM callback handler got msg 524290