OnActivityResult Nunca se llama Phonegap Córdoba
Estoy usando el plugin de escáner de código de barras para PhoneGap usando ZXing como proyecto de biblioteca.
Tengo un código que funciona perfectamente en Galaxy Tab 2 (7 "). El mismo código no funciona en el Galaxy S3.
- ZXing doble imagen / superposición después de escanear
- No se puede escanear QRCode a través del cliente zxing
- Android con ZXing genera código QR
- ZXing cómo escanear código QR y código de barras 1D?
- Escaneo de códigos QR sin cámara de pantalla completa
Problema: Cuando ZXing CaptureActivity escanea el código de barras acaba de terminar la actividad CaptureActivity y Calling nunca vuelve con el método onActivityResult.
MainFest.
<activity android:name=".activity.MainActivity" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/app_name" android:theme="@android:style/Theme.Black.NoTitleBar" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.google.zxing.client.android.CaptureActivity" android:configChanges="orientation|keyboardHidden" android:screenOrientation="landscape" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateAlwaysHidden" > <intent-filter> <action android:name="com.phonegap.plugins.barcodescanner.SCAN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application>
MainActivity.java
public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode) { this.activityResultCallback = command; this.activityResultKeepRunning = this.keepRunning; // If multitasking turned on, then disable it for activities that return // results if (command != null) { this.keepRunning = false; } // Start activity startActivityForResult(intent, requestCode); } protected void onActivityResult(int requestCode, int resultCode, Intent intent) { CordovaPlugin callback = this.activityResultCallback; if (callback != null) { callback.onActivityResult(requestCode, resultCode, intent); } else { Log.e(TAG, "Plugin callback null"); } // else continue with any other code you need in the method super.onActivityResult(requestCode, resultCode, intent); }
Plugin de BarcodeScanner
private static final String SCAN_INTENT = "com.phonegap.plugins.barcodescanner.SCAN"; public void scan() { Intent intentScan = new Intent(SCAN_INTENT); intentScan.addCategory(Intent.CATEGORY_DEFAULT); this.cordova.startActivityForResult((CordovaPlugin) this, intentScan, AppConstants.CAMERA_SCAN_REQUEST_CODE); }
Tengo el proyecto ZXing como proyecto de biblioteca.
La ayuda sería apreciada.
- ZXing Android Generar código de barras 1D
- ¿Cómo usar Zxing para el escáner de código qr sin usar la cámara?
- Cómo reiniciar la cámara de manera eficiente en un fragmento - Barcode Scanner
- Escaneo de código QR desde un archivo de imagen
- Lanzamiento de un fragmento después de ZXing 2.0 QR-Code Scan
- Escáner de código de barras zxing en una div fija en phonegap android app
- Mi sentencia java if no parece estar funcionando
- ¿Cómo importar ZXING a android studio?
Documentación de la vista web de Per Cordova
Necesitas tener este código en tu actividad:
@Override public void setActivityResultCallback(CordovaPlugin plugin) { this.activityResultCallback = plugin; } public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode) { this.activityResultCallback = command; this.activityResultKeepRunning = this.keepRunning; // If multitasking turned on, then disable it for activities that return results if (command != null) { this.keepRunning = false; } // Start activity super.startActivityForResult(intent, requestCode); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); CordovaPlugin callback = this.activityResultCallback; if (callback != null) { callback.onActivityResult(requestCode, resultCode, intent); } }
Y además de:
this.cordova.startActivityForResult((CordovaPlugin) this, intentScan, AppConstants.CAMERA_SCAN_REQUEST_CODE);
Usted necesita tener el siguiente método en su plugin:
@Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { //do something with the result super.onActivityResult(requestCode, resultCode, intent); }
Intenta poner esto cordova.setActivityResultCallback (this);
Justo antes de llamar a la actividad this.cordova.startActivityForResult((CordovaPlugin) this, intentScan, AppConstants.CAMERA_SCAN_REQUEST_CODE);
En mi clase de plugin cordova, antes de llamar al método startActivityForResult establezco esta clase como la devolución de llamada de resultado.
cordova.setActivityResultCallback(this);
La respuesta que @aviv dio es absolutamente correcta, y aunque esto puede no haber ocurrido en este caso en particular, es importante agregar un detalle:
Cuando establezca las banderas de su intención en su complemento, debe recordar configurar el indicador como FLAG_ACTIVITY_SINGLE_TOP
, en lugar de FLAG_ACTIVITY_NEW_TASK
, de lo contrario su método setResult () no volverá como se esperaba.
Además, recuerde asegurarse de que su manifiesto declare el launchMode como tal:
android:launchMode="singleTop"
Hay un problema extraño en Android, donde si se ejecuta como un solo principio cosas parecen funcionar bien, pero si se ejecuta como una sola instancia o una sola tarea el resultado volverá inmediatamente.
Así que recuerda agregar esto cuando estés a punto de lanzar tu capa nativa desde tu plugin
Intent i = new Intent(cordova.getActivity(), ThanksActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); cordova.startActivityForResult(this, i, 0); PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT); r.setKeepCallback(true); callbackContext.sendPluginResult(r);