2013-03-01 2 views
7

Моя цель состоит в том, чтобы показывать только контакты с номером телефона пользователю и позволять пользователю выбирать несколько контактов, которые я хочу сохранить локально.Отображение контактов только с телефонными номерами с использованием намерения ACTION_PICK в устройстве Android

Я использовал различные варианты вместо ContactsContract.Contacts.CONTENT_URI в методе ниже. Но я получаю много контактов (многие из них являются нежелательными только с идентификаторами электронной почты).

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.contact_selector); 

     ((Button)findViewById(R.id.btnphonecontactlist)).setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Intent contactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
      startActivityForResult(contactIntent, 1); 
       } 
      }); 
    } 

Если я передать ContactsContract.Contacts.CONTENT_URI в качестве параметра для метода выше, и в случае метода обработчика ниже, строка [] для метода запроса в качестве параметров проекции (которые показаны) комментировал, метод терпит неудачу с java.lang.IllegalArgumentException. Если я передаю значение null в методе ниже, то какой бы контакт я ни выбрал, я не нашел столбец, связанный с номером телефона или электронной почтой.

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 

     if(data != null) 
     { 
      Uri uri = data.getData(); 

      if(uri != null) 
      { 
       Cursor c = null; 

       try 
       { 
        c = getContentResolver().query(uri, null 
               // new String[] { 
          //ContactsContract.CommonDataKinds.Phone.NUMBER, 
          //ContactsContract.CommonDataKinds.Phone.TYPE}, 
          , null, null, null); 

        if(c != null && c.moveToFirst()) 
        { 
         String number = c.getString(0); 
         String type = c.getString(1); 
        }    
       } 
       finally 
       { 
        if(c != null && !c.isClosed()) 
         c.close(); 
       } 
      } 
     } 
    } 

Есть ли способ, чтобы отобразить только контакты видны пользователю, как правило, когда пользователь переходит к телефонной книге и которая имеет номера телефонов доступны?

Я попытался пройти через все потоки в stackoverflow и других сайтах, но не смог найти решения, которые разрешают проблему вокруг этого, хотя многие люди разместили эту проблему. Я не очень много работал с платформой Android, и я, возможно, пропустил некоторые мелкие детали, и я считаю, что для этого должен быть простой способ.

Просьба предложить. Ценю вашу помощь.

Спасибо.

+0

ли помог моим анс? –

ответ

18

Пожалуйста, используйте ниже код

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
    intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); 
    startActivityForResult(intent, 1); 
+0

good .. + 1 необходим для ваших усилий –

+0

Спасибо. Это сработало. Я просто подпрыгнул до кодирования, не прочитав многое из основ. Я использовал ContactsContract.Contacts.CONTENT_TYPE, но теперь вижу, что есть другие варианты и разница между ними. – Jit

+1

Хотя я не видел, чтобы информация по электронной почте возвращалась для контакта. Не существует ли какой-либо строковый параметр, который может содержать всю информацию, связанную с контактами, включая домашнюю, мобильную и электронную почту? – Jit

1

После кода будет делать то, что вы хотите.

Intent intent = new Intent(Intent.ACTION_PICK,ContactsContract.CommonDataKinds.Phone.CONTENT_URI); 
startActivityForResult(Intent.createChooser(intent, "Contact"), PICK_CONTACT); 
1
Uri uri = Uri.parse("content://contacts"); 
Intent intent = new Intent(Intent.ACTION_PICK, uri); 
intent.setType(Phone.CONTENT_TYPE); 
startActivityForResult(intent, REQUEST_CODE); 
0

Используйте это:

Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts/people")); 
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); 
startActivityForResult(intent, 1); 
2
*-> Add a permission to read contacts data to your application manifest. 

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

-> Use Intent.ACTION_PICK in your Activity 

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, 
       ContactsContract.CommonDataKinds.Phone.CONTENT_URI); 
     startActivityForResult(contactPickerIntent, RESULT_PICK_CONTACT); 

-> Then Override the onActivityResult() and retrieve the ID,Phone number and Name in the data. 

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     // check whether the result is ok 
     if (resultCode == RESULT_OK) { 
      // Check for the request code, we might be usign multiple startActivityForReslut 
      switch (requestCode) { 
      case RESULT_PICK_CONTACT: 
       Cursor cursor = null; 
     try { 
      String phoneNo = null ; 
      String name = null;   
      Uri uri = data.getData();    
      cursor = getContentResolver().query(uri, null, null, null, null); 
      cursor.moveToFirst();   
      int phoneIndex =cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); 
      phoneNo = cursor.getString(phoneIndex); 

      textView2.setText(phoneNo); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
       break; 
      } 
     } else { 
      Log.e("MainActivity", "Failed to pick contact"); 
     } 
    } 

This will work check it out*