IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Fragment v4 et librairie zxing


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Par défaut Fragment v4 et librairie zxing
    Bonjour à tous, dans le cadre de mon stage je développe une appli android mais je fais face à un problème dont je n'ai pas pu trouver la solution sur internet, je compte donc sur votre lumière pour éclaircir un peu tout ca.
    En gros j'ai un fragment (en v4) dans lequel je souhaite ouvrir un scanner de QR Code et en récupérer le résultat. J'ai donc suivi tous les tutos pour bien faire les dépendances dans mon projet, etc ...
    Le problème est que je n'arrive pas à avoir directement le scanner (sans que mon application me demande d'installer l'application Barcode Scanner ...).

    En essayant de trouver une solution, j'ai la portion de code suivante :
    Code : 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
     
    	public void clickScan(View view)
    	{
    		Log.i("QRCode","QRCode test A");
     	       Intent intent = new Intent("com.google.zxing.client.android.SCAN");
     	       intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
     	       startActivityForResult(intent, 0);
     	       Log.i("QRCode","QRCode test B");
    	}
     
    	public void onActivityResult(int request, int result, Intent i)
    	{
    		Log.i("QRCode","QRCode test C");	
    	    IntentResult scan = IntentIntegratorSupportV4.parseActivityResult(request, result, i);
    	    if (scan!=null)
    	    {
    	    	Log.i("QRCode","QRCode formatName : "+scan.getFormatName());
    	    	Log.i("QRCode","QRCode getContents : "+scan.getContents());
    	    }
    	}
    Je récupère une exception "Caused by: java.lang.ClassCastException: MonFragment cannot be cast to android.app.Fragment", et au niveau des logs je récupère "QRCode test A" et "QRCode test B" mais pas les 3 messages de ma méthode onActivityResult.

    Alors qu'avec la portion de code suivante, je récupère bien tous les logs et mon application se lance normalement et me demande juste l'installation de l'autre application la première fois :
    Code : 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
     
    	public void clickScan(View view)
    	{
    		Log.i("QRCode","QRCode test A");
    		IntentIntegratorSupportV4 iiv4 = new IntentIntegratorSupportV4(this);
    		iiv4.initiateScan();
    		Log.i("QRCode","QRCode test B");
    	}
     
    	public void onActivityResult(int request, int result, Intent i)
    	{
    		Log.i("QRCode","QRCode test C");
     
    	    IntentResult scan = IntentIntegratorSupportV4.parseActivityResult(request, result, i);
     
    	    if (scan!=null)
    	    {
    	    	Log.i("QRCode","QRCode formatName : "+scan.getFormatName());
    	    	Log.i("QRCode","QRCode getContents : "+scan.getContents());
    	        //format.setText(scan.getFormatName());
    	        //contents.setText(scan.getContents());
    	    }
    	}
    Je pense que l'exception provient d'une incompatibilité quelque part entre zxing et Fragment v4, étant donné que la ClassCastException ne sort pas dans la deuxième méthode, mais pas de solution trouvée pour le moment ...

    Merci d'avance pour les réponses !

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Citation Envoyé par dau2004 Voir le message
    Le problème est que je n'arrive pas à avoir directement le scanner (sans que mon application me demande d'installer l'application Barcode Scanner ...).
    C'est tout à fait normal.
    Cette librairie (zXing) est à utiliser en faisant appel aux Intent. Ce n'est donc plus ton application qui gère la prise du QrCode en photo.
    Ainsi, il faut que tu aies l'application cliente installée sur ton smartphone.


    Ensuite, tu nous dis que tu as des erreurs (ClassCastException) alors peux-tu nous montrer toute la pile d'erreur, car c'est elle qui va indiquer à quelle ligne se trouve la bourde.

    Personnellement je penche pour une erreur de confusion entre Fragment et FragmentActivity

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Par défaut
    Je m'en suis douté pour zxing, mais je voulais dire que j'ai vu des applications (anciennes certes) utilisant zxing, qui permettent d'accéder directement au scan sans avoir à installer barcode scanner (l'application a déjà barcode scanner en version "embarquée").

    Pour les logs d'erreur je ne suis pas un expert pour les récupérer du coup j'ai lancé adb logcat dans un terminal et j'ai récupérer les erreurs que je voyais sur eclipse :

    Code : 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
     
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: FATAL EXCEPTION: main
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{monAppli/com.google.zxing.client.android.CaptureActivity}: android.view.InflateException: Binary XML file line #59: Error inflating class fragment
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2049)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2083)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.app.ActivityThread.access$600(ActivityThread.java:134)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1233)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:99)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:137)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:4697)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at java.lang.reflect.Method.invokeNative(Native Method)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Method.java:511)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at dalvik.system.NativeStart.main(Native Method)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: Caused by: android.view.InflateException: Binary XML file line #59: Error inflating class fragment
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:255)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.app.Activity.setContentView(Activity.java:1879)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at com.google.zxing.client.android.CaptureActivity.onCreate(CaptureActivity.java:143)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:4539)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2013)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	... 11 more
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: Caused by: java.lang.ClassCastException: MonFragment cannot be cast to android.app.Fragment
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.app.Fragment.instantiate(Fragment.java:574)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.app.Fragment.instantiate(Fragment.java:549)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.app.Activity.onCreateView(Activity.java:4309)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673)
    05-06 15:35:07.406 16273 16273 E AndroidRuntime: 	... 24 more

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    C'est simplement que MonFragment n'hérite pas de Fragment....

    On peut voir la définition de la classe ?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Par défaut
    MonFragment hérite bien de Fragment ... Comme je l'avais dit, j'ai trouvé une méthode qui fonctionne mais je suis obligé de demander à l'utilisateur l'autorisation d'installer Barcode Scanner, alors que mon tuteur m'a fourni une application (fonctionnant avec une activité normale) qui lance le scan sans demander à l'utilisateur d'installer l'application (bien sûr j'ai fait ce test avec l'application Barcode Scanner désinstallée).

    Comme je l'avais dit, je pense que l'erreur vient d'une méthode lancée par zxing qui attend un Fragment "normal" alors que j'ai un Fragment "v4", mais pourtant j'utilise bien IntentIntegratorSupportV4 dans la première portion de code postée ... Peut-être le "startActivityForResult(intent, 0);" ligne 7 qui pose problème dans ma première portion de code postée ?

    Voilà quand même ma classe MonFragment, je n'ai pas mis les import mais ce sont les imports "logiques" je pense, et j'ai déjà précisé que je suis en v4 de Fragment ^^
    Code : 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
    50
    51
    52
     
    public class MonFragment extends Fragment
    {
    	private Button buttonScan;
    	private Context context;	
     
    	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    	{
    		if (container == null)
    		{
    			return null;
    		}
    		View view = inflater.inflate(R.layout.fragment_layout, container, false);
     
    		context=getActivity();
     
    		buttonScan = (Button) view.findViewById(R.id.button_scan);
    		buttonScan.setOnClickListener(new OnClickListener()
    		{
    			public void onClick(View view)
    			{
    				clickScan(view);
    			}
    		});		
    		return view;
    	}
     
    	public void clickScan(View view)
    	{
    		Log.i("QRCode","QRCode test A");
     	       Intent intent = new Intent("com.google.zxing.client.android.SCAN");
     	       intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
     	       startActivityForResult(intent, 0);
     	       Log.i("QRCode","QRCode test B");
    	}
     
    	public void onActivityResult(int request, int result, Intent i)
    	{
    		Log.i("QRCode","QRCode test C");	
    	    IntentResult scan = IntentIntegratorSupportV4.parseActivityResult(request, result, i);
    	    if (scan!=null)
    	    {
    	    	Log.i("QRCode","QRCode formatName : "+scan.getFormatName());
    	    	Log.i("QRCode","QRCode getContents : "+scan.getContents());
    	    }
    	}
     
    	private String recupereText()
    	{
    		return edittext.getText().toString();
    	}
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 64
    Par défaut
    Citation Envoyé par dau2004 Voir le message
    Je m'en suis douté pour zxing, mais je voulais dire que j'ai vu des applications (anciennes certes) utilisant zxing, qui permettent d'accéder directement au scan sans avoir à installer barcode scanner (l'application a déjà barcode scanner en version "embarquée").

    C'est encore tout à fait possible, beaucoup d'applications sont faites comme ça (je l'ai fait également). Il faut que tu importes le code et les ressources de Zxing dans ton propre projet et que tu fasse ta tambouille avec ça.

    Le scan du Code se passe dans CaptureActivity et la valeur scannée est renvoyée dans la méthode handleDecodeInternally() de cette même classe.

    Après tu peux faire un peu de ménage et rendre ton scanner sensible seulement à un type de code, enlever les classes qui ne te servent pas, ...

    Ca peut prendre du temps mais comme la librairie est à maturité, une fois que tu auras fait tes modifs t'es tranquille.

    Je trouve ça beaucoup plus pratique pour un utilisateur que de devoir installer une seconde application.

    Si tu as besoin de plus de précisions n'hésite pas

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Par défaut
    Ok merci, il va donc falloir que je bidouille dans zxing pour toucher là où il y a des Fragments "normaux" et transformer ça en v4, malheureusement je n'ai pas accès à mon code avec les jours fériés et le pont de vendredi, mais je verrai ça dès lundi, je re posterai ici pour donner l'état de mon avancement (et si je trouve une solution je la posterai ici je pense, si ca peut aider quelqu'un dans le futur ).

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 18
    Par défaut
    Juste un autre message pour signaler que je n'ai finalement pas trouvé d'autre alternative que de devoir demander à l'utilisateur d'installer l'appli Barcode Scanner, mais au final ça convient à mon tuteur de stage donc tant pis !
    Merci pour vos réponses !

Discussions similaires

  1. [librairies standard]slang.h et curses.h
    Par miss8 dans le forum Réseau
    Réponses: 13
    Dernier message: 27/12/2002, 10h14
  2. inclure une librairie *.lib
    Par darkbm dans le forum C
    Réponses: 2
    Dernier message: 16/12/2002, 22h48
  3. Réponses: 5
    Dernier message: 09/12/2002, 22h23
  4. [GTK]PB Librairie GTK+ sous dev-c++
    Par wozzy dans le forum Dev-C++
    Réponses: 15
    Dernier message: 05/11/2002, 14h55
  5. compatibilité des librairies directX8
    Par Freakazoid dans le forum DirectX
    Réponses: 3
    Dernier message: 23/05/2002, 21h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo