在Stack OVerflow社区的帮助下,我现在已经成功设置了我的
Android应用程序,这样当点击电子邮件中的链接时,它就会直接打开我的应用程序.换句话说,我有我的< intent-filter>在我的AndroidManifest.xml中正确配置.
到目前为止一切都很好,但还有最后一步,我仍然在努力,这是让我的Phonegap构建的应用程序拿起并使用我从电子邮件中的URL传递给它的变量.
- <a target="_blank" href="https://mysite.com/confirmation.html?verification=XXXXXXXXX&username=larry">Complete verification with MYAPP</a>
点击该链接可打开我的应用.确切地说,当单击它时,会弹出一个对话框,询问用户是否要使用浏览器或我的应用程序打开,这很酷.
无论如何,重点是,如果他们使用我的应用程序打开我的应用程序,它将打开默认的欢迎屏幕.但是,所需的行为是应用程序打开特定页面,confirm.html,并且有两个字段填充了URL,验证和用户名中的变量.
如何让我的Phonegap应用程序在正确的页面上启动并使用URL中的变量?
重要提示:我真的很想强调,这是绝对清楚的,这是一个Phonegap构建,这意味着该应用程序使用HTML和Javascript,而不是原生的Android代码.谢谢你的理解.
解决方法
如果您正在使用WebIntent(我假设您这样做了吗?),您可以这样做:
- window.plugins.webintent.getUri(function(url) {
- if(url !== "") {
- // url is the url the intent was launched with
- document.querySelector("#tag").innerHTML = "URL = " + url;
- }
- });
编辑:
好的,所以我设法让插件在PhoneGap 2.9.0上运行.
但是我必须澄清一些事情.
首先,您说某些方法已被弃用,但弃用并不意味着这些方法不起作用.在github上列出的(旧)插件工作正常,但我确实设法让它与CordovaPlugin一起工作.
- /**
- * 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,fail) {
- return cordova.exec(function(args) {
- success(args);
- },'hasExtra',[params]);
- };
- WebIntent.prototype.getUri = function(success,fail) {
- return cordova.exec(function(args) {
- success(args);
- },'getUri',[]);
- };
- WebIntent.prototype.getExtra = function(params,'getExtra',[params]);
- };
- WebIntent.prototype.onNewIntent = function(callback) {
- return cordova.exec(function(args) {
- callback(args);
- },function(args) {
- },'onNewIntent',[]);
- };
- WebIntent.prototype.sendBroadcast = function(params,'sendBroadcast',[params]);
- };
- window.webintent = new WebIntent();
- // backwards compatibility
- window.plugins = window.plugins || {};
- window.plugins.webintent = window.webintent;
- })(window.PhoneGap || window.Cordova || window.cordova);
在WebIntent.java中,我将一个变量更改为私有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,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,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);
- }
- }
和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>