Getting photo and name from contacts in android

With my real code, I only get the contact number. But I want to get contact name and contact photo path . Tried a lot of googling codes, but I can't do it. Tried this one but got a FileNotFoundException . Can someone please help me achieve this by adding code snippets to the code below?

 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
source share
4 answers

This code moves all the contacts and gets their first name, last name and photo as a bitmap:

 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(); } 

You also need this permission: <uses-permission android:name="android.permission.READ_CONTACTS" />

Hope this helps!

+7
source

try the following:

the contact is identified by 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); } 

Using:

 Uri u = objItem.getPhotoUri(); if (u != null) { mPhotoView.setImageURI(u); } else { mPhotoView.setImageResource(R.drawable.ic_contact_picture_2); } 
+3
source

This is the method that is used to get the contact photo, number and name, but I get it from the fragment.

1 Set the resolution in the manifest.

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

2 Declare a constant:

 private static final int REQUEST_CODE_PICK_CONTACT = 1; 

3 In my application, the user must select a telephone contact by clicking on the button. So in the onClick () method, I do this:

 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 Add methods to retrieve the photo, name and number:

 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(); } } 

finally, in your onActivityForResult method do the following:

 @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(); } } 

What are these actions, look at Android: get contact details (ID, name, phone, photo) on Github

0
source

Source: https://habr.com/ru/post/1492544/


All Articles