热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何通过联系人api在android中设置照片-Howtosetaphotoinandroidviathecontactsapi

imnewtodevelopingandroidappsandImcurrentlytryingtodothefollowing:Searchallcontacts

i'm new to developing android apps and I'm currently trying to do the following: Search all contacts' notes for a certain string (say: "E-Plus") and, if found, place a certain icon (say the E-Plus logo) as their contact photo.

我是开发Android应用程序的新手,我正在尝试执行以下操作:搜索所有联系人的笔记以查找某个字符串(例如:“E-Plus”),如果找到,则放置一个特定的图标(例如E -Plus logo)作为他们的联系人照片。

I got it working using eclipse and the following test AVD: Platform: Android 2.3.3 API Level: 10 CPU/ABI: ARM (armeabi)

我使用eclipse和以下测试AVD工作:平台:Android 2.3.3 API级别:10 CPU / ABI:ARM(armeabi)

Now, when i copy the *.apk file generated from eclipse to my Samsung Galaxy S2, the app only works partly. I added a line to display a toast after searching all contacts, that tells me how many contacts have been found with the specific string. This number is correct, when i execute the app on my actual Galaxy S2.

现在,当我将从eclipse生成的* .apk文件复制到我的三星Galaxy S2时,该应用程序只能部分工作。我在搜索所有联系人后添加了一行显示祝酒词,告诉我在特定字符串中找到了多少联系人。当我在我的实际Galaxy S2上执行应用程序时,这个数字是正确的。

But in contrary to the testing environment, the app doesnt set the photo afterwards. The app also doesn't crash. Then i thought, setting a photo might be too difficult as a first approach, so i also tried adding a phone number - same result. The phone number is added correctly in the testing environment, but not on my actual phone.

但与测试环境相反,应用程序之后不会设置照片。该应用程序也不会崩溃。然后我想,设置一张照片作为第一种方法可能太难了,所以我也尝试添加一个电话号码 - 相同的结果。电话号码在测试环境中正确添加,但不在我的实际手机上。

I tried both a google contact on my phone and a normal phonebook entry contact to have the certain note in its details. Both were found correctly by the app (that is note was read and string was found) but neither of them had the photo or phone number set after running the app.

我尝试了手机上的谷歌联系人和普通的电话簿入口联系人,以便在其详细信息中加入特定说明。两者都被应用程序正确找到(即已读取注释并找到字符串),但在运行应用程序后,他们都没有设置照片或电话号码。

Here is what i do:

这是我做的:

The following code should load all contacts and save their id and note. Note that ContactInfo is just a simple class with variables to hold the contactId etc. (String contactId, String note, Byte[] Photo) and according get and set methods.

以下代码应加载所有联系人并保存其ID和注释。请注意,ContactInfo只是一个简单的类,其中包含用于保存contactId等的变量(String contactId,String note,Byte [] Photo)以及get和set方法。

public ArrayList loadAllContacts(ContentResolver cr) {
    ArrayList cOntactList= new ArrayList();

        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {
                String cOntactId= cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                ContactInfo cOntactInfo= new ContactInfo(contactId);

                // Get Note
                    String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
                    String[] whereParams = new String[]{contactId,ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE}; 
                            Cursor noteCur = cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParams, null); 
                    if (noteCur.moveToFirst()) { 
                        String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
                        contactInfo.setNote(note);
                    } 
                    noteCur.close();                        

                contactList.add(contactInfo);                   
            }
        }

    return contactList;
}

The following code should update all contacts setting a photo (and for further testing, a phone number). The setPhoto method I got from the following blog: Handling Contact Photos and because it worked perfectly in the testing AVD I thought that theres probably no error in it.

以下代码应更新设置照片的所有联系人(以及进一步测试,电话号码)。我从以下博客获得的setPhoto方法:处理联系人照片,因为它在测试AVD中完美运行,我认为它可能没有错误。

public void updateAllContacts(ContentResolver cr, ArrayList contactList) {
    while (!contactList.isEmpty()) {
        ContactInfo cOntact= contactList.remove(0);
        String cOntactId= contact.getContactId();

        setPhoto(cr,contact.getPhoto(),contactId);
        setPhoneNumber(cr,contact.getPhoneNumber(),contactId);
    }

}

public void setPhoneNumber(ContentResolver cr, String phoneNumber, String contactId) {
    ContentValues values = new ContentValues();

    values.put(ContactsContract.Data.RAW_CONTACT_ID, contactId);
    values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
    values.put(ContactsContract.CommonDataKinds.Phone.NUMBER,phoneNumber);
    values.put(ContactsContract.CommonDataKinds.Phone.TYPE, Phone.TYPE_CUSTOM);

    cr.insert(ContactsContract.Data.CONTENT_URI, values);
}

public void setPhoto(ContentResolver cr, byte[] bytes, String contactId) {      
    ContentValues values = new ContentValues();
    int photoRow = -1;
    String where = ContactsContract.Data.RAW_CONTACT_ID + " = " + contactId + " AND " + ContactsContract.Data.MIMETYPE + "=='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'";
    Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI, null, where, null, null);
    int idIdx = cursor.getColumnIndexOrThrow(ContactsContract.Data._ID);
    if (cursor.moveToFirst()) {
        photoRow = cursor.getInt(idIdx);
    }
    cursor.close();

    values.put(ContactsContract.Data.RAW_CONTACT_ID, contactId);
    values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
    values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes);
    values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);

    if (photoRow >= 0) {
        cr.update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data._ID + " = " + photoRow, null);
    } else {
        cr.insert(ContactsContract.Data.CONTENT_URI, values);
    }
}

The following routine I use to get the byte array from the *.png in the res folder of my app.

我使用以下例程从我的应用程序的res文件夹中的* .png获取字节数组。

public static byte[] getByteArrayFromResource(Resources rsrc,int id) {
    Bitmap bmp = BitmapFactory.decodeResource(rsrc,id);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] bytes = stream.toByteArray();

    return bytes;
}

Finally, what I execute in my main routine, is:

最后,我在主程序中执行的是:

ArrayList cOntactList= new ArrayList();
ContactsAccessor cOntactsAccessor= new ContactsAccessor();
cOntactList= contactsAccessor.loadAllContacts(getContentResolver());

int test = 0;
for (int i=0; i0) Toast.makeText(WelchesNetzIcons.this,"Es wurden "+test+" Icons gesetzt.", Toast.LENGTH_SHORT).show();
 else Toast.makeText(WelchesNetzIcons.this, "Es wurden keine Icons gesetzt.", Toast.LENGTH_SHORT).show();

I geatly appreciate any suggestions on what I might be doing wrong here. Also, I tried to be as precise as I could, but if you are interested in or need any further information, please don't hesitate to ask.

我非常感谢任何有关我在这里做错的建议。此外,我尽可能精确,但如果您感兴趣或需要任何进一步的信息,请不要犹豫。

Thank you very much for your effort in helping me.

非常感谢你帮助我的努力。

Best regards, Niklas

最好的问候,尼克拉斯

1 个解决方案

#1


1  

Try to use this code. It works for me.

尝试使用此代码。这个对我有用。

Your problem may be in wrong contact id or in wrong mimetype

您的问题可能是错误的联系人ID或错误的mimetype

//looking for contact

//寻找联系方式

String select = String.format("%s=? AND %s='%s'", Phone.NUMBER, Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
String[] project = new String[] { Data.RAW_CONTACT_ID };
Cursor c = context.getContentResolver().query(Data.CONTENT_URI, project, select, new String[] { contact.getPhone() }, null);

if(c.moveToFirst()){
  rawCOntactId= c.getLong(c.getColumnIndex(Data.RAW_CONTACT_ID));
}

//set photo
Bitmap bit = //your photo
ByteArrayOutputStream streamy = new ByteArrayOutputStream(); 
bit.compress(CompressFormat.PNG, 0, streamy); 
byte[] photo = streamy.toByteArray();

ContentValues values = new ContentValues(); 

values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); 
values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1); 
values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, photo); 
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); 

ContactHelper.context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);

推荐阅读
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
author-avatar
绿茶2602921445
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有