Skip to content

Commit 490be6c

Browse files
Добавлена поддержка режима сканирования через буфер обмен (clipboard).
1 parent 052c75a commit 490be6c

6 files changed

Lines changed: 82 additions & 28 deletions

File tree

Android/app/build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ apply plugin: 'com.android.application'
22

33
android {
44
compileSdkVersion 30
5-
buildToolsVersion "30.0.0"
5+
buildToolsVersion "30.0.2"
66

77
defaultConfig {
88
applicationId "com.ptolkachev.androidscanner"
99
minSdkVersion 19
1010
targetSdkVersion 30
11-
versionCode 1
12-
versionName "1.0"
11+
versionCode 2
12+
versionName "1.1"
1313

1414
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1515
}
@@ -25,7 +25,7 @@ android {
2525
dependencies {
2626
implementation fileTree(dir: "libs", include: ["*.jar"])
2727
implementation 'androidx.appcompat:appcompat:1.2.0'
28-
testImplementation 'junit:junit:4.12'
28+
testImplementation 'junit:junit:4.13.2'
2929
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
3030
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
3131

Android/app/src/main/java/com/ptolkachev/androidscanner/Scanner.java

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,29 @@
22

33
import android.app.Activity;
44
import android.content.BroadcastReceiver;
5+
import android.content.ClipData;
6+
import android.content.ClipboardManager;
57
import android.content.Context;
68
import android.content.Intent;
79
import android.content.IntentFilter;
810

9-
public class Scanner implements Runnable {
11+
public class Scanner implements Runnable, ClipboardManager.OnPrimaryClipChangedListener {
1012
// in C/C++ code the function will have name
1113
// Java_com_ptolkachev_androidscanner_Scanner_OnBarcodeReceived
1214
static native void OnBarcodeReceived(long pObject, String barcode);
1315

1416
Activity mActivity;
1517
long mCallObject;
1618

17-
BroadcastReceiver mReceiver;
19+
String mScanMode;
1820
String mExtraData;
21+
BroadcastReceiver mReceiver;
1922

2023
public Scanner(Activity activity, long pObject) {
2124
mActivity = activity;
2225
mCallObject = pObject;
2326
mReceiver = null;
27+
mScanMode = "broadcast";
2428
}
2529

2630
public void show()
@@ -33,33 +37,67 @@ public void run() {
3337
System.loadLibrary("com_ptolkachev_AndroidScanner");
3438
}
3539

36-
public void start(String actionName, String extraData) {
40+
public void start(String scanMode, String actionName, String extraData) {
3741
if (mReceiver != null) {
3842
return;
3943
}
4044

41-
mExtraData = extraData;
45+
mScanMode = scanMode;
46+
47+
if (mScanMode.equals("clipboard")) {
48+
ClipboardManager clipboardManager = getClipboardManager();
49+
if (clipboardManager != null) {
50+
clipboardManager.addPrimaryClipChangedListener(this);
51+
}
52+
} else {
53+
mExtraData = extraData;
4254

43-
mReceiver = new BroadcastReceiver() {
44-
@Override
45-
public void onReceive(Context context, Intent intent) {
46-
if (intent != null && intent.hasExtra(mExtraData)) {
47-
String barCode = intent.getStringExtra(mExtraData);
48-
if (barCode != null && !barCode.isEmpty()) {
49-
OnBarcodeReceived(mCallObject, barCode);
55+
mReceiver = new BroadcastReceiver() {
56+
@Override
57+
public void onReceive(Context context, Intent intent) {
58+
if (intent != null && intent.hasExtra(mExtraData)) {
59+
String barCode = intent.getStringExtra(mExtraData);
60+
if (barCode != null && !barCode.isEmpty()) {
61+
OnBarcodeReceived(mCallObject, barCode);
62+
}
5063
}
5164
}
52-
}
53-
};
65+
};
5466

55-
IntentFilter filter = new IntentFilter(actionName);
56-
mActivity.registerReceiver(mReceiver, filter);
67+
IntentFilter filter = new IntentFilter(actionName);
68+
mActivity.registerReceiver(mReceiver, filter);
69+
}
5770
}
5871

5972
public void stop() {
6073
if (mReceiver != null) {
6174
mActivity.unregisterReceiver(mReceiver);
6275
mReceiver = null;
6376
}
77+
if (mScanMode.equals("clipboard")) {
78+
ClipboardManager clipboardManager = getClipboardManager();
79+
if (clipboardManager != null) {
80+
clipboardManager.removePrimaryClipChangedListener(this);
81+
}
82+
}
83+
}
84+
85+
@Override
86+
public void onPrimaryClipChanged() {
87+
ClipboardManager clipboardManager = getClipboardManager();
88+
if (clipboardManager != null) {
89+
ClipData clipData = clipboardManager.getPrimaryClip();
90+
if (clipData != null) {
91+
ClipData.Item item = clipData.getItemAt(0);
92+
String barCode = item.getText().toString();
93+
if (!barCode.isEmpty()) {
94+
OnBarcodeReceived(mCallObject, barCode);
95+
}
96+
}
97+
}
98+
}
99+
100+
private ClipboardManager getClipboardManager() {
101+
return (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE);
64102
}
65103
}

Android/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
buildscript {
33
repositories {
44
google()
5-
jcenter()
5+
mavenCentral()
66
}
77
dependencies {
8-
classpath "com.android.tools.build:gradle:4.0.1"
8+
classpath 'com.android.tools.build:gradle:4.2.0'
99

1010
// NOTE: Do not place your application dependencies here; they belong
1111
// in the individual module build.gradle files
@@ -15,7 +15,7 @@ buildscript {
1515
allprojects {
1616
repositories {
1717
google()
18-
jcenter()
18+
mavenCentral()
1919
}
2020
}
2121

Android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip

Native/AndroidScanner.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,19 @@ CAndroidScanner::CAndroidScanner() :
4141
obj(0),
4242
cnn(0),
4343
mem(0),
44+
m_pwstrScanMode(0),
4445
m_pwstrActionName(0),
4546
m_pwstrExtraData(0),
4647
m_pwstrLastErrorDesc(0),
4748
isOpen(false)
4849
{
4950
wchar_t description[] =
50-
L"<?xml version=\"1.0\" encoding=\"UTF-8\"?><DriverDescription Name=\"Сканеры штрихкода Android\" Description=\"Сканеры штрихкода Android\" EquipmentType=\"СканерШтрихкода\" IntegrationComponent=\"false\" MainDriverInstalled=\"false\" DriverVersion=\"1.0.1.1\" IntegrationComponentVersion=\"1.0\" DownloadURL=\"\" LogIsEnabled=\"false\" LogPath = \"\"/>";
51+
L"<?xml version=\"1.0\" encoding=\"UTF-8\"?><DriverDescription Name=\"Сканеры штрихкода Android\" Description=\"Сканеры штрихкода Android\" EquipmentType=\"СканерШтрихкода\" IntegrationComponent=\"false\" MainDriverInstalled=\"false\" DriverVersion=\"1.0.2.1\" IntegrationComponentVersion=\"1.0\" DownloadURL=\"\" LogIsEnabled=\"false\" LogPath = \"\"/>";
5152
m_pwstrDescription = 0;
5253
convToShortWchar(&m_pwstrDescription, description);
5354

5455
wchar_t parameters[] =
55-
L"<Settings><Group Caption=\"Параметры подключения\"><Parameter Name=\"ActionName\" Caption=\"Action Name\" TypeValue=\"String\" DefaultValue=\"\"/><Parameter Name=\"ExtraData\" Caption=\"Extra Data\" TypeValue=\"String\" DefaultValue=\"\"/></Group></Settings>";
56+
L"<Settings><Group Caption=\"Параметры подключения\"><Parameter Name=\"ScanMode\" Caption=\"Режим сканирования\" TypeValue=\"String\" DefaultValue=\"broadcast\"><ChoiceList><Item Value=\"broadcast\">broadcast event</Item><Item Value=\"clipboard\">clipboard</Item></ChoiceList></Parameter><Parameter Name=\"ActionName\" Caption=\"Action Name\" TypeValue=\"String\" DefaultValue=\"\"/><Parameter Name=\"ExtraData\" Caption=\"Barcode Data\" TypeValue=\"String\" DefaultValue=\"\"/></Group></Settings>";
5657
m_pwstrParameters = 0;
5758
convToShortWchar(&m_pwstrParameters, parameters);
5859

@@ -70,6 +71,8 @@ CAndroidScanner::~CAndroidScanner()
7071
if (isOpen)
7172
Close();
7273

74+
if (m_pwstrScanMode)
75+
delete m_pwstrScanMode;
7376
if (m_pwstrActionName)
7477
delete m_pwstrActionName;
7578
if (m_pwstrExtraData)
@@ -124,7 +127,7 @@ void CAndroidScanner::SetIConnect(IAddInDefBaseEx* piConnect)
124127
jenv->CallVoidMethod(obj, methodID_show);
125128

126129
// Methods
127-
methodID_open = jenv->GetMethodID(cc, "start", "(Ljava/lang/String;Ljava/lang/String;)V");
130+
methodID_open = jenv->GetMethodID(cc, "start", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
128131
methodID_close = jenv->GetMethodID(cc, "stop", "()V");
129132
}
130133
}
@@ -158,9 +161,18 @@ WCHAR_T* CAndroidScanner::GetParameters()
158161

159162
bool CAndroidScanner::SetParameter(wchar_t* name, wchar_t* value)
160163
{
161-
if (!name)
164+
if (!name || !value)
162165
return false;
163166

167+
if (wcscmp(name, L"ScanMode") == 0)
168+
{
169+
if (m_pwstrScanMode) {
170+
delete m_pwstrScanMode;
171+
m_pwstrScanMode = 0;
172+
}
173+
174+
convToShortWchar(&m_pwstrScanMode, value);
175+
}
164176
if (wcscmp(name, L"ActionName") == 0)
165177
{
166178
if (m_pwstrActionName)
@@ -193,14 +205,17 @@ void CAndroidScanner::Open()
193205
{
194206
JNIEnv* jenv = getJniEnv();
195207

208+
jstring scanMode = m_pwstrScanMode != NULL ?
209+
jenv->NewString(m_pwstrScanMode, getLenShortWcharStr(m_pwstrScanMode)) :
210+
NULL;
196211
jstring actionName = m_pwstrActionName != NULL ?
197212
jenv->NewString(m_pwstrActionName, getLenShortWcharStr(m_pwstrActionName)) :
198213
NULL;
199214
jstring extraData = m_pwstrExtraData != NULL ?
200215
jenv->NewString(m_pwstrExtraData, getLenShortWcharStr(m_pwstrExtraData)) :
201216
NULL;
202217

203-
jenv->CallVoidMethod(obj, methodID_open, actionName, extraData);
218+
jenv->CallVoidMethod(obj, methodID_open, scanMode, actionName, extraData);
204219

205220
isOpen = true;
206221
}

Native/AndroidScanner.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class CAndroidScanner
4141
IAddInDefBaseEx* cnn;
4242
IMemoryManager* mem;
4343

44+
WCHAR_T* m_pwstrScanMode;
4445
WCHAR_T* m_pwstrActionName;
4546
WCHAR_T* m_pwstrExtraData;
4647
WCHAR_T* m_pwstrDescription;

0 commit comments

Comments
 (0)