2013-04-16 5 views
8

Hat jemand erfolgreich einen card.io Wrapper erstellt, den sie teilen möchten, der in einem Mono für Android-Anwendung verwendet werden kann oder kann jemand etwas Licht auf das, was ich tue, werfen falsch?card.io Mono für Android (Xamarin Studio)

  1. Erstellen Sie ein neues Android Java Bindings Bibliothek Projekt
  2. die .jar hinzufügen und .so-Dateien von card.io SDK 3.0.3, müssen Sie die vorhandene Ordnerstruktur
  3. Fügen Sie die folgenden Wandelt/EnumMethods verwenden. xml einen Compiler-Fehler zu beheben:

    <mapping jni-class="io/card/payment/CardIOActivity"> 
        <method jni-name="onActivityResult" parameter="p1" clr-enum-type="Android.App.Result" /> 
    </mapping> 
    
  4. Fügen Sie einen Verweis auf die oben Bibliothek in meiner Hauptanwendung

Alles kompiliert und ich kann die card.io Klassen zugreifen:

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);    
    }; 
} 

Allerdings bin ich immer mit dem folgenden Fehler dargestellt:

Dieses Gerät darf keine Kamera Kartennummern verwenden können lesen

HINWEISE:

  • Ich habe versucht, auf verschiedene physikalische Geräte mit
  • die card.io.jar Datei hat eine Build Action von: EmbeddedJar
  • die .so-Dateien haben eine Build Action von: EmbeddedNativeLibrary
  • ich ausdrücklich die festgelegt haben Abi für jede .so-Datei im Projekt ItemGroup

ich bin auf Android/Xamarin sehr neu, so dass mehr Zeit mit der Erforschung verbringen als Codierung.

Die .so-Dateien erscheinen nicht in der APK-Datei sein

Edit:

Die .so-Dateien scheinen durch den Compiler zu abgeholt. Nach der Kompilierung, wenn ich den Ordner obj/Release/ überprüfen, gibt es einen Unterordner native_library_imports, die die .SO-Dateien in entsprechenden Unterordnern nach dem unterstützten Abi-Typ enthält.

Die .SO-Dateien erscheinen jedoch immer noch nicht in der endgültigen APK-Datei.

logcat Ausgang:

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 

dank

Antwort

4

Nun, ich habe das nach einigen Experimenten endlich gelöst.

  1. Folgen Sie den 4 Schritten in meinem ursprünglichen Beitrag
  2. an der Wurzel des Bibliotheksprojekt der card.io SDK extrahieren, so dass Sie mit einer Ordnerstruktur am Ende: projectroot/libs/<the sdk files and abi subfolders>
  3. Fügen Sie die JAR-Datei in das Projekt Jars Ordner (wählen Sie die Link hinzufügen Option)
  4. Fügen Sie die libs Ordner an die Wurzel des Projektes (mit Ausnahme der .jar-Datei)
  5. Möglicherweise müssen Sie manuell die CSPROJ Datei bearbeiten, um das Abi Ziel jeder .so Datei
  6. Stellen Sie sicher, die hinzuzufügen. jar Datei hat eine Aktion Erstellen von EmbeddedJar
  7. Sicherstellen, dass die .so Dateien haben eine Aktion Build- von EmbeddedNativeLibrary

@tomwhipple - Danke für den Beitrag. Ich habe versucht, deine Antwort zu verbessern, aber anscheinend habe ich nicht genug Ansehen.

4

Die Android logcat eine spezifischere Fehlermeldung zeigen sollte, aber dieses Problem ist durch native Bibliotheken zu fehlen. (Für normale Android-Projekte leben diese im Verzeichnis /libs mit architekturspezifischen Unterverzeichnissen.)

Dies sind die .so Dateien, die Sie in der .apk fehlen. Sie enthalten die gesamte Bildverarbeitungslogik, sodass card.io nicht scannen kann, wenn sie nicht vorhanden sind.

+0

Danke für die Antwort. Ich habe meinen ursprünglichen Beitrag mit weiteren Informationen bearbeitet. Es gibt etwas über ** Transport Endpunkt ist nicht verbunden **, die ich untersuche. – dalesmckay