Получение фотографии и имени из контактов в android

С моим настоящим кодом я получаю только номер контакта. Но я хочу получить contact's name and contact's photo path . Пробовал много кодов по googling, но я не могу это сделать. Пробовал это тоже, но получил 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(); } } } } } } 

Этот код перемещает все контакты и получает их имя, фамилию и фотографию в виде растрового изображения:

 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" />

Надеюсь, это поможет!

попробуй это:

Контакт идентифицируется 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); } 

Проверьте эти ссылки

ContactsContract.Contacts.Photo

ContactsContract.CommonDataKinds.Photo

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

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: получить контактные данные (ID, имя, телефон, фотография) на Github