Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo puedo obtener una aplicación Phonegap para recibir variables en Android?

Con mucha ayuda de la comunidad Stack OVerflow, ahora he configurado correctamente mi aplicación de Android para que cuando haga clic en un enlace de un correo electrónico, abra mi aplicación directamente. En otras palabras, tengo mi <intent-filter> en mi AndroidManifest.xml correctamente configurado.

Hasta ahora todo está bien, pero hay un último paso con el que todavía estoy luchando, que está haciendo que mi aplicación Phonegap construya para recoger y utilizar las variables que le paso desde una URL en un correo electrónico.

El enlace en el correo electrónico se ve así:

 <a target="_blank" href="https://mysite.com/confirmation.html?verification=XXXXXXXXX&username=larry">Complete verification with MYAPP</a> 

Al hacer clic en el vínculo se abre mi aplicación. Para ser exactos, cuando se hace clic en él, aparece un cuadro de diálogo preguntando al usuario si quieren abrir usando un navegador o mi aplicación, lo que es genial.

De todos modos, el punto es que si utilizan mi aplicación para abrir mi aplicación, se abre a la pantalla de bienvenida predeterminada. El comportamiento deseado, sin embargo, es que la aplicación se abra a una página específica, confirmation.html , y tiene dos campos llenos con las variables de la URL, la verificación y el nombre de usuario.

¿Cómo puedo obtener mi aplicación Phonegap para comenzar en la página correcta y utilizar las variables en la URL?

Importante: Realmente quiero subrayar, por lo que es absolutamente claro, se trata de una construcción Phonegap, lo que significa que la aplicación utiliza HTML y Javascript, no código nativo de Android. Gracias por su comprensión.

One Solution collect form web for “¿Cómo puedo obtener una aplicación Phonegap para recibir variables en Android?”

Si está utilizando WebIntent (que supongo que haces?), Puedes hacer esto sencillamente:

 window.plugins.webintent.getUri(function(url) { if(url !== "") { // url is the url the intent was launched with document.querySelector("#tag").innerHTML = "URL = " + url; } }); 

Editar:

Ok, así que me las arreglé para obtener el complemento de trabajo en PhoneGap 2.9.0.

Sin embargo tengo que aclarar algunas cosas.

En primer lugar, usted dijo que ciertos métodos fueron obsoletos, sin embargo la depreciación no significa que los métodos no funcionará. El complemento (antiguo) como se muestra en github funciona bien, pero me las arreglé para conseguir que funcione con el CordovaPlugin también.

El problema con la versión más reciente del complemento parece estar en el archivo webintent.js.

He cambiado algunas líneas de código para corregir un error que ocurrió dentro del archivo.

 /** * cordova Web Intent plugin * Copyright (c) Boris Smus 2010 * */ (function(cordova){ var WebIntent = function() { }; WebIntent.prototype.ACTION_SEND = "android.intent.action.SEND"; WebIntent.prototype.ACTION_VIEW= "android.intent.action.VIEW"; WebIntent.prototype.EXTRA_TEXT = "android.intent.extra.TEXT"; WebIntent.prototype.EXTRA_SUBJECT = "android.intent.extra.SUBJECT"; WebIntent.prototype.EXTRA_STREAM = "android.intent.extra.STREAM"; WebIntent.prototype.EXTRA_EMAIL = "android.intent.extra.EMAIL"; WebIntent.prototype.startActivity = function(params, success, fail) { return cordova.exec(function(args) { success(args); }, function(args) { fail(args); }, 'WebIntent', 'startActivity', [params]); }; WebIntent.prototype.hasExtra = function(params, success, fail) { return cordova.exec(function(args) { success(args); }, function(args) { fail(args); }, 'WebIntent', 'hasExtra', [params]); }; WebIntent.prototype.getUri = function(success, fail) { return cordova.exec(function(args) { success(args); }, function(args) { fail(args); }, 'WebIntent', 'getUri', []); }; WebIntent.prototype.getExtra = function(params, success, fail) { return cordova.exec(function(args) { success(args); }, function(args) { fail(args); }, 'WebIntent', 'getExtra', [params]); }; WebIntent.prototype.onNewIntent = function(callback) { return cordova.exec(function(args) { callback(args); }, function(args) { }, 'WebIntent', 'onNewIntent', []); }; WebIntent.prototype.sendBroadcast = function(params, success, fail) { return cordova.exec(function(args) { success(args); }, function(args) { fail(args); }, 'WebIntent', 'sendBroadcast', [params]); }; window.webintent = new WebIntent(); // backwards compatibility window.plugins = window.plugins || {}; window.plugins.webintent = window.webintent; })(window.PhoneGap || window.Cordova || window.cordova); 

Dentro de WebIntent.java Cambié una variable a private CallbackContext onNewIntentCallback = null;

 package com.borismus.webintent; import java.util.HashMap; import java.util.Map; import org.apache.cordova.DroidGap; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.content.Intent; import android.net.Uri; import android.util.Log; import android.text.Html; import org.apache.cordova.api.CordovaPlugin; import org.apache.cordova.api.PluginResult; import org.apache.cordova.api.CallbackContext; /** * WebIntent is a PhoneGap plugin that bridges Android intents and web * applications: * * 1. web apps can spawn intents that call native Android applications. 2. * (after setting up correct intent filters for PhoneGap applications), Android * intents can be handled by PhoneGap web applications. * * @author boris@borismus.com * */ public class WebIntent extends CordovaPlugin { private CallbackContext onNewIntentCallback = null; /** * Executes the request and returns PluginResult. * * @param action * The action to execute. * @param args * JSONArray of arguments for the plugin. * @param callbackContext * The callbackContext used when calling back into JavaScript. * @return boolean */ public boolean execute(String action, JSONArray args, CallbackContext callbackContext) { try { if (action.equals("startActivity")) { if (args.length() != 1) { PluginResult res = new PluginResult(PluginResult.Status.INVALID_ACTION); callbackContext.sendPluginResult(res); return false; } // Parse the arguments JSONObject obj = args.getJSONObject(0); String type = obj.has("type") ? obj.getString("type") : null; Uri uri = obj.has("url") ? Uri.parse(obj.getString("url")) : null; JSONObject extras = obj.has("extras") ? obj.getJSONObject("extras") : null; Map<String, String> extrasMap = new HashMap<String, String>(); // Populate the extras if any exist if (extras != null) { JSONArray extraNames = extras.names(); for (int i = 0; i < extraNames.length(); i++) { String key = extraNames.getString(i); String value = extras.getString(key); extrasMap.put(key, value); } } startActivity(obj.getString("action"), uri, type, extrasMap); callbackContext.success(); return true; } else if (action.equals("hasExtra")) { if (args.length() != 1) { PluginResult res = new PluginResult(PluginResult.Status.INVALID_ACTION); callbackContext.sendPluginResult(res); return false; } Intent i = ((DroidGap)this.cordova.getActivity()).getIntent(); String extraName = args.getString(0); PluginResult res = new PluginResult(PluginResult.Status.OK, i.hasExtra(extraName)); callbackContext.sendPluginResult(res); return true; } else if (action.equals("getExtra")) { if (args.length() != 1) { PluginResult res = new PluginResult(PluginResult.Status.INVALID_ACTION); callbackContext.sendPluginResult(res); return false; } Intent i = ((DroidGap)this.cordova.getActivity()).getIntent(); String extraName = args.getString(0); if (i.hasExtra(extraName)) { PluginResult res = new PluginResult(PluginResult.Status.OK, i.hasExtra(extraName)); callbackContext.sendPluginResult(res); return true; } else { PluginResult res = new PluginResult(PluginResult.Status.ERROR); callbackContext.sendPluginResult(res); return false; } } else if (action.equals("getUri")) { if (args.length() != 0) { PluginResult res = new PluginResult(PluginResult.Status.INVALID_ACTION); callbackContext.sendPluginResult(res); return false; } Intent i = ((DroidGap)this.cordova.getActivity()).getIntent(); String uri = i.getDataString(); callbackContext.success(uri); return true; } else if (action.equals("onNewIntent")) { if (args.length() != 0) { PluginResult res = new PluginResult(PluginResult.Status.INVALID_ACTION); callbackContext.sendPluginResult(res); return false; } this.onNewIntentCallback = callbackContext; PluginResult res = new PluginResult(PluginResult.Status.NO_RESULT); res.setKeepCallback(true); callbackContext.sendPluginResult(res); return true; } else if (action.equals("sendBroadcast")) { if (args.length() != 1) { PluginResult res = new PluginResult(PluginResult.Status.INVALID_ACTION); callbackContext.sendPluginResult(res); return false; } // Parse the arguments JSONObject obj = args.getJSONObject(0); JSONObject extras = obj.has("extras") ? obj.getJSONObject("extras") : null; Map<String, String> extrasMap = new HashMap<String, String>(); // Populate the extras if any exist if (extras != null) { JSONArray extraNames = extras.names(); for (int i = 0; i < extraNames.length(); i++) { String key = extraNames.getString(i); String value = extras.getString(key); extrasMap.put(key, value); } } sendBroadcast(obj.getString("action"), extrasMap); callbackContext.success(); return true; } PluginResult res = new PluginResult(PluginResult.Status.INVALID_ACTION); callbackContext.sendPluginResult(res); return false; } catch (JSONException e) { callbackContext.error(e.getMessage()); return false; } } @Override public void onNewIntent(Intent intent) { if (this.onNewIntentCallback != null) { this.onNewIntentCallback.success(intent.getDataString()); } } void startActivity(String action, Uri uri, String type, Map<String, String> extras) { Intent i = (uri != null ? new Intent(action, uri) : new Intent(action)); if (type != null && uri != null) { i.setDataAndType(uri, type); //Fix the crash problem with android 2.3.6 } else { if (type != null) { i.setType(type); } } for (String key : extras.keySet()) { String value = extras.get(key); // If type is text html, the extra text must sent as HTML if (key.equals(Intent.EXTRA_TEXT) && type.equals("text/html")) { i.putExtra(key, Html.fromHtml(value)); } else if (key.equals(Intent.EXTRA_STREAM)) { // allowes sharing of images as attachments. // value in this case should be a URI of a file i.putExtra(key, Uri.parse(value)); } else if (key.equals(Intent.EXTRA_EMAIL)) { // allows to add the email address of the receiver i.putExtra(Intent.EXTRA_EMAIL, new String[] { value }); } else { i.putExtra(key, value); } } ((DroidGap)this.cordova.getActivity()).startActivity(i); } void sendBroadcast(String action, Map<String, String> extras) { Intent intent = new Intent(); intent.setAction(action); for (String key : extras.keySet()) { String value = extras.get(key); intent.putExtra(key, value); } ((DroidGap)this.cordova.getActivity()).sendBroadcast(intent); } } 

Y el archivo html.

 <!DOCTYPE html> <html> <head> <title>Intent Test</title> <script type="text/javascript" charset="utf-8" src="cordova.js"></script> <script src="webintent.js"></script> <script type="text/javascript" charset="utf-8"> // Wait for device API libraries to load // function onLoad() { alert("onLoad"); document.addEventListener("deviceready", onDeviceReady, false); } // device APIs are available // function onDeviceReady() { alert("onDeviceReady"); window.plugins.webintent.getUri(function(url) { if(url !== "") { // url is the url the intent was launched with document.querySelector("#test").innerHTML = "URL was "+url; } }); } </script> </head> <body onload="onLoad()"> <h1>Test</h1> <div id="test"></div> </body> </html> 

Lo probé con este código y estoy recibiendo correctamente una URL. Si quieres te puedo enviar todo el proyecto (envíame un correo electrónico). Espero que esto ayude.

Actualización 3.0: https://github.com/Initsogar/cordova-webintent

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.