diff --git a/.idea/libraries/Dart_SDK.xml b/.idea/libraries/Dart_SDK.xml
index 82934cc..12bdc22 100644
--- a/.idea/libraries/Dart_SDK.xml
+++ b/.idea/libraries/Dart_SDK.xml
@@ -1,17 +1,25 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.idea/libraries/Flutter_Plugins.xml b/.idea/libraries/Flutter_Plugins.xml
new file mode 100644
index 0000000..53449da
--- /dev/null
+++ b/.idea/libraries/Flutter_Plugins.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..42197c3
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 7ffad80..ce0f145 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -1,45 +1,107 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
-
+
+
+
+
-
+
+
+
+
+ 1636515532083
+
+
+ 1636515532083
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/.idea/.gitignore b/android/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/android/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/android/.idea/.name b/android/.idea/.name
new file mode 100644
index 0000000..66be489
--- /dev/null
+++ b/android/.idea/.name
@@ -0,0 +1 @@
+dj_printer
\ No newline at end of file
diff --git a/android/.idea/compiler.xml b/android/.idea/compiler.xml
new file mode 100644
index 0000000..fb7f4a8
--- /dev/null
+++ b/android/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/.idea/gradle.xml b/android/.idea/gradle.xml
new file mode 100644
index 0000000..b220fcc
--- /dev/null
+++ b/android/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/.idea/jarRepositories.xml b/android/.idea/jarRepositories.xml
new file mode 100644
index 0000000..d2ce72d
--- /dev/null
+++ b/android/.idea/jarRepositories.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/.idea/misc.xml b/android/.idea/misc.xml
new file mode 100644
index 0000000..6199cc2
--- /dev/null
+++ b/android/.idea/misc.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/.idea/modules.xml b/android/.idea/modules.xml
new file mode 100644
index 0000000..dc6a25e
--- /dev/null
+++ b/android/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/.idea/vcs.xml b/android/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/android/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/build.gradle b/android/build.gradle
index 0d72dd8..9c178d8 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -33,3 +33,8 @@ android {
minSdkVersion 16
}
}
+
+dependencies {
+ implementation fileTree(dir: "libs",includes: ["*.jar"])
+ implementation files('libs/Sewoo_Android_1109.jar')
+}
diff --git a/android/libs/Sewoo_Android_1109.jar b/android/libs/Sewoo_Android_1109.jar
new file mode 100644
index 0000000..78a9246
Binary files /dev/null and b/android/libs/Sewoo_Android_1109.jar differ
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml
index 20a9513..05c051d 100644
--- a/android/src/main/AndroidManifest.xml
+++ b/android/src/main/AndroidManifest.xml
@@ -1,3 +1,8 @@
+
+
+
+
+
diff --git a/android/src/main/java/com/dj/printer/dj_printer/AsPrint.java b/android/src/main/java/com/dj/printer/dj_printer/AsPrint.java
new file mode 100644
index 0000000..81c063e
--- /dev/null
+++ b/android/src/main/java/com/dj/printer/dj_printer/AsPrint.java
@@ -0,0 +1,67 @@
+package com.dj.printer.dj_printer;
+
+import android.graphics.Typeface;
+
+import com.sewoo.jpos.command.CPCLConst;
+import com.sewoo.jpos.printer.CPCLPrinter;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+public class AsPrint {
+
+ private CPCLPrinter cpclPrinter;
+
+ public AsPrint() {
+ System.out.println("cpcl初始化");
+// cpclPrinter = new CPCLPrinter(); //Default = English.
+ //cpclPrinter = new CPCLPrinter("EUC-KR"); // Korean.
+ cpclPrinter = new CPCLPrinter("GB2312"); //Chinese.
+ cpclPrinter.setMeasure(CPCLConst.LK_CPCL_MILLI);
+ }
+
+ public void printAsCode(String code, String channel, String country, String countStr, int offset, boolean hasPlan) throws IOException {
+ if (hasPlan) {
+ PrintPlan(code, channel, country, countStr, offset);
+ } else {
+ PrintNoPlan(code, countStr, offset);
+ }
+ }
+
+ private void PrintPlan(String code, String channel, String country, String countStr, int offset) throws IOException {
+ //2-inch
+ cpclPrinter.setForm(0, 203, 203, 500, 575, 0, 1);
+ cpclPrinter.setMedia(CPCLConst.LK_CPCL_LABEL);
+ cpclPrinter.setJustification(CPCLConst.LK_CPCL_CENTER);
+ cpclPrinter.setCPCLBarcode(0, 0, 0);
+ cpclPrinter.printCPCLBarcode(CPCLConst.LK_CPCL_0_ROTATION, CPCLConst.LK_CPCL_BCS_128, 1, CPCLConst.LK_CPCL_BCS_4RATIO, 130, 0, 26, code, 0);
+ cpclPrinter.printCPCLText(0, 0, 3, 0, 170, code, 0);
+ cpclPrinter.printLine(0, 220, 535, 220, 3);
+ cpclPrinter.setJustification(CPCLConst.LK_CPCL_LEFT);
+ cpclPrinter.printAndroidFont(40, 240, Typeface.DEFAULT_BOLD, true, "渠道名称:", 575, 30);
+ cpclPrinter.printAndroidFont(170, 240, Typeface.DEFAULT, channel, 575, 30);
+ cpclPrinter.printAndroidFont(40, 300, Typeface.DEFAULT, "目的地:" + country, 575, 30);
+ cpclPrinter.printAndroidFont(400 - offset, 300, Typeface.DEFAULT_BOLD, true, "件数:", 575, 30);
+ cpclPrinter.printAndroidFont(480 - offset, 300, Typeface.DEFAULT, countStr, 575, 30);
+ cpclPrinter.printForm();
+ }
+
+ private void PrintNoPlan(String code, String countStr, int offset) throws IOException {
+ //2-inch
+ cpclPrinter.setForm(0, 203, 203, 500, 575, 0, 1);
+ cpclPrinter.setMedia(CPCLConst.LK_CPCL_LABEL);
+ cpclPrinter.setJustification(CPCLConst.LK_CPCL_CENTER);
+ cpclPrinter.setCPCLBarcode(0, 0, 0);
+ cpclPrinter.printCPCLBarcode(CPCLConst.LK_CPCL_0_ROTATION, CPCLConst.LK_CPCL_BCS_128, 1, CPCLConst.LK_CPCL_BCS_4RATIO, 130, 0, 26, code, 0);
+ cpclPrinter.printCPCLText(0, 0, 3, 0, 170, code, 0);
+ cpclPrinter.printLine(0, 220, 535, 220, 3);
+ cpclPrinter.setJustification(CPCLConst.LK_CPCL_LEFT);
+ cpclPrinter.printAndroidFont(40, 240, Typeface.DEFAULT_BOLD, true, "未建计划", 575, 50);
+ cpclPrinter.printAndroidFont(400, 240, Typeface.DEFAULT_BOLD, true, "件数:", 575, 50);
+ cpclPrinter.printAndroidFont(400 - offset, 300, Typeface.DEFAULT, countStr, 575, 30);
+ cpclPrinter.printForm();
+ }
+ public int Get_Status() {
+ return cpclPrinter.status();
+ }
+}
diff --git a/android/src/main/java/com/dj/printer/dj_printer/Blutooth.java b/android/src/main/java/com/dj/printer/dj_printer/Blutooth.java
new file mode 100644
index 0000000..57f2f53
--- /dev/null
+++ b/android/src/main/java/com/dj/printer/dj_printer/Blutooth.java
@@ -0,0 +1,306 @@
+package com.dj.printer.dj_printer;
+
+import android.Manifest;
+import android.app.AlertDialog;
+import android.app.ProgressDialog;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.os.AsyncTask;
+
+import com.sewoo.port.android.BluetoothPort;
+import com.sewoo.request.android.RequestHandler;
+
+import java.io.IOException;
+
+import io.flutter.plugin.common.EventChannel;
+
+public class Blutooth {
+ private BluetoothAdapter mBluetoothAdapter;
+ private BluetoothPort bluetoothPort;
+
+ private BroadcastReceiver connectDevice;
+ private BroadcastReceiver discoveryResult;
+
+ private BroadcastReceiver searchFinish;
+ private BroadcastReceiver searchStart;
+
+ private Thread btThread;
+
+ private boolean searchflags;
+ private boolean disconnectflags;
+
+ public void init() {
+
+ bluetoothPort = BluetoothPort.getInstance();
+ bluetoothPort.SetMacFilter(false);
+ bluetoothSetup();
+ searchflags = false;
+ disconnectflags=false;
+ System.out.println("初始化完成");
+ }
+
+ //初始化连接监听
+ public void createConnectBroadcast(Context context, EventChannel.EventSink eventSink) {
+
+ connectDevice = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
+ eventSink.success("connected");
+ } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
+ try {
+ if (bluetoothPort.isConnected()) {
+ bluetoothPort.disconnect();
+ if ((btThread != null) && (btThread.isAlive())) {
+ cancelThread();
+ }
+ eventSink.success("disconnected");
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ };
+
+ context.registerReceiver(connectDevice, new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED));
+ context.registerReceiver(connectDevice, new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED));
+ System.out.println("注册连接广播");
+ }
+
+ //初始化搜索设备监听
+ public void createDiscoveryBroadcast(Context context, EventChannel.EventSink eventSink) {
+ discoveryResult = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String key = "";
+ BluetoothDevice remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+ String name = remoteDevice.getName();
+ if (remoteDevice != null && name != null) {
+ if (remoteDevice.getBondState() != BluetoothDevice.BOND_BONDED) {
+ key = "{" + "\"name\":" + "\"" + name + "\"" + ","
+ + "\"address\":" + "\"" + remoteDevice.getAddress() + "\"" + ","
+ + "\"isPaired\":" + false
+ + "}";
+
+ } else {
+
+ key = "{" + "\"name\":" + "\"" + name + "\"" + ","
+ + "\"address\":" + "\"" + remoteDevice.getAddress() + "\"" + ","
+ + "\"isPaired\":" + true
+ + "}";
+ }
+ if (bluetoothPort.isValidAddress(remoteDevice.getAddress())) {
+ eventSink.success(key);
+ System.out.println(key);
+ }
+ }
+
+ }
+ };
+ context.registerReceiver(discoveryResult, new IntentFilter(BluetoothDevice.ACTION_FOUND));
+ searchStart = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ eventSink.success("start");
+ System.out.println("start");
+ }
+ };
+ context.registerReceiver(searchStart, new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED));
+
+ searchFinish = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ eventSink.success("finish");
+ searchflags = true;
+ System.out.println("finish");
+ }
+ };
+ context.registerReceiver(searchFinish, new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED));
+ System.out.println("注册搜索广播");
+ }
+
+ //蓝牙设置
+ private void bluetoothSetup() {
+
+ mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+ if (mBluetoothAdapter == null) {
+ System.out.println("不支持蓝牙");
+ }
+ }
+
+
+ //搜索设备
+ public void SearchingBTDevice() {
+ new CheckTypesTask().execute();
+ System.out.println("开始搜索");
+
+ }
+
+
+ public void btConn(final String address) throws IOException {
+// bluetoothPort.connect(address);
+
+ new connBT().execute(address);
+ }
+
+ //断开连接
+ public void DisconnectDevice(Context context) {
+ try {
+ bluetoothPort.disconnect();
+
+ if((btThread != null) && (btThread.isAlive()))
+ btThread.interrupt();
+
+ disconnectflags = true;
+ context.unregisterReceiver(connectDevice);
+
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ //取消搜索
+ public void cancelDiscoveryResult(Context context) {
+ mBluetoothAdapter.cancelDiscovery();
+ context.unregisterReceiver(discoveryResult);
+ }
+
+
+ public void cancelThread() {
+ btThread.interrupt();
+ btThread = null;
+ }
+
+ private class CheckTypesTask extends AsyncTask {
+
+ @Override
+ protected void onPreExecute() {
+ mBluetoothAdapter.startDiscovery();
+ super.onPreExecute();
+ }
+
+ ;
+
+ @Override
+ protected Void doInBackground(Void... params) {
+ // TODO Auto-generated method stub
+ try {
+ while (true) {
+ if (searchflags)
+ break;
+
+ Thread.sleep(100);
+ }
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+
+ searchflags = false;
+ super.onPostExecute(result);
+ }
+
+ ;
+ }
+
+ class connBT extends AsyncTask {
+
+
+ @Override
+ protected Integer doInBackground(String... strings) {
+ Integer retVal = null;
+
+ try {
+ bluetoothPort.connect(strings[0]);
+ retVal = Integer.valueOf(0);
+ } catch (IOException e) {
+ e.printStackTrace();
+ retVal = Integer.valueOf(-1);
+ }
+
+ return retVal;
+ }
+
+ @Override
+ protected void onPreExecute() {
+
+ super.onPreExecute();
+ }
+
+ @Override
+ protected void onPostExecute(Integer result) {
+ if (result.intValue() == 0) // Connection success.
+ {
+ RequestHandler rh = new RequestHandler();
+ btThread = new Thread(rh);
+ btThread.start();
+ } else // Connection failed.
+ {
+
+ }
+ super.onPostExecute(result);
+ }
+ }
+
+ public void ExcuteDisconnect(Context context)
+ {
+ new ExcuteDisconnectBT().execute(context);
+ }
+
+ private class ExcuteDisconnectBT extends AsyncTask{
+
+
+ @Override
+ protected Void doInBackground(Context... contexts) {
+ try {
+ DisconnectDevice(contexts[0]);
+
+ while(true)
+ {
+ if(disconnectflags)
+ break;
+
+ Thread.sleep(100);
+ }
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPreExecute(){
+ super.onPreExecute();
+ };
+
+
+ @Override
+ protected void onPostExecute(Void result){
+ disconnectflags = false;
+ super.onPostExecute(result);
+ };
+ }
+
+}
diff --git a/android/src/main/java/com/dj/printer/dj_printer/DjPrinterPlugin.java b/android/src/main/java/com/dj/printer/dj_printer/DjPrinterPlugin.java
index 43f7a46..97a5dcf 100644
--- a/android/src/main/java/com/dj/printer/dj_printer/DjPrinterPlugin.java
+++ b/android/src/main/java/com/dj/printer/dj_printer/DjPrinterPlugin.java
@@ -1,38 +1,112 @@
package com.dj.printer.dj_printer;
+import android.content.Context;
+
import androidx.annotation.NonNull;
+
+import com.sewoo.jpos.command.CPCLConst;
+import com.sewoo.jpos.printer.CPCLPrinter;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
import io.flutter.embedding.engine.plugins.FlutterPlugin;
+import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
-/** DjPrinterPlugin */
+/**
+ * DjPrinterPlugin
+ */
public class DjPrinterPlugin implements FlutterPlugin, MethodCallHandler {
- /// The MethodChannel that will the communication between Flutter and native Android
- ///
- /// This local reference serves to register the plugin with the Flutter Engine and unregister it
- /// when the Flutter Engine is detached from the Activity
- private MethodChannel channel;
-
- @Override
- public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
- channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "dj_printer");
- channel.setMethodCallHandler(this);
- }
-
- @Override
- public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
- if (call.method.equals("getPlatformVersion")) {
- result.success("Android " + android.os.Build.VERSION.RELEASE);
- } else {
- result.notImplemented();
+ private MethodChannel channel;
+ private EventChannel discoveryChannel;
+ private EventChannel connectChannel;
+ private Context context;
+ AsPrint asPrint;
+ private static final String DISCOVERYDEVICE = "com.discovery.devices";
+ private static final String CONNECT = "com.connect";
+
+ Blutooth blutooth = new Blutooth();
+
+ @Override
+ public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
+ channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "dj_printer");
+ channel.setMethodCallHandler(this);
+ context = flutterPluginBinding.getApplicationContext();
+ discoveryChannel = new EventChannel(flutterPluginBinding.getBinaryMessenger(), DISCOVERYDEVICE);
+
+ connectChannel = new EventChannel(flutterPluginBinding.getBinaryMessenger(), CONNECT);
+ discoveryChannel.setStreamHandler(new EventChannel.StreamHandler() {
+ @Override
+ public void onListen(Object arguments, EventChannel.EventSink events) {
+ blutooth.createDiscoveryBroadcast(context, events);
+ }
+
+ @Override
+ public void onCancel(Object arguments) {
+ blutooth.cancelDiscoveryResult(context);
+ }
+ });
+ connectChannel.setStreamHandler(new EventChannel.StreamHandler() {
+ @Override
+ public void onListen(Object arguments, EventChannel.EventSink events) {
+ blutooth.createConnectBroadcast(context, events);
+ }
+
+ @Override
+ public void onCancel(Object arguments) {
+ blutooth.ExcuteDisconnect(context);
+ }
+ });
+ }
+
+ @Override
+ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
+ if (call.method.equals("startSearch")) {
+ blutooth.SearchingBTDevice();
+ } else if (call.method.equals("connect")) {
+ String arg = call.argument("address");
+ try {
+ blutooth.btConn(arg);
+ result.success(true);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } else if (call.method.equals("init")) {
+ blutooth.init();
+ asPrint = new AsPrint();
+
+ result.success(true);
+ } else if (call.method.equals("print")) {
+ try {
+ String code = call.argument("code");
+ String channel = call.argument("channel");
+ String country = call.argument("country");
+ String countStr = call.argument("countStr");
+ int offset = call.argument("offset");
+ boolean hasPlan = call.argument("hasPlan");
+ asPrint.printAsCode(code, channel, country, countStr, offset, hasPlan);
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ result.success(true);
+ } else if (call.method.equals("getStatus")) {
+ int sta = asPrint.Get_Status();
+ result.success(sta);
+ } else {
+ result.notImplemented();
+ }
+ }
+
+ @Override
+ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
+ channel.setMethodCallHandler(null);
}
- }
- @Override
- public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
- channel.setMethodCallHandler(null);
- }
}
diff --git a/dj_printer.iml b/dj_printer.iml
index 429df7d..778b2e2 100644
--- a/dj_printer.iml
+++ b/dj_printer.iml
@@ -8,11 +8,11 @@
-
+
+
-
diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle
index b38641c..658febf 100644
--- a/example/android/app/build.gradle
+++ b/example/android/app/build.gradle
@@ -25,7 +25,7 @@ apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
- compileSdkVersion 30
+ compileSdkVersion 31
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
@@ -48,6 +48,11 @@ android {
signingConfig signingConfigs.debug
}
}
+ packagingOptions {
+
+ exclude "META-INF/DEPENDENCIES"
+ }
+
}
flutter {
diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml
index 3a38187..33dbb7d 100644
--- a/example/android/app/src/main/AndroidManifest.xml
+++ b/example/android/app/src/main/AndroidManifest.xml
@@ -38,4 +38,8 @@
android:name="flutterEmbedding"
android:value="2" />
+
+
+
+
diff --git a/example/lib/main.dart b/example/lib/main.dart
index 484a4cc..2ad7592 100644
--- a/example/lib/main.dart
+++ b/example/lib/main.dart
@@ -1,8 +1,10 @@
-import 'package:flutter/material.dart';
import 'dart:async';
+import 'dart:convert';
-import 'package:flutter/services.dart';
import 'package:dj_printer/dj_printer.dart';
+import 'package:dj_printer/src/device_model.dart';
+import 'package:flutter/material.dart';
+import 'package:permission_handler/permission_handler.dart';
void main() {
runApp(const MyApp());
@@ -16,7 +18,7 @@ class MyApp extends StatefulWidget {
}
class _MyAppState extends State {
- String _platformVersion = 'Unknown';
+ List devices = [];
@override
void initState() {
@@ -26,23 +28,30 @@ class _MyAppState extends State {
// Platform messages are asynchronous, so we initialize in an async method.
Future initPlatformState() async {
- String platformVersion;
- // Platform messages may fail, so we use a try/catch PlatformException.
- // We also handle the message potentially returning null.
- try {
- platformVersion =
- await DjPrinter.platformVersion ?? 'Unknown platform version';
- } on PlatformException {
- platformVersion = 'Failed to get platform version.';
+ var per = await Permission.bluetooth.isGranted;
+ if (!per) {
+ Permission.bluetooth.request();
}
-
- // If the widget was removed from the tree while the asynchronous platform
- // message was in flight, we want to discard the reply rather than calling
- // setState to update our non-existent appearance.
- if (!mounted) return;
-
- setState(() {
- _platformVersion = platformVersion;
+ var pers = await Permission.locationWhenInUse.isGranted;
+ if (!pers) {
+ Permission.locationWhenInUse.request();
+ }
+ DjPrinter.init();
+ DjPrinter.addDiscoveryListen(onReceive: (data) {
+ var js = json.decode(data.toString());
+ devices.add(Device(
+ name: js['name'], address: js['address'], isPaired: js['isPaired']));
+ setState(() {});
+ }, onStart: () {
+ print("————————————————————————");
+ }, onFinish: () {
+ print('——————————————————————————————');
+ DjPrinter.cancelDiscovery();
+ });
+ DjPrinter.addConnectListen(onConnect: () {
+ print("connected");
+ }, onDisconnect: () {
+ print('disconnected');
});
}
@@ -54,7 +63,41 @@ class _MyAppState extends State {
title: const Text('Plugin example app'),
),
body: Center(
- child: Text('Running on: $_platformVersion\n'),
+ child: Column(
+ children: [
+ TextButton(
+ onPressed: () {
+ devices.clear();
+ DjPrinter.startSearch;
+ },
+ child: const Text('扫描设备')),
+ // TextButton(onPressed: () {}, child: const Text('打印')),
+ const SizedBox(
+ height: 20,
+ ),
+ ...devices
+ .map((e) => TextButton(
+ onPressed: () {
+ DjPrinter.connect(e.address);
+ },
+ child: Text(e.name)))
+ .toList(),
+ const SizedBox(
+ height: 20,
+ ),
+ TextButton(
+ onPressed: () {
+ DjPrinter.print(
+ code: 'ASSZ2022012500010002',
+ channel: 'cosco定提-月达-卡派',
+ country: '美国',
+ countStr: '10/20',
+ offset: 0,
+ hasPlan: false);
+ },
+ child: const Text('打印'))
+ ],
+ ),
),
),
);
diff --git a/example/pubspec.lock b/example/pubspec.lock
index 477e17a..e52ea86 100644
--- a/example/pubspec.lock
+++ b/example/pubspec.lock
@@ -7,7 +7,7 @@ packages:
name: async
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.7.0"
+ version: "2.8.2"
boolean_selector:
dependency: transitive
description:
@@ -15,13 +15,20 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
+ bot_toast:
+ dependency: "direct main"
+ description:
+ name: bot_toast
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "4.0.1"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.1.0"
+ version: "1.2.0"
charcode:
dependency: transitive
description:
@@ -94,14 +101,14 @@ packages:
name: matcher
url: "https://pub.flutter-io.cn"
source: hosted
- version: "0.12.10"
+ version: "0.12.11"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.4.0"
+ version: "1.7.0"
path:
dependency: transitive
description:
@@ -109,6 +116,48 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.8.0"
+ permission_handler:
+ dependency: "direct main"
+ description:
+ name: permission_handler
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "9.2.0"
+ permission_handler_android:
+ dependency: transitive
+ description:
+ name: permission_handler_android
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "9.0.2"
+ permission_handler_apple:
+ dependency: transitive
+ description:
+ name: permission_handler_apple
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "9.0.2"
+ permission_handler_platform_interface:
+ dependency: transitive
+ description:
+ name: permission_handler_platform_interface
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "3.7.0"
+ permission_handler_windows:
+ dependency: transitive
+ description:
+ name: permission_handler_windows
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "0.1.0"
+ plugin_platform_interface:
+ dependency: transitive
+ description:
+ name: plugin_platform_interface
+ url: "https://pub.flutter-io.cn"
+ source: hosted
+ version: "2.1.2"
sky_engine:
dependency: transitive
description: flutter
@@ -155,7 +204,7 @@ packages:
name: test_api
url: "https://pub.flutter-io.cn"
source: hosted
- version: "0.4.1"
+ version: "0.4.3"
typed_data:
dependency: transitive
description:
@@ -169,7 +218,7 @@ packages:
name: vector_math
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.1.0"
+ version: "2.1.1"
sdks:
- dart: ">=2.12.0 <3.0.0"
- flutter: ">=1.20.0"
+ dart: ">=2.15.0 <3.0.0"
+ flutter: ">=2.8.0"
diff --git a/example/pubspec.yaml b/example/pubspec.yaml
index 5dc35f5..21ec4ed 100644
--- a/example/pubspec.yaml
+++ b/example/pubspec.yaml
@@ -17,7 +17,6 @@ environment:
dependencies:
flutter:
sdk: flutter
-
dj_printer:
# When depending on this package from a real application you should use:
# dj_printer: ^x.y.z
@@ -29,6 +28,8 @@ dependencies:
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.2
+ permission_handler: ^9.2.0
+ bot_toast: ^4.0.1
dev_dependencies:
flutter_test:
diff --git a/lib/dj_printer.dart b/lib/dj_printer.dart
index ae887d2..7860c68 100644
--- a/lib/dj_printer.dart
+++ b/lib/dj_printer.dart
@@ -1,13 +1,119 @@
-
import 'dart:async';
+import 'package:dj_printer/src/status_enum.dart';
import 'package:flutter/services.dart';
class DjPrinter {
static const MethodChannel _channel = MethodChannel('dj_printer');
+ static const EventChannel _deviceChannel =
+ EventChannel("com.discovery.devices");
+ static StreamSubscription? _discoveryStream;
+
+ static Future addDiscoveryListen(
+ {required void Function(dynamic data) onReceive,
+ void Function()? onStart,
+ void Function()? onFinish}) async {
+ if (_discoveryStream == null) {
+ return _deviceChannel.receiveBroadcastStream().listen((data) {
+ if (data == "start" && onStart != null) {
+ onStart();
+ } else if (data == "finish" && onFinish != null) {
+ onFinish();
+ } else {
+ onReceive(data);
+ }
+ });
+ } else {
+ return _discoveryStream!;
+ }
+ }
+
+ static void cancelDiscovery() {
+ if (_discoveryStream != null) {
+ _discoveryStream!.cancel();
+ _discoveryStream = null;
+ }
+ }
+
+ static const EventChannel _connectChannel = EventChannel("com.connect");
+ static StreamSubscription? _connectStream;
+
+ static Future addConnectListen(
+ {required void Function() onConnect,
+ required void Function() onDisconnect}) async {
+ if (_connectStream == null) {
+ return _connectChannel.receiveBroadcastStream().listen((data) {
+ if (data == 'connected') {
+ onConnect();
+ } else if (data == 'disconnected') {
+ onDisconnect();
+ }
+ });
+ } else {
+ return _connectStream!;
+ }
+ }
+
+ static void cancelConnect() {
+ if (_connectStream != null) {
+ _connectStream!.cancel();
+ _connectStream = null;
+ }
+ }
+
+ static Future get startSearch async {
+ final res = await _channel.invokeMethod('startSearch');
+ return res;
+ }
+
+ static Future connect(String address) async {
+ final res = await _channel.invokeMethod('connect', {'address': address});
+ return res;
+ }
+
+ static Future init() async {
+ final res = await _channel.invokeMethod('init');
+ return res;
+ }
+
+ //0 normal
+ //1 busy
+ //2 paper empty
+ //4 cover open
+ //8 battery low
+ static Future getStatus() async {
+ final res = await _channel.invokeMethod('getStatus');
+ switch (res) {
+ case 0:
+ return PRINT_STATUS.normal;
+ case 1:
+ return PRINT_STATUS.busy;
+ case 2:
+ return PRINT_STATUS.paperEmpty;
+ case 4:
+ return PRINT_STATUS.coverOpen;
+ case 8:
+ return PRINT_STATUS.batteryLow;
+ default:
+ return null;
+ }
+ }
- static Future get platformVersion async {
- final String? version = await _channel.invokeMethod('getPlatformVersion');
- return version;
+ static Future print(
+ {required String code,
+ required String channel,
+ required String country,
+ required String countStr,
+ required int offset,
+ required bool hasPlan}) async {
+ final res = await _channel.invokeMethod('print', {
+ 'code': code,
+ 'channel': channel,
+ 'country': country,
+ 'countStr': countStr,
+ 'offset': offset,
+ 'hasPlan': hasPlan,
+ });
+ return res;
}
}
diff --git a/lib/src/device_model.dart b/lib/src/device_model.dart
new file mode 100644
index 0000000..545e705
--- /dev/null
+++ b/lib/src/device_model.dart
@@ -0,0 +1,11 @@
+class Device {
+ String name;
+ String address;
+ bool isPaired;
+
+ Device({
+ required this.name,
+ required this.address,
+ required this.isPaired,
+ });
+}
diff --git a/lib/src/status_enum.dart b/lib/src/status_enum.dart
new file mode 100644
index 0000000..87b8e6f
--- /dev/null
+++ b/lib/src/status_enum.dart
@@ -0,0 +1,7 @@
+enum PRINT_STATUS {
+ normal,
+ busy,
+ paperEmpty,
+ coverOpen,
+ batteryLow,
+}
diff --git a/pubspec.lock b/pubspec.lock
index 442efbc..aa6a371 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -7,7 +7,7 @@ packages:
name: async
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.7.0"
+ version: "2.8.2"
boolean_selector:
dependency: transitive
description:
@@ -21,7 +21,7 @@ packages:
name: characters
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.1.0"
+ version: "1.2.0"
charcode:
dependency: transitive
description:
@@ -80,14 +80,14 @@ packages:
name: matcher
url: "https://pub.flutter-io.cn"
source: hosted
- version: "0.12.10"
+ version: "0.12.11"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.flutter-io.cn"
source: hosted
- version: "1.4.0"
+ version: "1.7.0"
path:
dependency: transitive
description:
@@ -141,7 +141,7 @@ packages:
name: test_api
url: "https://pub.flutter-io.cn"
source: hosted
- version: "0.4.1"
+ version: "0.4.3"
typed_data:
dependency: transitive
description:
@@ -155,7 +155,7 @@ packages:
name: vector_math
url: "https://pub.flutter-io.cn"
source: hosted
- version: "2.1.0"
+ version: "2.1.1"
sdks:
- dart: ">=2.12.0 <3.0.0"
+ dart: ">=2.14.0 <3.0.0"
flutter: ">=1.20.0"
diff --git a/test/dj_printer_test.dart b/test/dj_printer_test.dart
index 53f8bf3..36c8bcd 100644
--- a/test/dj_printer_test.dart
+++ b/test/dj_printer_test.dart
@@ -1,6 +1,5 @@
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
-import 'package:dj_printer/dj_printer.dart';
void main() {
const MethodChannel channel = MethodChannel('dj_printer');
@@ -17,7 +16,5 @@ void main() {
channel.setMockMethodCallHandler(null);
});
- test('getPlatformVersion', () async {
- expect(await DjPrinter.platformVersion, '42');
- });
+ test('getPlatformVersion', () async {});
}