2013-04-08 4 views
0

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

Intent ContactPickerIntent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI); 
      ContactPickerIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); 
      startActivityForResult(ContactPickerIntent, CONTACT_PICKER_RESULT); 

он работает отлично на эмуляторе, но не на устройстве. какие изменения я должен сделать, чтобы заставить его работать на устройстве.

вот моя onactivityresult функция

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) 
    { 
     switch (requestCode) 
     { 
     case CONTACT_PICKER_RESULT: 
      Cursor cursor=null; 
      try 
      { 
       Uri result = data.getData(); 
       Log.v(DEBUG_TAG, "Got a contact result: " + result.toString()); 

       // get the contact id from the Uri  
       String id = result.getLastPathSegment(); 

       // query for everything contact number 
       cursor = getContentResolver().query( 
         Phone.CONTENT_URI, null, 
         Phone.CONTACT_ID + "=?", 
         new String[]{id}, null); 

       cursor.moveToFirst(); 
       int phoneIdx = cursor.getColumnIndex(Phone.NUMBER); 
       if (cursor.moveToFirst()) 
       { 
        phonenofromcontact = cursor.getString(phoneIdx); 
        finallistofnumberstosendmsg +=","+phonenofromcontact; 
        Log.v(DEBUG_TAG, "Got phone no : " + phonenofromcontact); 
       } 
       else 
       {         
        Log.w(DEBUG_TAG, "No results"); 
       } 
      } 
      catch(Exception e) 
      { 
       Log.e(DEBUG_TAG, "Failed to get contact number", e); 
      } 
      finally 
      { 
       if (cursor != null) 
       { 
        cursor.close(); 
       } 
      } 
      phonePhoneno= (EditText)findViewById(R.id.phonenofromcontact); 
      phonePhoneno.setText(finallistofnumberstosendmsg); 
      //phonePhoneno.setText(phonenofromcontact); 
      if(phonenofromcontact.length()==0) 
      { 
       Toast.makeText(this, "No contact number found for this contact", 
         Toast.LENGTH_LONG).show(); 
      } 
      break; 
     } 
    } 
    else 
    { 
     Log.w(DEBUG_TAG, "Warning: activity result not ok"); 
    } 
} 
+0

Каким образом это не работает? Это рушится? Или нет контактов? Больше информации, пожалуйста! – ccbunney

+0

не возвращается номер контакта. должен ли я предоставлять код функции activityresult, чтобы сделать его более понятным? – sid

+0

Вы также можете показать свою функцию onActivityResult. – ccbunney

ответ

2

Вы фильтрование свое намерение с помощью:

ContactPickerIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); 

который рассказывает Поставщик контактов возвращает только контактную информацию, содержащую тип содержимого телефона.

Поэтому ID возвращаемый Контакты поставщика является _ID из ContactsContract.Data стола - не CONTACT_ID

Попробуйте изменить курсор запрос к этому:

// query for everything contact number 
cursor = getContentResolver().query( 
       Phone.CONTENT_URI, null, 
       Phone._ID + "=?", 
       new String[]{id}, null); 

Это должно вернуть вам выбранное число контактов ,

Как и в сторону, запрос данных, которые вы изначально написали бы работал, если бы вы не называли ContactPickerIntent.setType на Intent (, если вы сделали выше изменения - то вам все равно нужно назвать это)

Вероятно, он работал на вашем эмуляторе удачей - я предполагаю, что, возможно, у вас есть один контакт с одним номером телефона на вашем эмуляторе? Вполне вероятно, что как CONTACT_ID, так и _ID таблицы данных являются равными 1, что по совпадению вернет правильную строку.

+0

не работает одно и то же сообщение «контактный номер не найден для этого контакта» это означает phonenofromcontact.length() == 0, как написано там в коде. – sid

+1

Вы уверены? Это исправление работало для меня, когда я вставлял ваш код в Activity. Что вы попробовали: изменили CONTACT_ID на _ID или удалили setType? Постскриптум НЕ ДЕЛАЙТЕ ОБА! – ccbunney

+0

спасибо, что он работает. – sid

0

Вам нужно добавить разрешение android.permission.READ_CONTACTS к вашему AndroidManifest.xml.

+0

Я уже принял это разрешение. как я уже упоминал, он работает над эмулятором. – sid

0

нужно разрешение на андроид файл манифеста:

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

И это мой рабочий код:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/")); 
startActivity(intent); 
+0

У него есть это разрешение, так как он работает над эмулятором. – ccbunney

+0

@kaidul islam sazal он работает, но наше требование - это нечто иное. Я хочу прочитать номер контакта и добавить в edittext в своем приложении. – sid

0

Просто измените

// query for everything contact number 
       cursor = getContentResolver().query( 
         Phone.CONTENT_URI, null, 
         Phone.CONTACT_ID + "=?", 
         new String[]{id}, null); 

в

// query for everything contact number 
       cursor = getContentResolver().query( 
         Phone.CONTENT_URI, null, 
         Phone._ID + "=?", 
         new String[]{id}, null); 
Смежные вопросы