Bonjour,
Je travaille actuellement sur un projet pour une flasheuse Zebra TC800, un lecteur de code barre connecté tournant sous Android. Ces lecteurs fonctionnent sous Android, et le développement d'applications se fait sous Android Studio. Le développement se fait comme sur smartphone, et une librairie en Java, EMDK, permet de lire les codes barre.
Les premières versions de l'application fonctionnaient bien, jusqu'à ce que j'essaye de modifier le paramètre aimType de la configuration du scanner. (Il permet, entre autre, de demander à ne prendre en compte un code barre qu'après que l'utilisateur l'ai pointé pendant un délai minimum, pour éviter les erreurs de saisie, mais ce n'est pas important pour comprendre le problème.) Le code compile sans problème, mais à l'exécution, j'obtiens :
A en croire ce message, le champ aimType de la configuration n'existe pas, alors qu'Android Studio confirme son existence. J'ai décompilé l'apk et la classe ScannerConfig.ReaderParams.ReaderSpecific.LaserSpecific s'y trouve bien, et elle a un champ aimType. En revanche, si j'utilise l'introspection de code ( getClass().getDeclaredFields() ) , LaserSpecific n'a pas de champ aimType à l'exécution.
Code : Sélectionner tout - Visualiser dans une fenêtre à part java.lang.NoSuchFieldError: No instance field aimType of type Lcom/symbol/emdk/barcode/ScannerConfig$AimType; in class Lcom/symbol/emdk/barcode/ScannerConfig$ReaderParams$ReaderSpecific$LaserSpecific; or its superclasses (declaration of 'com.symbol.emdk.barcode.ScannerConfig$ReaderParams$ReaderSpecific$LaserSpecific' appears in /system/framework/com.symbol.emdk.jar)
J'ai vérifié la documentation, et aimType est un ajout récent à cette librairie, les versions précédentes ne l'ont pas. A ce stade, je soupçonne que l'application ignore la copie d'EMDK embarquée dans mon apk au profit d'un version plus ancienne pré existant sur le lecteur de code barre, sans pouvoir le confirmer.
A toutes fins utiles, voici le code que j'utilise pour accéder au champ aimType:
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 ScannerConfig config = scanner.getConfig(); ScannerConfig.AimType aimType = ScannerConfig.AimType.TIMED_HOLD; config.readerParams.readerSpecific.laserSpecific.aimType = aimType; config.readerParams.readerSpecific.laserSpecific.aimTimer = 500; scanner.setConfig(config);
Ici, le fichier build.gradle indiquant l'utilisation d'EMDK:
J'ai essayé de mettre la dépendance EMDK en compile, sans changement.
Code Groovy : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { applicationId "com.bonduelle.agreoscan.agreoscan" minSdkVersion 22 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { emdk6 { targetSdkVersion 23 minSdkVersion 21 // EMDK 6.0 supports as far back as KitKat (19) versionCode 30000 + android.defaultConfig.versionCode versionNameSuffix "-emdk6" } emdk5 { // Not compatible with Marshmallow devices minSdkVersion 16 targetSdkVersion 16 // Though EMDK 5 actually supported up to Lollipop, we are only using it for JB deployments maxSdkVersion 22 // Note: Google would still allow installation on 23+ devices (https://developer.android.com/guide/topics/manifest/uses-sdk-element.html) versionCode 75000 + android.defaultConfig.versionCode versionNameSuffix "-emdk5" } } } dependencies { provided fileTree(include: ['com.symbol.emdk.jar'], dir: 'D:\\Andoid\\sdk\\add-ons\\addon-symbol_emdk-symbol-23\\libs') compile fileTree(exclude: ['com.symbol.emdk.jar'], dir: 'libs') compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.mcxiaoke.volley:library:1.0.19' testCompile 'junit:junit:4.12' }
Quelqu'un a-t-il déjà eu un problème similaire, où la version d'une dépendance changeait entre l'environnement de développement et l'exécution? A moins que ce ne soit un autre problème entièrement?
Partager