parent
bc490ff3f8
commit
ddd41aaafb
@ -0,0 +1,9 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Flutter Plugins" type="FlutterPluginsLibraryType">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="file://$PROJECT_DIR$" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES />
|
||||||
|
</library>
|
||||||
|
</component>
|
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Android API 28 Platform" project-jdk-type="Android SDK" />
|
||||||
|
</project>
|
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -1,45 +1,107 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="FileEditorManager">
|
<component name="ChangeListManager">
|
||||||
<leaf>
|
<list default="true" id="2f8e3712-04e2-429a-bcea-c8db1a54008e" name="默认变更列表" comment="">
|
||||||
<file leaf-file-name="dj_printer.dart" pinned="false" current-in-tab="true">
|
<change afterPath="$PROJECT_DIR$/android/libs/Sewoo_Android_1109.jar" afterDir="false" />
|
||||||
<entry file="file://$PROJECT_DIR$/lib/dj_printer.dart">
|
<change afterPath="$PROJECT_DIR$/android/src/main/java/com/dj/printer/dj_printer/AsPrint.java" afterDir="false" />
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<change afterPath="$PROJECT_DIR$/android/src/main/java/com/dj/printer/dj_printer/Blutooth.java" afterDir="false" />
|
||||||
<state relative-caret-position="0">
|
<change afterPath="$PROJECT_DIR$/lib/src/device_model.dart" afterDir="false" />
|
||||||
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
<change afterPath="$PROJECT_DIR$/lib/src/status_enum.dart" afterDir="false" />
|
||||||
</state>
|
<change beforePath="$PROJECT_DIR$/.idea/libraries/Dart_SDK.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/libraries/Dart_SDK.xml" afterDir="false" />
|
||||||
</provider>
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
</entry>
|
<change beforePath="$PROJECT_DIR$/android/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/android/build.gradle" afterDir="false" />
|
||||||
</file>
|
<change beforePath="$PROJECT_DIR$/android/src/main/AndroidManifest.xml" beforeDir="false" afterPath="$PROJECT_DIR$/android/src/main/AndroidManifest.xml" afterDir="false" />
|
||||||
<file leaf-file-name="main.dart" pinned="false" current-in-tab="false">
|
<change beforePath="$PROJECT_DIR$/android/src/main/java/com/dj/printer/dj_printer/DjPrinterPlugin.java" beforeDir="false" afterPath="$PROJECT_DIR$/android/src/main/java/com/dj/printer/dj_printer/DjPrinterPlugin.java" afterDir="false" />
|
||||||
<entry file="file://$PROJECT_DIR$/example/lib/main.dart">
|
<change beforePath="$PROJECT_DIR$/dj_printer.iml" beforeDir="false" afterPath="$PROJECT_DIR$/dj_printer.iml" afterDir="false" />
|
||||||
<provider selected="true" editor-type-id="text-editor">
|
<change beforePath="$PROJECT_DIR$/example/android/app/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/example/android/app/build.gradle" afterDir="false" />
|
||||||
<state relative-caret-position="0">
|
<change beforePath="$PROJECT_DIR$/example/android/app/src/main/AndroidManifest.xml" beforeDir="false" afterPath="$PROJECT_DIR$/example/android/app/src/main/AndroidManifest.xml" afterDir="false" />
|
||||||
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
<change beforePath="$PROJECT_DIR$/example/lib/main.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/lib/main.dart" afterDir="false" />
|
||||||
</state>
|
<change beforePath="$PROJECT_DIR$/example/pubspec.lock" beforeDir="false" afterPath="$PROJECT_DIR$/example/pubspec.lock" afterDir="false" />
|
||||||
</provider>
|
<change beforePath="$PROJECT_DIR$/example/pubspec.yaml" beforeDir="false" afterPath="$PROJECT_DIR$/example/pubspec.yaml" afterDir="false" />
|
||||||
</entry>
|
<change beforePath="$PROJECT_DIR$/lib/dj_printer.dart" beforeDir="false" afterPath="$PROJECT_DIR$/lib/dj_printer.dart" afterDir="false" />
|
||||||
</file>
|
<change beforePath="$PROJECT_DIR$/pubspec.lock" beforeDir="false" afterPath="$PROJECT_DIR$/pubspec.lock" afterDir="false" />
|
||||||
</leaf>
|
<change beforePath="$PROJECT_DIR$/test/dj_printer_test.dart" beforeDir="false" afterPath="$PROJECT_DIR$/test/dj_printer_test.dart" afterDir="false" />
|
||||||
|
</list>
|
||||||
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||||
|
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ToolWindowManager">
|
<component name="FileTemplateManagerImpl">
|
||||||
<editor active="true" />
|
<option name="RECENT_TEMPLATES">
|
||||||
<layout>
|
<list>
|
||||||
<window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
|
<option value="Dart File" />
|
||||||
</layout>
|
</list>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="Git.Settings">
|
||||||
|
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||||
|
</component>
|
||||||
|
<component name="GitSEFilterConfiguration">
|
||||||
|
<file-type-list>
|
||||||
|
<filtered-out-file-type name="LOCAL_BRANCH" />
|
||||||
|
<filtered-out-file-type name="REMOTE_BRANCH" />
|
||||||
|
<filtered-out-file-type name="TAG" />
|
||||||
|
<filtered-out-file-type name="COMMIT_BY_MESSAGE" />
|
||||||
|
</file-type-list>
|
||||||
</component>
|
</component>
|
||||||
|
<component name="HighlightingSettingsPerFile">
|
||||||
|
<setting file="file://$PROJECT_DIR$/example/pubspec.yaml" root0="SKIP_INSPECTION" />
|
||||||
|
<setting file="file://$PROJECT_DIR$/lib/dj_printer.dart" root0="SKIP_INSPECTION" />
|
||||||
|
<setting file="file://$PROJECT_DIR$/example/lib/main.dart" root0="SKIP_INSPECTION" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectId" id="20i7PcthqmcXBmYTwGkZSh1utIA" />
|
||||||
<component name="ProjectView">
|
<component name="ProjectView">
|
||||||
<navigator currentView="ProjectPane" proportions="" version="1">
|
<navigator currentView="ProjectPane" proportions="" version="1" />
|
||||||
</navigator>
|
|
||||||
<panes>
|
<panes>
|
||||||
<pane id="ProjectPane">
|
<pane id="ProjectPane">
|
||||||
<option name="show-excluded-files" value="false" />
|
<option name="show-excluded-files" value="false" />
|
||||||
</pane>
|
</pane>
|
||||||
</panes>
|
</panes>
|
||||||
</component>
|
</component>
|
||||||
|
<component name="ProjectViewState">
|
||||||
|
<option name="hideEmptyMiddlePackages" value="true" />
|
||||||
|
<option name="showLibraryContents" value="true" />
|
||||||
|
</component>
|
||||||
<component name="PropertiesComponent">
|
<component name="PropertiesComponent">
|
||||||
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
|
|
||||||
<property name="dart.analysis.tool.window.force.activate" value="true" />
|
<property name="dart.analysis.tool.window.force.activate" value="true" />
|
||||||
|
<property name="dart.analysis.tool.window.visible" value="false" />
|
||||||
|
<property name="io.flutter.reload.alreadyRun" value="true" />
|
||||||
|
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
|
||||||
|
<property name="settings.editor.selected.configurable" value="flutter.settings" />
|
||||||
<property name="show.migrate.to.gradle.popup" value="false" />
|
<property name="show.migrate.to.gradle.popup" value="false" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
|
||||||
|
<component name="TaskManager">
|
||||||
|
<task active="true" id="Default" summary="默认任务">
|
||||||
|
<changelist id="2f8e3712-04e2-429a-bcea-c8db1a54008e" name="默认变更列表" comment="" />
|
||||||
|
<created>1636515532083</created>
|
||||||
|
<option name="number" value="Default" />
|
||||||
|
<option name="presentableId" value="Default" />
|
||||||
|
<updated>1636515532083</updated>
|
||||||
|
</task>
|
||||||
|
<servers />
|
||||||
|
</component>
|
||||||
|
<component name="ToolWindowManager">
|
||||||
|
<editor active="true" />
|
||||||
|
<layout>
|
||||||
|
<window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
|
||||||
|
</layout>
|
||||||
|
</component>
|
||||||
|
<component name="Vcs.Log.Tabs.Properties">
|
||||||
|
<option name="TAB_STATES">
|
||||||
|
<map>
|
||||||
|
<entry key="MAIN">
|
||||||
|
<value>
|
||||||
|
<State />
|
||||||
|
</value>
|
||||||
|
</entry>
|
||||||
|
</map>
|
||||||
|
</option>
|
||||||
|
<option name="oldMeFiltersMigrated" value="true" />
|
||||||
|
</component>
|
||||||
|
<component name="XSLT-Support.FileAssociations.UIState">
|
||||||
|
<expand />
|
||||||
|
<select />
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,3 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
@ -0,0 +1 @@
|
|||||||
|
dj_printer
|
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="CompilerConfiguration">
|
||||||
|
<bytecodeTargetLevel target="11" />
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="GradleMigrationSettings" migrationVersion="1" />
|
||||||
|
<component name="GradleSettings">
|
||||||
|
<option name="linkedExternalProjectsSettings">
|
||||||
|
<GradleProjectSettings>
|
||||||
|
<option name="testRunner" value="GRADLE" />
|
||||||
|
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||||
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="modules">
|
||||||
|
<set>
|
||||||
|
<option value="$PROJECT_DIR$" />
|
||||||
|
</set>
|
||||||
|
</option>
|
||||||
|
<option name="resolveModulePerSourceSet" value="false" />
|
||||||
|
</GradleProjectSettings>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="RemoteRepositoriesConfiguration">
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="central" />
|
||||||
|
<option name="name" value="Maven Central repository" />
|
||||||
|
<option name="url" value="https://repo1.maven.org/maven2" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="jboss.community" />
|
||||||
|
<option name="name" value="JBoss Community repository" />
|
||||||
|
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="MavenRepo" />
|
||||||
|
<option name="name" value="MavenRepo" />
|
||||||
|
<option name="url" value="https://repo.maven.apache.org/maven2/" />
|
||||||
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="Google" />
|
||||||
|
<option name="name" value="Google" />
|
||||||
|
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
|
||||||
|
</remote-repository>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
|
||||||
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
|
</component>
|
||||||
|
<component name="ProjectType">
|
||||||
|
<option name="id" value="Android" />
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/modules/dj_printer.iml" filepath="$PROJECT_DIR$/.idea/modules/dj_printer.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
Binary file not shown.
@ -1,3 +1,8 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.dj.printer.dj_printer">
|
package="com.dj.printer.dj_printer">
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||||
|
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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<Void, Void, Void> {
|
||||||
|
|
||||||
|
@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<String, Void, Integer> {
|
||||||
|
|
||||||
|
|
||||||
|
@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<Context, Void, Void>{
|
||||||
|
|
||||||
|
|
||||||
|
@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);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,38 +1,112 @@
|
|||||||
package com.dj.printer.dj_printer;
|
package com.dj.printer.dj_printer;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
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.embedding.engine.plugins.FlutterPlugin;
|
||||||
|
import io.flutter.plugin.common.EventChannel;
|
||||||
import io.flutter.plugin.common.MethodCall;
|
import io.flutter.plugin.common.MethodCall;
|
||||||
import io.flutter.plugin.common.MethodChannel;
|
import io.flutter.plugin.common.MethodChannel;
|
||||||
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
|
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
|
||||||
import io.flutter.plugin.common.MethodChannel.Result;
|
import io.flutter.plugin.common.MethodChannel.Result;
|
||||||
|
|
||||||
/** DjPrinterPlugin */
|
/**
|
||||||
|
* DjPrinterPlugin
|
||||||
|
*/
|
||||||
public class DjPrinterPlugin implements FlutterPlugin, MethodCallHandler {
|
public class DjPrinterPlugin implements FlutterPlugin, MethodCallHandler {
|
||||||
/// The MethodChannel that will the communication between Flutter and native Android
|
private MethodChannel channel;
|
||||||
///
|
private EventChannel discoveryChannel;
|
||||||
/// This local reference serves to register the plugin with the Flutter Engine and unregister it
|
private EventChannel connectChannel;
|
||||||
/// when the Flutter Engine is detached from the Activity
|
private Context context;
|
||||||
private MethodChannel channel;
|
AsPrint asPrint;
|
||||||
|
private static final String DISCOVERYDEVICE = "com.discovery.devices";
|
||||||
@Override
|
private static final String CONNECT = "com.connect";
|
||||||
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
|
|
||||||
channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "dj_printer");
|
Blutooth blutooth = new Blutooth();
|
||||||
channel.setMethodCallHandler(this);
|
|
||||||
}
|
@Override
|
||||||
|
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
|
||||||
@Override
|
channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "dj_printer");
|
||||||
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
|
channel.setMethodCallHandler(this);
|
||||||
if (call.method.equals("getPlatformVersion")) {
|
context = flutterPluginBinding.getApplicationContext();
|
||||||
result.success("Android " + android.os.Build.VERSION.RELEASE);
|
discoveryChannel = new EventChannel(flutterPluginBinding.getBinaryMessenger(), DISCOVERYDEVICE);
|
||||||
} else {
|
|
||||||
result.notImplemented();
|
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,119 @@
|
|||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:dj_printer/src/status_enum.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
class DjPrinter {
|
class DjPrinter {
|
||||||
static const MethodChannel _channel = MethodChannel('dj_printer');
|
static const MethodChannel _channel = MethodChannel('dj_printer');
|
||||||
|
static const EventChannel _deviceChannel =
|
||||||
|
EventChannel("com.discovery.devices");
|
||||||
|
static StreamSubscription? _discoveryStream;
|
||||||
|
|
||||||
|
static Future<StreamSubscription> 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<StreamSubscription> 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<bool?> get startSearch async {
|
||||||
|
final res = await _channel.invokeMethod('startSearch');
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<bool?> connect(String address) async {
|
||||||
|
final res = await _channel.invokeMethod('connect', {'address': address});
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<bool?> 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<PRINT_STATUS?> 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<String?> get platformVersion async {
|
static Future<bool?> print(
|
||||||
final String? version = await _channel.invokeMethod('getPlatformVersion');
|
{required String code,
|
||||||
return version;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
class Device {
|
||||||
|
String name;
|
||||||
|
String address;
|
||||||
|
bool isPaired;
|
||||||
|
|
||||||
|
Device({
|
||||||
|
required this.name,
|
||||||
|
required this.address,
|
||||||
|
required this.isPaired,
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
enum PRINT_STATUS {
|
||||||
|
normal,
|
||||||
|
busy,
|
||||||
|
paperEmpty,
|
||||||
|
coverOpen,
|
||||||
|
batteryLow,
|
||||||
|
}
|
Loading…
Reference in new issue