6

使用我现在的代码,我只得到联系电话。但我想得到contact's name and contact's photo path. 通过谷歌搜索尝试了许多代码,但我无法完成。也试过这个,但得到了FileNotFoundException。有人可以通过在下面的代码中添加代码片段来帮助我实现这一目标吗?

public void getContact(View view)
{

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

}

protected void onActivityResult(int requestCode, int resultCode,Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);

             if(resultCode==RESULT_OK && requestCode == 1)
        {
            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.TYPE },
                                null, null, null);

                        if (c != null && c.moveToFirst()) {
                            String phoneNumber = c.getString(0);
                            int type = c.getInt(1);      
                        }
                    } finally {
                        if (c != null) {
                            c.close();
                        }
                    }
                }
            }
        }
         }
4

3 回答 3

11

此代码遍历所有联系人并将他们的名字、姓氏和照片作为位图获取:

Cursor cursor = App
            .getInstance()
            .getContentResolver()
            .query(ContactsContract.Contacts.CONTENT_URI, null, null, null,
                    null);

    if (cursor != null && cursor.getCount() > 0) {
        while (cursor.moveToNext()) {
            long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts._ID));

            // get firstName & lastName
            Cursor nameCur = App.getInstance().getContentResolver()
                    .query(ContactsContract.Data.CONTENT_URI,
                            null,
                            ContactsContract.Data.MIMETYPE
                                    + " = ? AND "
                                    + StructuredName.CONTACT_ID
                                    + " = ?",
                            new String[] {
                                    StructuredName.CONTENT_ITEM_TYPE,
                                    Long.valueOf(id).toString() }, null);
            if (nameCur != null) {
                if (nameCur.moveToFirst()) {

                    String displayName = nameCur.getString(nameCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    if (displayName == null) displayName = "";

                    String firstName  = nameCur.getString(nameCur.getColumnIndex(StructuredName.GIVEN_NAME));
                    if (firstName == null) firstName = "";
                    Log.d("--> ", firstName.length()>0?firstName:displayName);

                    String middleName = nameCur.getString(nameCur.getColumnIndex(StructuredName.MIDDLE_NAME));
                    if (middleName == null) middleName = "";

                    String lastName = nameCur.getString(nameCur.getColumnIndex(StructuredName.FAMILY_NAME));
                    if (lastName == null) lastName = "";

                    lastName = middleName + (middleName.length()>0?" ":"") + lastName;

                    Log.d("--> ", lastName);
                }
                nameCur.close();
            }

            Bitmap photo = null;

            try {
                InputStream inputStream = ContactsContract.Contacts.openContactPhotoInputStream(App.getContext().getContentResolver(),
                        ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(id)));

                if (inputStream != null) {
                    photo = BitmapFactory.decodeStream(inputStream);
                }

                if (inputStream != null) inputStream.close();

            } catch (IOException e) {
                e.printStackTrace();
            }

            Log.d("--> ", photo);
        }
    }

    if (cursor != null) { cursor.close(); }

您还需要此权限:<uses-permission android:name="android.permission.READ_CONTACTS" />

希望有帮助!

于 2013-07-29T10:12:24.490 回答
4

尝试这个:

联系人由 getId() 标识

/**
 * @return the photo URI
 */
public Uri getPhotoUri() {
    try {
        Cursor cur = this.ctx.getContentResolver().query(
                ContactsContract.Data.CONTENT_URI,
                null,
                ContactsContract.Data.CONTACT_ID + "=" + this.getId() + " AND "
                        + ContactsContract.Data.MIMETYPE + "='"
                        + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'", null,
                null);
        if (cur != null) {
            if (!cur.moveToFirst()) {
                return null; // no photo
            }
        } else {
            return null; // error in cursor process
        }
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
    Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long
            .parseLong(getId()));
    return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
}

用法是:

Uri u = objItem.getPhotoUri();
if (u != null) {
        mPhotoView.setImageURI(u);
} else {
        mPhotoView.setImageResource(R.drawable.ic_contact_picture_2);
}
于 2013-08-03T05:05:11.037 回答
0

这是我用来获取联系人照片、号码和姓名的方法,但我是从片段中获取的。

1在清单中设置权限。

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

2声明一个常数:

private static final int REQUEST_CODE_PICK_CONTACT = 1;

3在我的应用程序中,用户需要通过单击按钮来选择电话联系人。所以在 onClick() 方法中我这样做:

contactChooserButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivityForResult(new Intent(Intent.ACTION_PICK,
          ContactsContract.Contacts.CONTENT_URI), REQUEST_CODE_PICK_CONTACT);

        }
    });

4添加检索照片、姓名和号码的方法:

private String retrieveContactNumber() {

    String contactNumber = null;

    // getting contacts ID
    Cursor cursorID = getActivity().getContentResolver().query(uriContact,
            new String[]{ContactsContract.Contacts._ID},
            null, null, null);

    if (cursorID.moveToFirst()) {

        contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
    }

    cursorID.close();

    Log.e(TAG, "Contact ID: " + contactID);

    // Using the contact ID now we will get contact phone number
    Cursor cursorPhone = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},

            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " +
                    ContactsContract.CommonDataKinds.Phone.TYPE + " = " +
                    ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,

            new String[]{contactID},
            null);

    if (cursorPhone.moveToFirst()) {
        contactNumber = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        phoneNumber = contactNumber;
    }

    cursorPhone.close();

    Log.e(TAG, "Contact Phone Number: " + contactNumber);
    return contactNumber;

}

 //Retrieve name
 private void retrieveContactName() {

    String contactName = null;

    // querying contact data store
    Cursor cursor = getActivity().getContentResolver().query(uriContact, null, null, null, null);

    if (cursor.moveToFirst()) {

        // DISPLAY_NAME = The display name for the contact.
        // HAS_PHONE_NUMBER =   An indicator of whether this contact has at least one phone number.

        contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        personName = contactName;
    }

    cursor.close();

    Log.e(TAG, "Contact Name: " + contactName);

}

//Retrieve photo (this method gets a large photo, for thumbnail follow the link below)
public void retrieveContactPhoto() {

    Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactID));
    Uri displayPhotoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.DISPLAY_PHOTO);
    try {
        AssetFileDescriptor fd =
                getActivity().getContentResolver().openAssetFileDescriptor(displayPhotoUri, "r");
        photoAsBitmap = BitmapFactory.decodeStream(fd.createInputStream());

    } catch (IOException e) {
        e.printStackTrace();
    }
}

最后,在您的 onActivityForResult 方法中,执行以下操作:

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

        if(requestCode == REQUEST_CODE_PICK_CONTACT && resultCode == Activity.RESULT_OK) {
            Log.e(TAG, "Response: " + data.toString());
            uriContact = data.getData();
            personPhoneTextField.setText(retrieveContactNumber()); 
//the method retrieveContactNumber returns the contact number, 
//so am displaying this number in my EditText after getting it.
//Make your other methods return data of 
//their respective types (Bitmap for photo)

  retrieveContactPhoto();
  retrieveContactName();


        }
    } catch (Exception exception) {
        exception.printStackTrace();

    }
}

就是这样。对于活动,看看这个Android:在 Github 上获取联系人详细信息(ID、姓名、电话、照片)

于 2015-07-04T21:14:26.557 回答