联系人的姓名和号码是保存在不同的表中,不要一下子把号码查询来,我开始就是把姓名和电话同时查询出来的,导致系统非常的慢
关键代码:
1, 使用javabean操作存储读取到的数据
package com.example.bean; /** * * @author Administrator 联系人的个人信息 */ public class OneUser { private String id; private String username; private String userphone; private String useremail; private String userbmp; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUserphone() { return userphone; } public void setUserphone(String userphone) { this.userphone = userphone; } public String getUseremail() { return useremail; } public void setUseremail(String useremail) { this.useremail = useremail; } public String getUserbmp() { return userbmp; } public void setUserbmp(String userbmp) { this.userbmp = userbmp; } }
2, 查询用户的id和姓名
// 参数一:uridate表示查询的数据uri projection是我们要查询的列; table是根据Uri确定的数据库表; // // selection使我们自己的查询条件; order是我们想要的排序方式。 // RawContacts.CONTENT_URI读取表的所有的姓名 Cursor cursor = fragmentActivity.getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, ContactsContract.Data.SORT_KEY_PRIMARY);// ContactsContract.Contacts.DISPLAY_NAME // +"ASC" while (cursor.moveToNext()) { OneUser user = new OneUser(); // 查询id和名字 user.setId(cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts._ID))); user.setUsername(cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); mItems.add(user);使用队列存放 } cursor.close();//关闭游标
3,用户点击时,查询点击的号码
@Override // 监听按下的当点击时,查询出用户的id public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(fragmentActivity, "position:" +"view:"+view+ position + "id:" + id, Toast.LENGTH_SHORT).show(); //根据队列中的存放的id查询用户的电话 OneUser oneUser=mItems.get(position); //获取联系人表中的提供者,根据id查询 Cursor phones = fragmentActivity.getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " =" + oneUser.getId(), null, null); // 指向phones的下一条数据 if(phones.moveToFirst()) { // 查询数据号码 userphone = phones .getString(phones .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); System.out.println("userphone:"+userphone); } phones.close();
4, 添加联系人 姓名,号码,邮箱
/** * * @author Administrator 添加联系人 */ public class AddActivity extends Activity { private EditText useremails; private EditText usernames; private EditText userphones; private ImageView userbmp; private String username; private String userphone; private String useremail; private ContentResolver resolver; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.addcontact); // 获得姓名 ,号码,邮箱,图片 usernames = (EditText) this.findViewById(R.id.username); userphones = (EditText) this.findViewById(R.id.userphone); useremails = (EditText) this.findViewById(R.id.useremail); userbmp = (ImageView) this.findViewById(R.id.bmp); try { //读取Assets文件下的资源图片,必须使用流进行读取 InputStream is = this.getResources().getAssets().open("img_1.jpg"); //根据读取的长度创建字节数据 byte[] data = new byte[is.available()]; //读取字节 is.read(data); // 获得bmp图片工厂 Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length); //设置如片 userbmp.setImageBitmap(bmp); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // Animation a = AnimationUtils.loadAnimation(this, R.anim.snap_bottom_in); // //从底端弹出动画 // Animation b = AnimationUtils.loadAnimation(this, // R.anim.snap_bottom_out);//从底端消失动画 // menu.startAnimation(a);//弹出菜单 // menu.startAnimation(b);//取消菜单 // 按钮监听器 public void click(View v) { switch (v.getId()) { case R.id.cancel:// 取消 finish();//关闭Activity this.overridePendingTransition(R.anim.activity_close, 0);//设置关闭动画 break; case R.id.confirm:// 确定 //读取姓名,号码,邮箱 username = usernames.getText().toString().trim(); userphone = userphones.getText().toString().trim(); useremail = useremails.getText().toString().trim(); // 获得内容提供者 resolver = this.getContentResolver(); // 通过Uri访问 // Uri uri = Uri.parse("content://com.MyContent.provider/user"); // 将数据封装成ContentValues对象 ContentValues values = new ContentValues(); // 使用内容提供者插入数据 // 参数一:内容提供者的路径 // 参数二:插入的数据 k:字段名 v:k键的数据 Uri rawContactsUri = resolver.insert(RawContacts.CONTENT_URI, values); // 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId // 这时后面插入data表的依据,只有执行空值插入,才能使插入的联系人在通讯录里面可见 // URI:RawContacts.CONTENT_URI Long contentId = ContentUris.parseId(rawContactsUri); // 插入姓名 DataInsert(contentId, values); break; } } // 插入姓名,电话,邮箱 的方法 public void DataInsert(Long contentId, ContentValues values) { // 通过得到的id 将姓名,电话,邮箱 插入到系统表中 // android.provider.ContactsContract.Data.CONTENT_URI // 姓名; values.clear(); // 参数一: 数据要插入的id 参数二:插入一个空的数据返回的id values.put(Data.RAW_CONTACT_ID, contentId); // 参数一:数据类型 参数二;数据类型的值 values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); // 参数一:名字 参数二;名字:名字 values.put(StructuredName.GIVEN_NAME, username); //插入姓名 Uri uri = resolver.insert(ContactsContract.Data.CONTENT_URI, values); if (uri != null) { Toast.makeText(this, "添加成功..", Toast.LENGTH_SHORT).show(); // 姓名插入成功就查电话号码; // 清除values的数据 values.clear(); // 联系人id values.put(Data.RAW_CONTACT_ID, contentId); // 数据类型 values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); // 电话号码 values.put(Phone.NUMBER, userphone); // 电话号码的类型 values.put(Phone.TYPE, Phone.TYPE_MOBILE); //插入号码 uri = resolver.insert(ContactsContract.Data.CONTENT_URI, values); if (uri != null) { if ("".equals(useremail)) { Toast.makeText(this, "添加成功..", Toast.LENGTH_SHORT).show(); finish(); this.overridePendingTransition(R.anim.activity_close, 0); } else { //清除 values.clear(); //联系人的id values.put(Data.RAW_CONTACT_ID, contentId); //数据类型是邮箱 values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE); //邮箱 values.put(Email.DATA,useremail ); //邮箱数据类型 values.put(Email.TYPE, Email.TYPE_WORK); //插入邮箱 uri=resolver.insert(ContactsContract.Data.CONTENT_URI, values); if(uri!=null){ Toast.makeText(this, "添加成功..", Toast.LENGTH_SHORT).show(); finish(); this.overridePendingTransition(R.anim.activity_close, 0); }else{ Toast.makeText(this, "添加失败..邮箱", Toast.LENGTH_SHORT).show(); } } } else { Toast.makeText(this, "添加失败..电话", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(this, "添加失败..姓名", Toast.LENGTH_SHORT).show(); } }
读取联系人的号码的步骤;先读取联系人的id和姓名,根据id读取号码,添加联系人 这些操作的前提是都要先获取内容提供者
读取id和号码是在Fargment中操作的需要使用Fragment获取Activity
// 在Fragment中使用ArrayAdapter适配器 必须得到Fragment的Activity
private FragmentActivity fragmentActivity; = getActivity();
//内容提供者
fragmentActivity.getContentResolver().query();
后面将介绍读取联系人的通话记录操作
相关推荐
主要介绍了Android获取手机通讯录、sim卡联系人及调用拨号界面方法,本文分别给出实现代码实现获取通讯录和sim卡的联系人,以及权限配置和调用系统拨打电话的界面的实现代码,需要的朋友可以参考下
基于android studio的联系人读取及电话拨打,参考了《第一行代码》的思路
解决添加联系人的表中添加数据以及读取已保存的数据 3. 实现通讯录的基本功能的具体实现。 4. 对通讯录界面的具体设计,给人一种方便的操作通道。 5. 灵活应用各种系统库函数实现完整的通讯录。 Android开发实验---...
本文实例讲述了Android编程实现读取手机联系人、拨号、发送短信及长按菜单操作方法。分享给大家供大家参考,具体如下: 1.Andrid项目结构图↓主要操作图中红色方框内的文件。 2.首先布局代码如下 a, main.xml 程序...
基于SQLite开发的简易通讯录 共两个页面:启动页+主页面 主页面实现增删改查、读取系统联系人、拨号等功能 非常非常非常简陋,所有功能都在主页面实现,没有封装类
一个简单的使用Android Studio写的获取通讯录内容并且打电话发短信,如果安装完后APP闪退,请到设置中权限将相应的权限给他。
本项目是一套用户体验做的很赞的安卓通讯录和短信项目源码 尤其是号码的拨打界面项目先是根据联系人的名字翻译出对应的汉语拼音名 在输入数字的时候根据数字和字母的两种方式进行联系人匹配 看一下下面的那张输入有...
读取本地通话记录详细信息并以聚合方式...联系人详情中显示联系人的信息,并可以拨号、发短息以及添加黑名单。 个人设置界面中可以编辑个人信息;查看当前个人信息;查看黑名单列表联系人,也可以移除黑名单中的联系人
6.3 群发拜年短信给联系人 309 6.4 开始与停止系统服务 312 6.5 通过短信发送e-mail通知 316 6.6 手机拨接状态 321 6.7 有来电,发送邮件通知 324 6.8 存储卡剩余多少容量 326 6.9 访问本机内存...
系统服务及研发的整合:网络搜索、联系人、音乐、应用程序、定制手机文件管理、记忆卡I/O存取、双向短信、闹钟服务、开机程序、来电通信互动、拜年短信、信息提醒、电池电量显示、进度显示、取得应用程序信息等。...
系统服务及研发的整合:网络搜索、联系人、音乐、应用程序、定制手机文件管理、记忆卡I/O存取、双向短信、闹钟服务、开机程序、来电通信互动、拜年短信、信息提醒、电池电量显示、进度显示、取得应用程序信息等。...
系统服务及研发的整合:网络搜索、联系人、音乐、应用程序、定制手机文件管理、记忆卡I/O存取、双向短信、闹钟服务、开机程序、来电通信互动、拜年短信、信息提醒、电池电量显示、进度显示、取得应用程序信息等。...
系统服务及研发的整合:网络搜索、联系人、音乐、应用程序、定制手机文件管理、记忆卡I/O存取、双向短信、闹钟服务、开机程序、来电通信互动、拜年短信、信息提醒、电池电量显示、进度显示、取得应用程序信息等。...
6.3 群发拜年短信给联系人 6.4 开始与停止系统服务 6.5 通过短信发送E-mail通知 6.6 手机拨接状态 6.7 有来电,发送邮件通知 6.8 存储卡剩余多少容量 6.9 访问本机内存与存储卡 6.10 实现可...
用Android studio自制的电话本Demo,功能都可以实现...展示详细的通话记录信息,包括通话时间,通话类型,通话人等,并读取通讯录中的联系人姓名,电话等信息。点击通讯录的联系人,会自动拨号,联系人按字母索引排列。