2013-09-17 2 views
0

Я собрал плагин для приложения несколько месяцев назад с помощью phonegap 2.7, и он отлично работал. Плагин в основном открывает телефонную книгу пользователей и возвращает в мое приложение информацию о контакте, который пользователь выбирает.Phonegap 3.0 Пользовательский плагин

Я недавно обновился до Phonegap 3.0, и я пытаюсь преобразовать свой плагин в 3.0; Однако я не могу получить плагин теперь работает, что это все 3,0 .... вот что у меня есть

ContactView.java

Src \ ком \ huronasolutions \ Plugins \ 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 \ Android \ 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): Uncaught TypeError: Cannot call method 'show' of undefined at file:///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 не определен.

Может кто-то помочь, я думаю, что следил за каждым руководством, которое я могу найти в Интернете. Благодаря

ответ

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> 
+0

Вы МУЖЧИНА !!!!!!! !!!!! Спасибо миллион, это сработало, как сон. Итак, не существует ли какой-либо ярлыка для этого, как назначить cordova.require («com.huronasolutions.plugins.ContactView») переменной изнутри плагина? –

+0

Прохладный, рад, что он сработал :-) Вы должны иметь возможность сократить его, так как cordova.require() возвращает экземпляр объекта, то есть 'window.contactView = cordova.require (« com.huronasolutions.plugins.ContactView »); window.contactView.show (...); ' – DaveAlden

+0

Могу ли я сделать это изнутри плагина? Если да, где бы вы порекомендовали. –

Смежные вопросы