android xamarin.android xamarin card.io

android - Portado de Card.IO a C#Xamarin Studio



xamarin.android (1)

Tengo problemas para portar Card.IO a Xamarin Android. Como utilizo C # en lugar de Java, no sé qué hacer con los archivos .so y los archivos .jar.

Intenté seguir algunos de los pasos que se publicaron aquí: card.io Mono para Android (Xamarin Studio) pero obtengo los siguientes dos errores de compilación que no sé cómo resolver.

Esto es lo que hice hasta ahora

  1. Crear un nuevo proyecto de biblioteca de enlaces de Android con Android

  2. Agregue los archivos .jar y .so del proyecto Card.IO, con la estructura de carpetas existente. De modo que hay cuatro subcarpetas en la carpeta / libs y luego un único jar en / libs.

  3. Agregue lo siguiente a Transforms / EnumMethods.xml para resolver un error del compilador:

    <mapping jni-class="io/card/payment/CardIOActivity"> <method jni-name="onActivityResult" parameter="p1" clr-enum-type="Android.App.Result" /> </mapping>

  4. Agregue una referencia a la Biblioteca anterior en mi aplicación principal.

Y luego me enfrento a estos errores de compilación:

El tipo o el nombre del espacio de nombres ''IN'' no existe en el espacio de nombres ''IO.Card.Payment'' (¿falta una referencia de ensamblado?)

''A'': los nombres de los miembros no pueden ser los mismos que su tipo adjunto

Actualizar

El primer error está en esta línea:

public sealed partial class CardIOActivity : global::Android.App.Activity, global::IO.Card.Payment.IN {

El segundo error parece estar en esta línea:

public static global::System.Collections.IList A {

Cualquier ayuda es útil, gracias!


Pasé 10 horas yday para obtener la tarjeta io trabajando con mi aplicación xamarin ... después de largas batallas logré ver lo que quería ... no vi el error anterior sobre 2 interfaces, he tenido una problema con el campo ''a'' en la clase ''A'' y allí como un error que dice que la interfaz "IN" no existe (esta es una interfaz, por lo que no debería mostrarse ningún problema con la clase base doble, eso es extraño).

no estoy seguro si todos mis pasos son necesarios para hacerlo funcionar pero (sorpresa, sorpresa) estaba cansado de limpiar eso y comprobar qué chagnes eran realmente esenciales. muchos problemas son causados ​​por la ofuscación del código de la tarjeta io jar. no importa, volviendo al tema:

  1. crear un nuevo proyecto vinculante, agregar el jar como embebido jar, agregar los archivos .so como bibliotecas nativas embebidas (usar la estructura existente)
  2. abra EnumMethods.xml y agregue allí una asignación:

<mapping jni-class="io/card/payment/CardIOActivity">

<method jni-name="onActivityResult" parameter="p1" clr-enum-type="Android.App.Result" />

</mapping>

(Esto cambia el tipo int enum usado por .net xamarin en el método onActivityResult (que está sobrecargado por una de las clases en card.io.jar) 3. abra Metadata.xml y agregue nodos debajo (algunos pueden ser innecesarios):

<attr path="/api/package[@name=''io.card.payment'']/class[@name=''A'']/field[@name=''a'']" name="managedName">AProp</attr> <attr path="/api/package[@name=''io.card.payment'']/class[@name=''M'']" name="visibility">public</attr> <attr path="/api/package[@name=''io.card.payment'']/class[@name=''M'']" name="name">Mcl</attr> <attr path="/api/package[@name=''io.card.payment'']/interface[@name=''N'']" name="visibility">public</attr> <attr path="/api/package[@name=''io.card.payment'']/interface[@name=''N'']" name="name">Nifc</attr> <attr path="/api/package[@name=''io.card.payment'']/class[@name=''L'']" name="visibility">public</attr> <attr path="/api/package[@name=''io.card.payment'']/class[@name=''L'']/field[@name=''a'']" name="managedName">aProp</attr> <attr path="/api/package[@name=''io.card.payment'']/class[@name=''L'']/method[@name=''a'']" name="managedName">aMethod</attr> <attr path="/api/package[@name=''io.card.payment'']/class[@name=''L'']" name="name">Lcl</attr>

los nodos anteriores cambian algunas visibilidades a público (más necesario) y cambian algunos nombres de clases o iterfaces (no estoy seguro si es necesario, pero me fue útil en algún momento)

  1. agregar referencia al proyecto vinculante en el principal.

  2. abra AndroidManifest.xml en el proyecto principal y añádalo allí:

<activity android:name="io.card.payment.CardIOActivity" android:configChanges="keyboardHidden|orientation" />

<activity android:name="io.card.payment.DataEntryActivity" android:screenOrientation="portrait"/>

los nodos se deben agregar debajo del nodo de la aplicación (que es un elemento secundario del nodo principal - manifiesto)

  1. ahora debería poder invocar CardIOActivity y usar lo que quiera (la invocación y el uso están disponibles y parecen estar bien descritos en los ejemplos proporcionados por los creadores)

  2. una sugerencia más, nada grande, pero cuando finalmente logré que la biblioteca funcionara me perdí ... para obtener el resultado como objeto CreditResult en el método OnActivityResult use java cast: var scanResult = data.GetParcelableExtra (CardIOActivity.ExtraScanResult) .JavaCast ( ); el lanzamiento ordinario de c # no funcionará.

si tiene algún problema, avíseme, tal vez me perdí algo (especialmente que aún no soy experto en xamarin).

¡buena suerte!

ps: respuesta colocada en el foro de @xamarin también

EDITAR: Complete la solución con el enlace, revise y trabaje uploded a github: https://github.com/wiadran/card.io.xamarin.binding.git