Phonegap 3.0自定义插件

时间:2013-09-17 21:26:05

标签: javascript android cordova phonegap-plugins cordova-3

几个月前我用一个带有phonegap 2.7的应用程序的插件组合在一起,它运行得很好。该插件基本上打开了用户电话簿,并将用户选择的联系人详细信息返回给我的应用程序。

我最近升级到Phonegap 3.0,我正在尝试将我的插件转换为3.0;但是我现在无法让插件工作,因为它只是3.0 ....这就是我所拥有的

ContactView.java

SRC \ COM \ huronasolutions \插件\ ContactView.java

package com.huronasolutions.plugins;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.PluginResult;
import org.apache.cordova.CordovaPlugin;

public class ContactView extends CordovaPlugin {
    private static final int PICK_CONTACT = 1;
    private CallbackContext callback;

    @Override
    public boolean execute(String action, JSONArray args, final CallbackContext callbackContext) throws JSONException {
        if (action.equals("getContact")) {

            this.callback = callbackContext;
            cordova.getActivity().runOnUiThread(new Runnable() {
                        public void run() {
                    startContactActivity();
                    PluginResult mPlugin = new PluginResult(PluginResult.Status.NO_RESULT);
                    mPlugin.setKeepCallback(true);
                    callbackContext.sendPluginResult(mPlugin);
                    }
            });
            return true;
        }
        return false;
    }

    public void startContactActivity() {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
        this.cordova.startActivityForResult((CordovaPlugin) this, intent,
                PICK_CONTACT);

    }

    @Override
    public void onActivityResult(int reqCode, int resultCode, Intent data) {
        String name = null;
        String number = null;
        String email = null;
        switch (reqCode) {
        case (PICK_CONTACT):
            if (resultCode == Activity.RESULT_OK) {
                Uri contactData = data.getData();
                Cursor c = this.cordova.getActivity().getContentResolver()
                        .query(contactData, null, null, null, null);
                if (c.moveToFirst()) {
                    String ContactID = c.getString(c
                            .getColumnIndex(ContactsContract.Contacts._ID));
                    String hasPhone = c
                            .getString(c
                                    .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

                    if (Integer.parseInt(hasPhone) == 1) {
                        Cursor phoneCursor = this.cordova
                                .getActivity()
                                .getContentResolver()
                                .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                        null,
                                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                                + "='" + ContactID + "'", null,
                                        null);
                        while (phoneCursor.moveToNext()) {
                            number = phoneCursor
                                    .getString(phoneCursor
                                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        }
                    }
                    // get email address
                    Cursor emailCur = this.cordova
                            .getActivity()
                            .getContentResolver()
                            .query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                                    null,
                                    ContactsContract.CommonDataKinds.Email.CONTACT_ID
                                            + "='" + ContactID + "'", null,
                                    null);
                    while (emailCur.moveToNext()) {
                        // This would allow you get several email addresses
                        // if the email addresses were stored in an array
                        email = emailCur
                                .getString(emailCur
                                        .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                        // String emailType = emailCur.getString(
                        // emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
                    }
                    emailCur.close();

                    name = c.getString(c
                            .getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
                    JSONObject contactObject = new JSONObject();
                    try {
                        contactObject.put("name", name);
                        contactObject.put("phone", number);
                        contactObject.put("email", email);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                    callback.success(contactObject);
                }
            }
            break;
        }
    }
}

ContactView.js

\资产\ WWW \ JS \机器人\ ContactView.js

cordova.define("com.huronasolutions.plugins.ContactView", function (require, exports, module) {
    var exec = require("cordova/exec");

    var contactView = {
        show: function (successCallback, failCallback) {

            function success(args) {
                if (typeof successCallback === 'function')
                    successCallback(args);
            }

            function fail(args) {
                if (typeof failCallback === 'function')
                    failCallback(args);
            }

            return exec(
                function (args) { success(args); },
                function (args) { fail(args); },
                'ContactView',
                'getContact',
                []);
        }
    }
    module.exports = contactView;

});

我在index.html文件的头部有以下内容

<script type="text/javascript" src="js/android/ContactView.js"></script>

当我在我的代码中调用它时

window.contactView.show(
               function (contact) {
                   success({ "contact": contact, "msg": "success" });
               },
               function (fail) {
                   fail({ "msg": "We were unable to get the contact you selected." });
               }
           );

我在LogCat中收到以下错误

  

* 09-17 22:09:24.285:E / Web Console(1679):未捕获的TypeError:无法调用未定义的方法'show'   文件:///android_asset/www/js/txt2.js:477 *

当我这样称呼它时

 contactView.show(
                   function (contact) {
                       success({ "contact": contact, "msg": "success" });
                   },
                   function (fail) {
                       fail({ "msg": "We were unable to get the contact you selected." });
                   }
               );

LogCat表示contactView未定义。

有人可以提供帮助,我想我已经按照我在网上找到的每个指南。 感谢

1 个答案:

答案 0 :(得分:2)

像这样调用你的插件:

cordova.require("com.huronasolutions.plugins.ContactView").show(
 function (contact) {
   success({ "contact": contact, "msg": "success" });
 },
 function (fail) {
   fail({ "msg": "We were unable to get the contact you selected." });
 }
);

还要确保在config.xml中定义了插件:

<feature name="contactView">
      <param name="android-package" value="com.huronasolutions.plugins.ContactView"/
</feature>