8

Mono for Android アプリケーションで使用できる card.io ラッパーを共有することに成功した人はいますか?

  1. 新しいAndroid Java バインディング ライブラリプロジェクトを作成する
  2. card.io SDK 3.0.3から .jar および .so ファイルを追加します。必ず既存のフォルダー構造を使用してください。
  3. 以下を Transforms/EnumMethods.xml に追加して、コンパイラ エラーを解決します。

    <mapping jni-class="io/card/payment/CardIOActivity">
        <method jni-name="onActivityResult" parameter="p1" clr-enum-type="Android.App.Result" />
    </mapping>
    
  4. 上記のライブラリへの参照をメイン アプリケーションに追加します。

すべてがコンパイルされ、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);            
    };
}

ただし、常に次のエラーが表示されます。

このデバイスはカメラを使用してカード番号を読み取ることができません

ノート:

  • いくつかの異なる物理デバイスで実行してみました
  • card.io.jar ファイルの Build Action は EmbeddedJar です。
  • .so ファイルには次の Build Action があります: EmbeddedNativeLibrary
  • プロジェクトItemGroupの各 .so ファイルに明示的にAbiを設定しました

私は Android/Xamarin を初めて使用するので、コーディングよりも調査に多くの時間を費やしています。

.so ファイルが .apk ファイルに含まれていないようです

編集:

.so ファイルは、コンパイラによって取得されるようです。コンパイル後、obj/Release/フォルダーを確認すると、サポートされている Abi タイプに応じて適切なサブフォルダーに .so ファイルを含むサブフォルダーnative_library_importsがあります。

ただし、.so ファイルはまだ最終的な .apk ファイルには表示されません。

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

ありがとう

4

2 に答える 2

4

さて、私はいくつかの実験の後、最終的にこれを解決しました。

  1. 元の投稿の 4 つの手順に従ってください
  2. card.io SDK をライブラリ プロジェクトのルートに抽出して、フォルダー構造がProjectRoot/libs/になるようにします。<the sdk files and abi subfolders>
  3. .jar ファイルを Project Jarsフォルダーに追加します (リンクの追加オプションを選択します) 。
  4. libsフォルダーをプロジェクトのルートに追加します (.jar ファイルを除く)。
  5. .csprojファイルを手動で編集して、各.soファイルのAbiターゲットを追加する必要がある場合があります
  6. を確認してください。jarファイルには、EmbeddedJarのBuild アクションがあります。
  7. .soファイルにEmbeddedNativeLibraryのビルド アクションがあることを確認します。

@tomwhipple - 貢献してくれてありがとう。私はあなたの答えに賛成しようとしましたが、どうやら私には十分な評判がありません。

于 2013-04-21T00:12:52.583 に答える