2013-05-18 2 views
2

В моем приложении PhoneGap я пытаюсь запустить собственный контакт для контактов Android, чтобы я мог получить некоторые номера телефонов.Phonegap Android Contact Picker Plugin (обновление плагина)

Я исследовал онлайн и не мог найти много, пока я не увидел ContactView плагина: https://github.com/phonegap/phonegap-plugins/tree/master/Android/ContactView

Когда я установил плагин в соответствии с инструкциями, я столкнулся ошибки везде в файле ContactView.java. Похоже, что он использует очень старую версию структуры плагина с ctx и другими устаревшими командами (например, startActivityForResult).

Итак, я попытался преобразовать его в современный плагин, пройдя его по строкам, но я был слишком n00b и застрял около строки 40 (внутри функции startContactActivity). Это то, что я до сих пор:

package com.rearden; 

import org.apache.cordova.api.CallbackContext; 
import org.apache.cordova.api.CordovaPlugin; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

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

public class ContactView extends CordovaPlugin { 
    private static final String TAG = "PickContactPlugin"; 
    private static final int PICK_CONTACT = 1; 

    @Override 
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { 
     Log.d(TAG, "Inside ContactView plugin."); 

     JSONObject result = new JSONObject(); 

     if (action.equals("") || action.equals("ContactView")) { 
      return startContactActivity(); 
     } else { 
      Log.e(TAG, "Unknown action provided."); 
      result.put("error", "Unknown action provided."); 
      callbackContext.success(result); 
      return false; 
     } 
    } 

    public boolean startContactActivity() { 
     Intent intent = new Intent(Intent.ACTION_PICK); 
     intent.setType(ContactsContract.Contacts.CONTENT_TYPE); 
     //STUCK HERE 
     this.cordova.getActivity().startActivityForResult((Plugin) this, intent, PICK_CONTACT); 
    } 

    @Override 
    public void onActivityResult(int reqCode, int resultCode, Intent data) { 
     String name = null; 
     String number = null; 
     String email = null; 
     ContentResolver contentResolver = cordova.getActivity().getContentResolver(); 
     switch (reqCode) { 
     case (PICK_CONTACT): 
      if (resultCode == Activity.RESULT_OK) { 
       Uri contactData = data.getData(); 
       Cursor c = contentResolver.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 = contentResolver.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 = contentResolver.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(); 
        } 

        this.success(new PluginResult(PluginResult.Status.OK, 
          contactObject), this.callback); 
       } 
      } 
      break; 
     } 
    } 
} 

То, что я, кажется, не быть в состоянии сделать это, чтобы найти эквивалент для функции «this.ctx.startActivityForResult».

Я уже провел целый день на этом, и это начинает казаться чрезмерным, поэтому я обращаюсь к вам, ребята, за помощью. Может ли быть действительно трудно получить доступ к сборщику контактов?

+0

Здравствуйте, я нашел тот же плагин, и мне удалось заставить его работать с PhoneGap 2.7.0. Вы мамали, чтобы исправить вашу? Теперь я пытаюсь преобразовать его в phonegap3.0, и это дает мне хороший удар, см. Вопрос здесь http://stackoverflow.com/questions/18860177/phonegap-3-0-custom-plugin. Может быть, что-то там может помочь вам, если вы уже не разобрались –

ответ

1

эквивалент является this.ctx.getActivity(). GetContentResolver(). Запрос

Код ниже работает в Cordova 2.6.

package com.rearden; 

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.api.Plugin; 
import org.apache.cordova.api.PluginResult; 
import org.apache.cordova.api.PluginResult.Status; 

import android.util.Log; 

public class ContactViewPlugin extends Plugin { 
    private static final int PICK_CONTACT = 1; 
    private String callback; 

    @Override 
    public PluginResult execute(String action, JSONArray args, String callbackId) { 

     startContactActivity(); 
     PluginResult mPlugin = new PluginResult(PluginResult.Status.NO_RESULT); 
     mPlugin.setKeepCallback(true); 
     this.callback = callbackId; 
     return mPlugin; 
    } 

    public void startContactActivity() { 
     Intent intent = new Intent(Intent.ACTION_PICK); 
     intent.setType(ContactsContract.Contacts.CONTENT_TYPE); 
     this.ctx.startActivityForResult((Plugin) 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.ctx.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.ctx.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.ctx.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(); 
        } 

        this.success(new PluginResult(PluginResult.Status.OK, 
          contactObject), this.callback); 
       } 
      } 
      break; 
     } 
    } 
} 

Я также изменил файл JS.

var ContactViewPlugin = function() { 
}; 

ContactViewPlugin.prototype.show = function(successCallback, failureCallback) { 

    console.log('calling *** show'); 

    return cordova.exec(successCallback,  
      failureCallback, 
      'ContactViewPlugin', 
      'show', 
      []); 

}; 


if(!window.plugins) { 
    window.plugins = {}; 
} 
if (!window.plugins.contactViewPlugin) { 
    window.plugins.contactViewPlugin = new ContactViewPlugin(); 
} 

Не забудьте добавить плагин в список config.xml.

+0

Могу ли я найти какой-либо пример, где я могу увидеть весь код, который я новичок в телефонной запинке, и я хочу сделать то же самое – Uahmed

0

в Кордову 3.0.0 это работало для меня

this.cordova.startActivityForResult((CordovaPlugin) this, intent, PICK_CONTACT); 
Смежные вопросы