Phonegap webintent

时间:2012-07-10 05:05:11

标签: cordova

我必须在phonegap中使用webintent为android发送电子邮件。我在以下代码中收到错误。我不明白如何在index.html文件中调用脚本中的函数。我得到了json异常。可以帮助任何帮助我解决这个问题?

WebIntent.java

  public class WebIntent extends Plugin {

        private String onNewIntentCallback = null;
        private static final String TAG = "Webintent";


        public PluginResult execute(String action, JSONArray args, String callbackId) {
            Log.d(TAG, "WebintentPlugin Called");
            try {

                  System.out.println("JSON11"+args);
                if (action.equals("startActivity")) {
                    if (args.length() != 1) {
                        return new PluginResult(PluginResult.Status.INVALID_ACTION);
                    }


                    // 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);
                    return new PluginResult(PluginResult.Status.OK);

                } else if (action.equals("hasExtra")) {
                    if (args.length() != 1) {
                        return new PluginResult(PluginResult.Status.INVALID_ACTION);
                    }
                    Intent i = ((DroidGap) this.ctx).getIntent();
                    String extraName = args.getString(0);
                    return new PluginResult(PluginResult.Status.OK, i.hasExtra(extraName));

                } else if (action.equals("getExtra")) {
                    if (args.length() != 1) {
                        return new PluginResult(PluginResult.Status.INVALID_ACTION);
                    }
                    Intent i = ((DroidGap) this.ctx).getIntent();
                    String extraName = args.getString(0);
                    if (i.hasExtra(extraName)) {
                        return new PluginResult(PluginResult.Status.OK, i.getStringExtra(extraName));
                    } else {
                        return new PluginResult(PluginResult.Status.ERROR);
                    }
                } else if (action.equals("getUri")) {
                    if (args.length() != 0) {
                        return new PluginResult(PluginResult.Status.INVALID_ACTION);
                    }

                    Intent i = ((DroidGap) this.ctx).getIntent();
                    String uri = i.getDataString();
                    return new PluginResult(PluginResult.Status.OK, uri);
                } else if (action.equals("onNewIntent")) {
                    if (args.length() != 0) {
                        return new PluginResult(PluginResult.Status.INVALID_ACTION);
                    }

                    this.onNewIntentCallback = callbackId;
                    PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
                    result.setKeepCallback(true);
                    return result;
                } else if (action.equals("sendBroadcast")) 
                {
                    if (args.length() != 1) {
                        return new PluginResult(PluginResult.Status.INVALID_ACTION);
                    }

                    // Parse the arguments
                    JSONObject obj = args.getJSONObject(0);
                    System.out.println("JSON"+obj);
                    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);
                    return new PluginResult(PluginResult.Status.OK);
                }
                return new PluginResult(PluginResult.Status.INVALID_ACTION);
            } catch (JSONException e) {
                e.printStackTrace();
                return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
            }
        }

        @Override
        public void onNewIntent(Intent intent) {
            if (this.onNewIntentCallback != null) {
                PluginResult result = new PluginResult(PluginResult.Status.OK, intent.getDataString());
                result.setKeepCallback(true);
                this.success(result, this.onNewIntentCallback);
            }
        }

        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[] {"myemail.com"});
                } else {
                    i.putExtra(key, value);
                }
            }
            this.ctx.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.ctx).sendBroadcast(intent);
        }
    }
webintent.js

    var WebIntent = function() { 

    };

    WebIntent.ACTION_SEND = "android.intent.action.SEND";
    WebIntent.ACTION_VIEW= "android.intent.action.VIEW";
    WebIntent.EXTRA_TEXT = "android.intent.extra.TEXT";
    WebIntent.EXTRA_SUBJECT = "android.intent.extra.SUBJECT";
    WebIntent.EXTRA_STREAM = "android.intent.extra.STREAM";
    WebIntent.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]);
    };



    cordova.addConstructor(function() {
        cordova.addPlugin('WebIntent', new WebIntent());
    });

index.html

<html>
  <head>
    <meta name="viewport" content="target-densitydpi=low-dpi; user-scalable=no" />
    <title>PhoneGap Events Example</title>
    <script type="text/javascript" charset="utf-8" src="cordova-1.8.0.js"></script> 
     <script type="text/javascript" charset="utf-8" src="webintent.js"></script>

      <script type="text/javascript" charset="utf-8">


         function onBodyLoad()
         {
         document.addEventListener("deviceready",onDeviceReady,false);
        }

   function onDeviceReady() {    
       window.plugins.WebIntent.startActivity('WebIntent', success, fail);

        }
        function success(e) {


        console.log("Success");
        }

        function fail(f) {
             console.log("Failure");
        }





    </script>
  </head>
  <body onload="onBodyLoad();">
    <h2>IMEI v1.5</h2>
    IMEI: <span id="imei"></span><br/>

  </body>
</html>


My error is-

07-10 10:23:12.180: W/System.err(536): org.json.JSONException: Value WebIntent at 0 of type java.lang.String cannot be converted to JSONObject
07-10 10:23:12.200: W/System.err(536):  at org.json.JSON.typeMismatch(JSON.java:100)
07-10 10:23:12.200: W/System.err(536):  at org.json.JSONArray.getJSONObject(JSONArray.java:484)
07-10 10:23:12.230: W/System.err(536):  at com.gsr.imei.WebIntent.execute(WebIntent.java:48)
07-10 10:23:12.240: W/System.err(536):  at org.apache.cordova.api.PluginManager$1.run(PluginManager.java:186)
07-10 10:23:12.240: W/System.err(536):  at java.lang.Thread.run(Thread.java:856)


can anyone help me??Thanks for any help..

2 个答案:

答案 0 :(得分:1)

window.plugins.WebIntent.startActivity('WebIntent', success, fail);

应该是这样的地图对象:

window.plugins.WebIntent.startActivity({url: 'url here', type: 'type', extras: {}}, success, fail);

修改

使用此功能调用意图

function sendEmail(to, subject, body) { 
          var extras = {};
          extras[WebIntent.EXTRA_SUBJECT] = subject;
          extras[WebIntent.EXTRA_TEXT] = body;
          window.plugins.webintent.startActivity({
              url: to,
              action: WebIntent.ACTION_SEND,
              type: 'text/plain', 
              extras: extras 
            }, 
            function() {
                alert("mail sent");
            }, 
            function() {
              alert('Failed to send email via Android Intent');
            }
          ); 
    }

它会打开包含所有已发送参数的邮件发送对话框。

答案 1 :(得分:0)

您是否在项目中包含了json.js文件? 请检查,我也遇到了同样的问题,并在包含json.js文件后得到解决。