【问题标题】:retrieving photo and name from contacts in android从android中的联系人中检索照片和姓名
【发布时间】:2013-07-21 05:55:51
【问题描述】:

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

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

【问题讨论】:

    标签: android contacts


    【解决方案1】:

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

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

    希望有帮助!

    【讨论】:

      【解决方案2】:

      试试这个:

      联系人由 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);
      }
      

      【讨论】:

        【解决方案3】:

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

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

        就是这样。关于活动,请查看 Github 上的 Android: Get Contact Details (ID, Name, Phone, Photo)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-27
          • 1970-01-01
          • 2012-10-11
          • 2013-09-16
          • 2011-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多