2011-05-27 68 views
5

我想要在用户从联系人选取器中选择联系人后获取联系人姓名和电话号码。我试图让我的应用程序适用于SDK v3,因此我创建了一个只会调用我需要的API的抽象类。我已经有了抽象类工作(它选择了正确的API),我也有SDK v3.4工作的API。我在使用ContactsContract工作的较新的API时遇到问题。从联系人选取器中获取号码

我可以得到一个联系人的名字,但是它检索到的号码总是联系人ID的号码!例如:我在联系人中添加了2个联系人“John Doe”和“Jane Doe”,各自的号码分别为“555-555-555”和“777-777-7777”。 John Doe的ID = 1,Jane Doe的ID = 2。如果我试图得到Jane Doe的电话号码,我会收到John的电话号码,555-555-5555。如果我试图得到约翰的,我什么也没得到。检查if(cursor.moveToNext())是否失败。

你能帮我解决这个问题吗?这让我疯狂。我看了很多很多的例子,总是得到同样的错误。

意图的数据是从onActivityResult


import java.util.ArrayList;

import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Email; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.Contacts;

class NewContactsAdapterBridge extends ContactsAdapterBridge {

ArrayList<String> info = new ArrayList<String>(); ArrayList<String> getInfo (Activity a, Intent data) { Uri contactData = data.getData(); Cursor cursor = a.managedQuery(contactData, null, null, null, null); if (cursor.moveToFirst()) { String id = cursor.getString( cursor.getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor.getColumnIndexOrThrow (ContactsContract.Contacts.DISPLAY_NAME)); String hasPhoneNumber = cursor.getString(cursor.getColumnIndexOrThrow( ContactsContract.Contacts.HAS_PHONE_NUMBER)); info.add(name); if (Integer.parseInt(hasPhoneNumber) > 0) { Uri myPhoneUri = Uri.withAppendedPath( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, id); Cursor pCur = a.managedQuery( myPhoneUri, null, null, null, null); if (pCur.moveToNext()) { String number = pCur.getString(pCur.getColumnIndex (ContactsContract.CommonDataKinds.Phone.NUMBER)); info.add(number); } } } return info; } }

回答

23
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     switch (requestCode) { 
     case CONTACT_PICKER_RESULT: 
      final EditText phoneInput = (EditText) findViewById(R.id.phoneNumberInput); 
      Cursor cursor = null; 
      String phoneNumber = ""; 
      List<String> allNumbers = new ArrayList<String>(); 
      int phoneIdx = 0; 
      try { 
       Uri result = data.getData(); 
       String id = result.getLastPathSegment(); 
       cursor = getContentResolver().query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + "=?", new String[] { id }, null); 
       phoneIdx = cursor.getColumnIndex(Phone.DATA); 
       if (cursor.moveToFirst()) { 
        while (cursor.isAfterLast() == false) { 
         phoneNumber = cursor.getString(phoneIdx); 
         allNumbers.add(phoneNumber); 
         cursor.moveToNext(); 
        } 
       } else { 
        //no results actions 
       } 
      } catch (Exception e) { 
       //error actions 
      } finally { 
       if (cursor != null) { 
        cursor.close(); 
       } 

       final CharSequence[] items = allNumbers.toArray(new String[allNumbers.size()]); 
       AlertDialog.Builder builder = new AlertDialog.Builder(your_class.this); 
       builder.setTitle("Choose a number"); 
       builder.setItems(items, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int item) { 
         String selectedNumber = items[item].toString(); 
         selectedNumber = selectedNumber.replace("-", ""); 
         phoneInput.setText(selectedNumber); 
        } 
       }); 
       AlertDialog alert = builder.create(); 
       if(allNumbers.size() > 1) { 
        alert.show(); 
       } else { 
        String selectedNumber = phoneNumber.toString(); 
        selectedNumber = selectedNumber.replace("-", ""); 
        phoneInput.setText(selectedNumber); 
       } 

       if (phoneNumber.length() == 0) { 
        //no numbers found actions 
       } 
      } 
      break; 
     } 
    } else { 
     //activity result error actions 
    } 
} 

你需要适应这与您的应用程序的工作数据意向

+0

非常感谢你。你的代码和我发现的其他代码都不一样,并且效果很好。此外,您的代码来选择哪个数字是非常有用的。 – user543010 2011-05-28 04:19:27

+0

工程就像一个魅力。我忘记添加READ_CONTACTS权限,因此一开始没有工作,但后来这是我发现的最好的选择。谢谢。 :) – buggydroid 2013-01-08 20:03:28

+0

什么是CONTACT_PICKER_RESULT?我无法做到。 – DuyguK 2013-01-29 14:12:42

4

我不力获得该行的情况下CONTACT_PICKER_RESULT ...的我在上面使用的代码

int PICK_CONTACT; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     b=(Button) findViewById(R.id.button1); 
     et=(EditText) findViewById(R.id.editText1); 
     b.setOnClickListener(this); 
     //et.setOnClickListener(this); 

      } 

@Override 
public void onClick(View v) { 
    switch(v.getId()) 
    { 
    case R.id.button1: 
     Intent intent = new Intent(Intent.ACTION_PICK); 
     intent.setType(ContactsContract.Contacts.CONTENT_TYPE); 
     startActivityForResult(intent, PICK_CONTACT); 

     break; 
    // case R.id.editText1: 



     // break; 

    } 
4
Intent intent = new Intent(Intent.ACTION_PICK); 
intent.setType(ContactsContract.Contacts.CONTENT_TYPE); 
startActivityForResult(intent, PICK_CONTACT); 

这些代码可以帮助你,我认为PICK活动只返回所选联系人的ID。您可以从中查询联系人提供商,如果有多个电话号码,请提示用户选择其中一个。

U可以用这个也

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
    switch (requestCode) { 
    case CONTACT_PICKER_RESULT: 
     final EditText phoneInput = (EditText) findViewById(R.id.phoneNumberInput); 
     Cursor cursor = null; 
     String phoneNumber = ""; 
     List<String> allNumbers = new ArrayList<String>(); 
     int phoneIdx = 0; 
     try { 
      Uri result = data.getData(); 
      String id = result.getLastPathSegment(); 
      cursor = getContentResolver().query(Phone.CONTENT_URI, null, Phone.CONTACT_ID + "=?", new String[] { id }, null); 
      phoneIdx = cursor.getColumnIndex(Phone.DATA); 
      if (cursor.moveToFirst()) { 
       while (cursor.isAfterLast() == false) { 
        phoneNumber = cursor.getString(phoneIdx); 
        allNumbers.add(phoneNumber); 
        cursor.moveToNext(); 
       } 
      } else { 
       //no results actions 
      } 
     } catch (Exception e) { 
      //error actions 
     } finally { 
      if (cursor != null) { 
       cursor.close(); 
      } 

      final CharSequence[] items = allNumbers.toArray(new String[allNumbers.size()]); 
      AlertDialog.Builder builder = new AlertDialog.Builder(your_class.this); 
      builder.setTitle("Choose a number"); 
      builder.setItems(items, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int item) { 
        String selectedNumber = items[item].toString(); 
        selectedNumber = selectedNumber.replace("-", ""); 
        phoneInput.setText(selectedNumber); 
       } 
      }); 
      AlertDialog alert = builder.create(); 
      if(allNumbers.size() > 1) { 
       alert.show(); 
      } else { 
       String selectedNumber = phoneNumber.toString(); 
       selectedNumber = selectedNumber.replace("-", ""); 
       phoneInput.setText(selectedNumber); 
      } 

      if (phoneNumber.length() == 0) { 
       //no numbers found actions 
      } 
     } 
     break; 
    } 
} else { 
    //activity result error actions 
} 
} 
+0

我在哪里必须把这个'findViewById(R.id.phoneNumberInput)'@Sathish你可以在onCreate()方法中的任何地方使用 – 2014-01-22 10:32:04

+0

。 – Sathish 2014-01-24 04:27:57

3

类笔记对于初学者来说,不要忘了,包括以下权限,否则它不会工作

<uses-permission android:name="android.permission.READ_CONTACTS"/>