从联系人列表崩溃应用程序中选择联系人

时间:2014-09-21 20:48:01

标签: java android

我试图通过我的应用程序中的联系人列表联系我们:

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方法吗?我错过了什么?

2 个答案:

答案 0 :(得分:0)

您请求的列不能直接用于您正在使用的Uri。你选择了一个联系人。您还没有选择电话号码。联系人可能有零个,一个或多个电话号码。

如果从Uri中选择了ContactsContract.Contacts,您可以检索列available on ContactsContract.Contacts

答案 1 :(得分: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);
}