2011-04-10 13 views
6

Estoy tratando de integrar el escáner de código de barras de ZXing en una aplicación MonoDroid. Veo que las aplicaciones normales de Android (java) tienen IntentIntegration.java and IntentResult.java para incluir en su proyecto. Me preguntaba si alguien los ha portado a .NET (no los vi portados en el proyecto csharp). También me pregunto si alguien ha implementado ZXing de otra manera para poder trabajar con su aplicación. Si alguien se ha integrado con MonoDroid, ¿qué hay que hacer para iniciar un escaneo con un clic en el controlador de clic?zxing integración en la aplicación de monodroid

Además, si alguien tiene otro escáner de código de barras de 3 partes que podría implementarse en su lugar, ponga esas sugerencias en los comentarios.

Respuesta

4

La primera pregunta es, ¿realmente necesita portar esos archivos? :-)

Puede incluir el código fuente de Java en un proyecto Mono para Android; simplemente establezca la acción Build en AndroidJavaSource y la fuente se compilará en el .apk resultante. Esto también se puede hacer con los archivos .jar.

Luego viene la pregunta de invoking the Java code from C#.

En el caso de IntentIntegration.java y IntentResult.java, que puede ser suficiente, ya que esos tipos no son compatibles con la herencia (son final). Por supuesto, el uso de JNIEnv para invocar métodos en ellos serían un PITA, pero se puede hacer:

// Untested code, provided for demo purposes: 

// Handle of the Java class we're invoking 
IntPtr IntentResult = 
     JNIEnv.FindClass("com/google/zxing/integration/android/IntentIntegrator"); 
// Handle of the method to invoke 
IntPtr IntentResult_initiateScan = 
     JNIEnv.GetMethodID(IntentResult, "initiateScan", 
      "(Landroid/app/Activity;)Landroid/app/AlertDialog;"); 
      // method signature can be obtained from `javap -s` 
// Invoke the method; return value is an AlertDialog instance 
IntPtr rAlertDialog = JNIEnv.CallStaticObjectMethod (
     IntentResult, IntentResult_initiateScan, new JValue (someActivity)); 
// ...and construct a nice managed wrapper over the Java instance. 
AlertDialog alertDialog = new AlertDialog (rAlertDialog); 

Por otra parte, los IntentIntegrator documentos mencionan que la actividad proporcionada debe reemplazar el método Activity.OnActivityResult.

Dicho todo esto, portar IntentIntegrator.java no debería ser que difícil, ya que la mayor parte es un envoltorio sobre Activity.StartActivityForResult con la intención y la construcción apropiada de un AlertDialog (que puede o no puede necesitar).

+1

si está seguro de que esto funciona, hágamelo saber. Cambié de MonoDroid al verdadero SDK de Android (excepto que utilizo el estudio IntelliJ de JetBrains) ya que esto era imprescindible para que ZX funcione. – thames

+0

jonp, no entendí el parámetro de firma del método GetMethodID. No he podido ejecutar javap en intentintegrator.java, ya que sigue quejándose de que no puede encontrar la clase. Por favor ayuda. ¿Podría explicar el componente de la firma? –

+0

@CF_Maintainer: la manera más fácil es usar 'javap -s -classpath filename.jar package.of.some.Type'. Sin embargo, si tienes un archivo '.java' y no un archivo' .jar', te sugiero compilar en un archivo '.class' y usar' javap'; de lo contrario, debe deducir manualmente la firma JNI: http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html#wp16432 y http://www.rgagnon.com /javadetails/java-0286.html – jonp

Cuestiones relacionadas