2014-09-21 7 views
0

Я пытаюсь получить контакт из списка контактов в моем приложении:Выбор контакта из списка контактов сбоя приложения

public void selecionar_contato(View view) { 
     Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); 
     startActivityForResult(intent, CONTACT_PICKER_RESULT); 
    } 

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

     if (resultCode == RESULT_OK) { 
      switch (requestCode) { 
      case CONTACT_PICKER_RESULT: 
       Uri dados = data.getData(); 
       Cursor c = getContentResolver().query(dados, new String[]{ 
         ContactsContract.CommonDataKinds.Phone.NUMBER, 
         ContactsContract.CommonDataKinds.Phone.TYPE }, null, null, null); 
       if(c.moveToFirst()){ 
        String num = c.getString(0); 
        int type = c.getInt(1); 
        mostarToast(type,num); 
       } 
       break; 
      } 

     } else { 
      // gracefully handle failure 
      Log.w("Erro", "Warning: ac"); 
     } 
    } 

    private void mostarToast(int type, String num) { 
     Toast.makeText(this, type + ": " + num, Toast.LENGTH_LONG).show(); 

    } 

Но когда я выберите контакт, мое приложение Авария:

09-21 17:44:40.897: E/AndroidRuntime(17432): FATAL EXCEPTION: main 
09-21 17:44:40.897: E/AndroidRuntime(17432): Process: com.example.pacixmobile, PID: 17432 
09-21 17:44:40.897: E/AndroidRuntime(17432): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1001, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/298i107/602 flg=0x1 }} to activity {com.example.pacixmobile/com.example.pacixmobile.CadastroActivity}: java.lang.IllegalArgumentException: Invalid column data1 
09-21 17:44:40.897: E/AndroidRuntime(17432): at android.app.ActivityThread.deliverResults(ActivityThread.java:3551) 

Я должен переписать метод onActivityResult правильно? Что мне не хватает?

ответ

0

Колонки, которые вы запрашиваете, непосредственно не доступны для Uri, которые вы используете. Вы выбрали контакт. Вы не выбрали номер телефона. Контакт может иметь нулевой, один или много телефонных номеров.

Учитывая, что Uri выбрано из ContactsContract.Contacts, вы можете получить столбцы available on ContactsContract.Contacts.

0

У меня это в одном действии, и он отлично работает, протестирован в телефонах и планшетах. Сначала я получаю выбранный contatct, а затем ее/ее номер телефона. Мне нужен номер мобильного телефона, если он существует, а также 9 цифр (испанский номер), удаляющий +34 или любой другой код страны.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) 
{ 
    // super.onActivityResult(requestCode, resultCode, intent); 

    if (requestCode != 0x10 || resultCode != RESULT_OK) 
    { 
     super.onActivityResult(requestCode, resultCode, intent); 
     return; 
    } 
    Cursor cursor = null; 
    Uri contactUri = intent.getData(); 
    long contactId = -1; 
    // get display name from the contact 
    try 
    { 
     cursor = getContentResolver().query(contactUri, 
        new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }, null, null, 
        null); 
     if (cursor.moveToFirst()) 
     { 
      String name = cursor.getString(1); 
      contactId = cursor.getLong(0); 
      etNombre.setText(name); 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     if (cursor != null) 
     { 
      cursor.close(); 
      cursor = null; 
     } 
    } 
    // do we have a valid contact ID? 
    if (contactId == -1) return; 

    // get all phone numbers with type from the contact 
    try 
    { 
     String tmpPhone = ""; 
     boolean itsDone = false, gotPhone = false; 
     cursor = getContentResolver().query(Phone.CONTENT_URI, new String[] { Phone.TYPE, Phone.NUMBER }, 
        Phone.CONTACT_ID + "=" + contactId, null, null); 
     // Pick up the first phone number 
     if (cursor.moveToFirst()) 
     { 
      tmpPhone = cursor.getString(1); 
      itsDone = cursor.getInt(0) == Phone.TYPE_MOBILE; 
      gotPhone = true; 
      // if Not a mobile, search others numbers 
      if (!itsDone) 
      { 
       while (cursor.moveToNext()) 
       { 
        if (cursor.getInt(0) == Phone.TYPE_MOBILE) 
        { 
         itsDone = true; 
         tmpPhone = cursor.getString(1); 
         break; 
        } 
       } 
      } 
     } 
     if (gotPhone) 
     { 
      int len = tmpPhone.length(); 
      if (len > 9) 
      { 
       tmpPhone = parsePhone(tmpPhone); 
       len = tmpPhone.length(); 
       if (len > 9) 
        tmpPhone = tmpPhone.substring(len - 9, len); 
      } 
      etTelefono.setText(tmpPhone); 
      etJornada.requestFocus(); 
     } 
     else etTelefono.requestFocus(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     if (cursor != null) 
     { 
      cursor.close(); 
     } 
    } 
} 

void cogerContactos() 
{ 
    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
    startActivityForResult(intent, 0x10); 
} 
Смежные вопросы