8 votes

card.io Mono pour Android (Xamarin Studio)

Quelqu'un a-t-il réussi à créer un wrapper card.io qu'il est prêt à partager et qui peut être utilisé dans une application Mono pour Android ou quelqu'un peut-il m'éclairer sur ce que je fais mal ?

  1. Créer un nouveau Bibliothèque de liaisons Java pour Android Projet

  2. Ajouter les fichiers .jar et .so de card.io SDK 3.0.3 Pour ce faire, assurez-vous d'utiliser la structure de dossier existante

  3. Ajouter ce qui suit à Transforms/EnumMethods.xml pour résoudre une erreur du compilateur :

    <mapping jni-class="io/card/payment/CardIOActivity">
        <method jni-name="onActivityResult" parameter="p1" clr-enum-type="Android.App.Result" />
    </mapping>
  4. Ajouter une référence à la bibliothèque ci-dessus dans mon application principale

Tout se compile et je peux accéder aux classes card.io :

using IO.Card.Payment;

private void WireupScanCardButton()
{
    Log.Debug(this.GetType().Name, "WireupScanCardButton");

    this.ScanCardButton.Click += delegate 
    {
        Log.Debug(this.GetType().Name, "ScanCard.Click");

        var intent = new Intent(this, typeof(CardIOActivity));

        // Required for authentication with card.io
        intent.PutExtra(CardIOActivity.ExtraAppToken, "<MY PRIVATE TOKEN HERE>");

        // Customize these values to suit your needs.
        intent.PutExtra(CardIOActivity.ExtraNoCamera, false);
        intent.PutExtra(CardIOActivity.ExtraSuppressManualEntry, true);
        intent.PutExtra(CardIOActivity.ExtraRequireExpiry, false);
        intent.PutExtra(CardIOActivity.ExtraRequireCvv, false);
        intent.PutExtra(CardIOActivity.ExtraRequireZip, false);

        // Run the Activity
        this.StartActivityForResult(intent, 0);            
    };
}

Cependant, je suis toujours confronté à l'erreur suivante :

ce dispositif ne peut pas utiliser la caméra pour lire les numéros de carte

NOTES :

  • J'ai essayé de l'exécuter sur plusieurs dispositifs physiques différents
  • le fichier card.io.jar a une action de construction de : EmbeddedJar
  • les fichiers .so ont une action de construction de : EmbeddedNativeLibrary
  • J'ai explicitement défini le Abi pour chaque fichier .so du projet Groupe d'articles

Je suis très novice en matière d'Android/Xamarin, et je passe donc plus de temps à faire des recherches qu'à coder.

Les fichiers .so ne semblent pas se trouver dans le fichier .apk

Edita:

Les fichiers .so semblent être pris en compte par le compilateur. Après la compilation, si je vérifie le fichier obj/Release/ il existe un sous-dossier Importations de bibliothèques natives qui contient les fichiers .so dans des sous-dossiers appropriés en fonction du type d'Abi pris en charge.

Cependant, les fichiers .so n'apparaissent toujours pas dans le fichier .apk final.

sortie logcat :

04-18 08:12:20.462 D/ActivityAddPaymentSource( 5824): ScanCard.Click
04-18 08:12:20.472 E/ActivityManager(  191): exception bw.write()java.io.IOException: Transport endpoint is not connected
04-18 08:12:20.472 I/ActivityManager(  191): Starting: Intent { cmp=com.onetab.android/io.card.payment.CardIOActivity (has extras) } from pid 5824
04-18 08:12:20.472 D/PowerManagerService(  191): acquireWakeLock flags=0x1 tag=ActivityManager-Launch
04-18 08:12:20.492 D/ActivityAddPaymentSource( 5824): OnPause
04-18 08:12:20.492 E/Sensors (  191): GsSensor: line +83 ~~~handle===0~~en==1~~!n
04-18 08:12:20.502 E/Sensors (  191): GsSensor::setDelay: line +113 ~~~handle===0~~ns==1553152~~!n
04-18 08:12:20.502 E/Sensors (  191): GsSensor::setDelay: line +113 ~~~handle===0~~ns==-2135896001~~!n
04-18 08:12:20.542 W/card.io ( 5824): cardioScanErrorNoDeviceSupport: This device cannot use the camera to read card numbers.
04-18 08:12:20.572 E/ActivityManager(  191): exception bw.write()java.io.IOException: Transport endpoint is not connected
04-18 08:12:20.572 D/PowerManagerService(  191): acquireWakeLock flags=0x1 tag=ActivityManager-Launch
04-18 08:12:20.582 E/Sensors (  191): GsSensor: line +83 ~~~handle===0~~en==0~~!n
04-18 08:12:20.622 D/ActivityAddPaymentSource( 5824): OnResume

Merci de votre attention.

4voto

tomwhipple Points 1669

Le logcat Android devrait afficher un message d'erreur plus spécifique, mais ce problème est dû à l'absence de bibliothèques natives. (Pour les projets Android normaux, ces bibliothèques se trouvent dans le répertoire /libs avec des sous-répertoires spécifiques à l'architecture).

Il s'agit des .so que vous mentionnez sont absents du fichier .apk. Ils contiennent toute la logique de traitement de l'image, de sorte que card.io ne peut pas scanner s'ils ne sont pas présents.

4voto

dalesmckay Points 121

J'ai finalement résolu ce problème après quelques expériences.

  1. Suivez les 4 étapes de mon post original
  2. Extraire le SDK card.io à la racine du projet de bibliothèque de sorte que vous obteniez une structure de dossier de : ProjectRoot/libs/ <the sdk files and abi subfolders>
  3. Ajouter le fichier .jar au projet Bocaux (sélectionner le dossier ajouter un lien option)
  4. Ajouter le libs à la racine de votre projet (à l'exclusion du fichier .jar)
  5. Il se peut que vous deviez modifier manuellement le .csproj pour ajouter le fichier Abi objectif de chaque .donc fichier
  6. Veiller à ce que le . bocal a un fichier Construire l'action de EmbeddedJar
  7. Veiller à ce que le .donc Les fichiers ont un Construire l'action de Bibliothèque native intégrée

@tomwhipple - merci pour votre contribution. J'ai essayé de noter votre réponse mais apparemment je n'ai pas assez de réputation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X