打开电话联系人列表,然后选择一个联系人



我使用此代码打开联系人列表,然后选择一个联系人显示在我的UI中。我可以打开我的联系人列表,但当我点击任何联系人时,程序就会崩溃。

etphone1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            // Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            // intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
            // startActivityForResult(intent, 1);
            Intent pb = new Intent(Intent.ACTION_PICK,
                    ContactsContract.Contacts.CONTENT_URI);
            startActivityForResult(pb, 1);
        }
    });

我的onActivityForResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
        if (resultCode == RESULT_OK) {
            Uri contactData = data.getData();
            Cursor cursor = managedQuery(contactData, null, null, null,
                    null);
            cursor.moveToFirst();
            String number = cursor
                    .getString(cursor
                            .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
            TextView tv;
            tv = (TextView) findViewById(R.id.tv);
            tv.setText(number);
        }
    }
}

LogCat:

12-11 11:05:48.969: E/AndroidRuntime(16292): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/0r10-272B2B434F414D37413143/10 flg=0x1 }} to activity {com.sriyank.locationmessenger/com.sriyank.locationmessenger.SecondPage}: java.lang.IllegalArgumentException: column 'data1' does not exist
12-11 11:05:48.969: E/AndroidRuntime(16292):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3209)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3252)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at android.app.ActivityThread.access$1200(ActivityThread.java:143)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1289)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at android.os.Looper.loop(Looper.java:137)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at android.app.ActivityThread.main(ActivityThread.java:4960)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at java.lang.reflect.Method.invokeNative(Native Method)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at java.lang.reflect.Method.invoke(Method.java:511)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at dalvik.system.NativeStart.main(Native Method)
12-11 11:05:48.969: E/AndroidRuntime(16292): Caused by: java.lang.IllegalArgumentException: column 'data1' does not exist
12-11 11:05:48.969: E/AndroidRuntime(16292):    at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:302)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:78)
12-11 11:05:48.969: E/AndroidRuntime(16292):    at com.sriyank.locationmessenger.SecondPage.onActivityResult(SecondPage.java:59)

下面的代码将3个文本视图设置为联系人姓名和电话号码。设置你的按钮点击监听器设定上述意图。

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
    switch (v.getId()) {
    case R.id.l1:
        startActivityForResult(intent, 1);
        break;
    case R.id.l2:
        startActivityForResult(intent, 2);
        break;
    case R.id.l3:
        startActivityForResult(intent, 3);
        break;
    }
}

这是活动结果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (data != null) {
        Uri uri = data.getData();
        if (uri != null) {
            Cursor c = null;
            try {
                c = getContentResolver()
                        .query(uri,
                                new String[] {
                                        ContactsContract.CommonDataKinds.Phone.NUMBER,
                                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME },
                                null, null, null);
                if (c != null && c.moveToFirst()) {
                    String number = c.getString(0);
                    String Name = c.getString(1);
                    if (requestCode == 1) {
                        tvname1.setText(Name);
                        tvphone1.setText(number);
                    } else if (requestCode == 2) {
                        tvname2.setText(Name);
                        tvphone2.setText(number);
                    } else if (requestCode == 3) {
                        tvname3.setText(Name);
                        tvphone3.setText(number);
                    }
                }
            } finally {
                if (c != null) {
                    c.close();
                }
            }
        }
    }
}

不要在onActivityResult中初始化您的视图,问题可能是因为您的Textview初始化。在onCreate()中声明它。从下面的方法中删除TextView初始化,并在onCreate()中对其进行初始化并进行检查。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
        if (resultCode == RESULT_OK) {
            Uri contactData = data.getData();
            Cursor cursor = managedQuery(contactData, null, null, null,
                    null);
            cursor.moveToFirst();
            String number = cursor
                    .getString(cursor
                            .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
            //TextView tv;
            //tv = (TextView) findViewById(R.id.tv); //remove this lines.
            tv.setText(number);
        }
    }
}

编辑:

尝试使用以下代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contact_picker);
    // this opens the activity. note the  Intent.ACTION_GET_CONTENT
    // and the intent.setType
  etphone1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // user BoD suggests using Intent.ACTION_PICK instead of .ACTION_GET_CONTENT to avoid the chooser
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            // BoD con't: CONTENT_TYPE instead of CONTENT_ITEM_TYPE
            intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
            startActivityForResult(intent, 1);                
        }
    });
}

现在,只要用户选择了一个联系人(可能选择了几个电话号码中的一个),你就可以用正常的方式检索数据:

@Override
protected 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, new String[]{ 
                            ContactsContract.CommonDataKinds.Phone.NUMBER,
                 ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME },
                        null, null, null);
                if (c != null && c.moveToFirst()) {
                    String number = c.getString(0);
                    String Name=c.getString(1);
                   Toast.makeText(this, number + Name, Toast.LENGTH_LONG).show();      
                }
            } finally {
                if (c != null) {
                    c.close();
                }
            }
        }
    }
}

最新更新