android之读取联系人信息
联系人信息被存放在一个contacts2.db的数据库中

主要的两张表

读取联系人
读取联系人需要知道联系人内容提供者的地址,以及对应的操作对象。一般情况下操作对象是的命名方式和表明是一致的。
布局文件
在布局文件中定义一个button按钮来获取触发获取联系人信息的事件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"> <Button
android:text="获取联系人信息"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"/>
</LinearLayout>
Activity
在Activity中我们创建一个内容访问者来访问联系人应用下的数据(该数据由联系人应用的内容提供者提供)。内容提供者提供了对本地数据库访问的接口,由于联系人的信息由多个表存储,这里主要使用到了两个表。所以至少对数据库做两次查询。
package xidian.dy.com.chujia; import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View; public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
} public void click(View v){
ContentResolver cr = getContentResolver();
Cursor cursorId = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"contact_id"}, null, null, null);
if(cursorId != null){
while (cursorId.moveToNext()){
String id = cursorId.getString(0);
Cursor contact = cr.query(Uri.parse("content://com.android.contacts/data"),new String[]{"data1", "mimetype"},
"raw_contact_id=?", new String[]{id}, null);
if(contact != null){
while (contact.moveToNext()){
String name = contact.getString(0);
System.out.println(name);
}
contact.close();
}
} cursorId.close();
}
}
}
查询时先查联系人的ID,再通过联系人的ID查看联系人具体信息。
清单文件
在清单文件中需要开启访问联系人的权限。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xidian.dy.com.chujia">
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="主界面">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
插入联系人
在插入联系人时需要操作两张表,一张表是记录联系人ID的,一张表是记录联系人姓名以及联系方式的。
布局文件
布局文件中定义一个button组件来触发插入联系人
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"> <Button
android:text="插入联系人信息"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"/>
</LinearLayout>
Activity
在Activitty中先插入联系人ID,然后插入联系人信息
package xidian.dy.com.chujia; import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View; public class MainActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
} public void click(View v){
ContentResolver cr = getContentResolver();
ContentValues cv = new ContentValues();
Cursor cursorId = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"_id"}, null, null, null);
int contact_id = 1;
if(cursorId != null && cursorId.moveToLast()){
int _id = cursorId.getInt(0);
contact_id = ++ _id;
cursorId.close();
}
//在raw_contacts表中新建一个联系人ID
cv.put("contact_id", contact_id);
cr.insert(Uri.parse("content://com.android.contacts/raw_contacts"),cv);
//往data表中插入联系人姓名
cv.clear();
cv.put("data1", "王麻子");
cv.put("mimetype", "vnd.android.cursor.item/name");
cv.put("raw_contact_id", contact_id);
cr.insert(Uri.parse("content://com.android.contacts/data"),cv);
//往data表中插入联系方式
cv.clear();
cv.put("data1", "15993211441");
cv.put("mimetype", "vnd.android.cursor.item/phone_v2");
cv.put("raw_contact_id", contact_id);
cr.insert(Uri.parse("content://com.android.contacts/data"),cv);
}
}
清单文件
清单文件中需要获取写联系人权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xidian.dy.com.chujia">
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="主界面">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
android之读取联系人信息的更多相关文章
- 通过 ContentResolver 读取联系人信息
1.首先动态获取 读取联系人信息权限 <1>配置文件中声明对应权限 ) } ] == PackageManager.PERMISSION_GRANTED) { readContact ...
- 【实用篇】获取Android通讯录中联系人信息
第一步,在Main.xml布局文件中声明一个Button控件,布局文件代码如下: <LinearLayout xmlns:android="http://schemas.android ...
- Android_(控件)使用ListView显示Android系统中联系人信息
使用ListView显示手机中联系人的姓名和电话号码 父类布局activity_main.xml,子类布局line.xml(一个文件的单独存放) 运行截图: (避免泄露信息对部分地方进行了涂鸦O(∩_ ...
- iOS访问通讯录开发-读取联系人信息
读取通信录中的联系人一般的过程是先查找联系人记录,然后再访问记录的属性,属性又可以分为单值属性和多值属性.通过下面例子介绍联系人的查询,以及单值属性和多值属性的访问,还有读取联系人中的图片数据. 本案 ...
- Android 获取手机联系人信息
//获取联系人 Uri rawContacts = Uri.parse("content://com.android.contacts/raw_contacts"); Conten ...
- Android MediaMetadataRetriever 读取多媒体文件信息,元数据(MetaData)
音乐播放器通常需要获取歌曲的专辑.作者.标题.年代等信息,将这些信息显示到UI界面上. 1.一种方式:解析媒体文件 命名空间:android.media.MediaMetadataRetrieve ...
- Android项目——读取手机联系人信息
加入读取联系人信息的权限 <uses-permission android:name="android.permission.READ_CONTACTS"/> cont ...
- Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息01
1.系统联系人的数据库(3张最重要的表) (1)raw_contacts 联系人表 保存联系人的id contact_id (2)data 数据表 保存联系人的数据 ( ...
- Android(java)学习笔记193:ContentProvider使用之获得系统联系人信息01
1.系统联系人的数据库(3张最重要的表) (1)raw_contacts 联系人表 保存联系人的id contact_id (2)data 数据表 保存联系人的数据 ( ...
随机推荐
- 设计模式C#实现(十)——桥接模式
意图 0 适用性 1 结构 2 实现 3 效果 4 意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 适用性 1.不希望抽象和实现间有固定的绑定关系2.类的抽象以及它的实现都可以通过生成子 ...
- 高性能MySQL笔记 第6章 查询性能优化
6.1 为什么查询速度会慢 查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...
- PHP5.2至5.6的新增功能详解
截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注]. 因为 PHP ...
- PlaceHolder的两种实现方式
placeholder属性是HTML5 中为input添加的.在input上提供一个占位符,文字形式展示输入字段预期值的提示信息(hint),该字段会在输入为空时显示. 如 <input typ ...
- Linux设置环境变量小结:设置永久变量&临时变量 全局变量&局部变量
1.总结背景 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁 ...
- linux 下 mysql 安装(不用编译的方式)
环境是centos6.x.相信其他的也大同小异.相对来说这种方式我用的比较多. 一些环境依赖表库: yum install perl yum install libaio 1)下载:在mysql的网站 ...
- Java内存模型与垃圾回收
1.Java内存模型 Java虚拟机在执行程序时把它管理的内存分为若干数据区域,这些数据区域分布情况如下图所示: 程序计数器:一块较小内存区域,指向当前所执行的字节码.如果线程正在执行一个Java方法 ...
- NOIP2002字串变换[BFS]
题目描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2 ...
- ATM模拟程序
一个很简单的ATM模拟程序 #include <stdio.h> void chaxun(int a3){ int b; b=a3; printf("您的余额为:%d\n&quo ...
- AC日记——石头剪刀布 openjudge 1.6 08
08:石头剪刀布 总时间限制: 1000ms 内存限制: 65536kB 描述 石头剪刀布是常见的猜拳游戏.石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负. 一天,小A和小B正好在 ...