Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 获取联系人的照片_Android_Android Contentprovider_Android Contacts_Android Cursoradapter - Fatal编程技术网

Android 获取联系人的照片

Android 获取联系人的照片,android,android-contentprovider,android-contacts,android-cursoradapter,Android,Android Contentprovider,Android Contacts,Android Cursoradapter,我正在通过游标获取联系人。一切正常,但显示联系人照片不会返回任何内容。我没有遇到任何崩溃或错误。我的代码是 ContactListActivity.java Cursor cur= getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null,null); list.setAdapter(new contactAdapter(getApplicationC

我正在通过游标获取联系人。一切正常,但显示联系人照片不会返回任何内容。我没有遇到任何崩溃或错误。我的代码是

ContactListActivity.java

Cursor cur= getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null,null);
        list.setAdapter(new contactAdapter(getApplicationContext(), cur));
我自定义创建的游标适配器是

class contactAdapter extends CursorAdapter{

        String Name, phoneNumber;
        private Cursor cursor;
        private Context ccontext;
        private LayoutInflater inflater;

        public contactAdapter(Context context, Cursor c) {
            super(context, c);
            // TODO Auto-generated constructor stub
            cursor = c;
            ccontext = context;
            inflater = LayoutInflater.from(context);
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @SuppressLint("InlinedApi")
        @SuppressWarnings("deprecation")
        @Override
        public void bindView(View view, Context arg1, Cursor arg2) {
            // TODO Auto-generated method stub

            ViewHolder holder = (ViewHolder) view.getTag();
            if (holder == null) {
                holder = new ViewHolder();
                holder.contactsImage = (ImageView) view.findViewById(R.id.contact_image);
                holder.ContactName = (TextView) view.findViewById(R.id.contact_name);
                holder.contactCheck = (CheckBox) view.findViewById(R.id.contact_check);
                view.setTag(holder);
                holder.contactCheck.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        cb = (CheckBox) v;
                        cb.setChecked(cb.isChecked());
//                      ContactPerson selected = (ContactPerson)cb.getTag();
                        Log.d("selcted", cb.getTag().toString());
                        if(cb.isChecked()){

                            phoneID.add(cb.getTag().toString());


                        }
                    }

                }); 
            }else{
                holder = (ViewHolder) view.getTag();
            }
//          Uri uri = ContentUris.withAppendedId(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)));
//          Log.d("ImagePath", ContactsContract.CommonDataKinds.Phone.PHOTO_FILE_ID);
            if(cursor.getString(cursor.getColumnIndex("mimetype")).equals(ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)){
               byte[] photoByte = cursor.getBlob(cursor.getColumnIndex("data15"));

                if(photoByte != null) {
                    Bitmap bitmap = BitmapFactory.decodeByteArray(photoByte, 0, photoByte.length);

                    // Getting Caching directory
                    File cacheDirectory = getBaseContext().getCacheDir();

                    // Temporary file to store the contact image
                    File tmpFile = new File(cacheDirectory.getPath() + "/wpta_"+cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_ID))+".png");

                    // The FileOutputStream to the temporary file
                    try {
                        FileOutputStream fOutStream = new FileOutputStream(tmpFile);

                        // Writing the bitmap to the temporary file as png file
                        bitmap.compress(Bitmap.CompressFormat.PNG,100, fOutStream);

                        // Flush the FileOutputStream
                        fOutStream.flush();

                        //Close the FileOutputStream
                        fOutStream.close();
                        holder.contactsImage.setImageBitmap(bitmap);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                   String photoPath = tmpFile.getPath();
                   Log.d("photoPath", photoPath);
                }
            }
//          holder.contactsImage.setImageBitmap(bitmap);
            holder.ContactName.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
            holder.contactCheck.setTag(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)));
            holder.contactCheck.setChecked(false);

        }

        @Override
        public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
            return inflater.inflate(R.layout.checkbox_item, arg2, false);
        }

        @Override
        public View getView(int arg0, View arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
//          Log.d("don't know", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
            return super.getView(arg0, arg1, arg2);
        }

    }

谁能告诉我哪里出了问题,并指导我去拿照片吗。我搜索了所有地方并实现了代码。但是它们都没有产生所需的结果。

以下是您可以从联系人URI获取图像的代码

String image_uri    = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI));   
bitmap = MediaStore.Images.Media .getBitmap(this.getContentResolver(), Uri.parse(image_uri)); 
contactpic.setImageBitmap(bitmap) ;

尝试以下方法获取联系人姓名和联系人照片

private void retrieveContactPhoto() {

        Bitmap photo = null;

        try {
            InputStream inputStream = ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(),
                    ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, new Long(contactID)));

            if (inputStream != null) {
                photo = BitmapFactory.decodeStream(inputStream);
                ImageView imageView = (ImageView) findViewById(R.id.imageView1);
                imageView.setImageBitmap(photo);
            }

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

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

    }

    /**
     * super fast query to pull email addresses. It is much faster than pulling
     * all contact columns as suggested by other answers...
     * 
     * @return
     */
    public ArrayList<ContactVo> getNameEmailDetails() {
        ArrayList<ContactVo> m_arrList = new ArrayList<ContactVo>();
        ArrayList<String> emlRecs = new ArrayList<String>();
        HashSet<String> emlRecsHS = new HashSet<String>();
        ContentResolver cr = m_context.getContentResolver();
        String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts.PHOTO_ID,
                ContactsContract.CommonDataKinds.Email.DATA,
                ContactsContract.CommonDataKinds.Photo.CONTACT_ID };
        String order = "CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME
                + " NOT LIKE '%@%' THEN 1 ELSE 2 END, "
                + ContactsContract.Contacts.DISPLAY_NAME + ", "
                + ContactsContract.CommonDataKinds.Email.DATA
                + " COLLATE NOCASE";
        String filter = ContactsContract.CommonDataKinds.Email.DATA
                + " NOT LIKE ''";
        Cursor cur = cr.query(
                ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION,
                filter, null, order);
        ContactVo m_vo;
        if (cur.moveToFirst()) {
            do {
                m_vo = new ContactVo();
                // names comes in hand sometimes
                String name = cur.getString(1);
                String emlAddr = cur.getString(3);
                System.err.println("Value Is---------->" + cur.getString(2)
                        + "Name--" + name + "Email---" + emlAddr);
                m_vo.setM_sName(name);
                m_vo.setM_sEmail(emlAddr);
                // keep unique only
                if (emlRecsHS.add(emlAddr.toLowerCase())) {
                    emlRecs.add(emlAddr);
                }
                m_arrList.add(m_vo);
            } while (cur.moveToNext());
        }

        cur.close();
        return m_arrList;
    }
private void retrieveContactPhoto(){
位图照片=空;
试一试{
InputStream InputStream=ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(),
ContentUris.withAppendedId(contactscocontract.Contacts.CONTENT_URI,new Long(contactID));
如果(inputStream!=null){
photo=BitmapFactory.decodeStream(inputStream);
ImageView ImageView=(ImageView)findViewById(R.id.imageView1);
设置图像位图(照片);
}
断言inputStream!=null;
inputStream.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
/**
*超快速查询以提取电子邮件地址。它比拉要快得多
*其他答案建议的所有联系人栏。。。
* 
*@返回
*/
公共ArrayList getNameEmailDetails(){
ArrayList m_arrList=新的ArrayList();
ArrayList emlRecs=新的ArrayList();
HashSet emlRecsHS=新HashSet();
ContentResolver cr=m_context.getContentResolver();
字符串[]投影=新字符串[]{ContactsContract.RawContacts.\u ID,
Contacts contract.Contacts.DISPLAY\u NAME,
Contacts contract.Contacts.PHOTO_ID,
Contacts contract.CommonDataTypes.Email.DATA,
ContactsContract.CommonDataTypes.Photo.CONTACT_ID};
String order=“CASE WHEN”+Contacts contract.Contacts.DISPLAY\u NAME
+与“%@%”不同的是,1或2结束
+Contacts contract.Contacts.DISPLAY_NAME+“,”
+ContactsContract.CommonDataTypes.Email.DATA
+“整理NOCASE”;
字符串筛选器=ContactsContract.CommonDataTypes.Email.DATA
+“不像””;
游标cur=cr.query(
ContactsContract.CommonDataTypes.Email.CONTENT\u URI,投影,
过滤器,空,顺序);
联系人:m_vo;
if(cur.moveToFirst()){
做{
m_vo=新联系人vo();
//名字有时会随手而来
字符串名称=cur.getString(1);
字符串emlAddr=cur.getString(3);
System.err.println(“值为---------------->”+cur.getString(2)
+“姓名--”+Name+“电子邮件--”+emlAddr);
m_vo.setM_sName(姓名);
m_vo.setM_sEmail(emlAddr);
//保持唯一性
if(emlRecsHS.add(emlAddr.toLowerCase()){
emlRecs.add(emlAddr);
}
m_arrList.add(m_vo);
}while(cur.moveToNext());
}
cur.close();
返回m_arrList;
}
试试这段代码

private void getContactsDetails() {

        Cursor phones = getContentResolver().query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
                null, null);
        while (phones.moveToNext()) {
            String Name = phones
                    .getString(phones
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String Number = phones
                    .getString(phones
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

            String image_uri = phones
                    .getString(phones
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));

            System.out.println("Contact1 : " + Name + ", Number " + Number
                    + ", image_uri " + image_uri);


            if (image_uri != null) {
                 image.setImageURI(Uri.parse(image_uri));
                }


        }
它显示为“12-27 15:39:26.387:E/CursorWindow(21442):字段插槽0的错误请求,-1.numRows=100,numColumns=63”