因为在Android中,存储系统联系人姓名和电话是存在与不同的ContentProvider中的,具体如何查找,可以从Android的源代码中查看,在android.providers包中列出了所有系统已经封装好的ContentProvider,譬如我们要查看联系人相关的,就去ContactsContract当中去寻找相关信息,要查看短信相关的,就去Telephony中寻找相关信息。

  

查找系统联系人

MainActivity.java

package cn.lixyz.readcontacts;

import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity { private Button button;
private static final Uri CONTACTS_URI = ContactsContract.Contacts.CONTENT_URI;
private static final Uri PHONE_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button);
button.setOnClickListener(new MyOnClickListener()); } class MyOnClickListener implements View.OnClickListener { @Override
public void onClick(View v) {
if (v.getId() == R.id.button) {
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(CONTACTS_URI, new String[] { "_id", "display_name" }, null, null, null);
if (cursor != null) {
List<String> phoneList = new ArrayList<String>();
cursor.moveToFirst();
do {
String name = cursor.getString(cursor.getColumnIndex("display_name"));
String id = cursor.getString(cursor.getColumnIndex("_id")); Cursor c = cr.query(PHONE_URI, new String[] { "data1" }, "name_raw_contact_id=?",
new String[] { id }, null);
c.moveToFirst();
do {
Log.d("TTTT", "姓名:" + name + ",电话=" + c.getString(c.getColumnIndex("data1")));
} while (c.moveToNext());
} while (cursor.moveToNext());
}
cursor.close(); } } }
}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="cn.lixyz.readsmstest.MainActivity" > <Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点我读取联系人" /> </LinearLayout>

在AndroidManifest.xml文件中添加读取联系人的权限

<uses-permission android:name="android.permission.READ_CONTACTS"/>

  运行结果:

  读取短信息:

MainActivity.java

package cn.lixyz.readsmstest;

import java.text.SimpleDateFormat;
import java.util.Date; import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Telephony.Sms;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; @SuppressLint("NewApi")
public class MainActivity extends Activity { private Button button; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
ContentResolver cr = getContentResolver();
Uri uri = Sms.CONTENT_URI;
Cursor cursor = cr.query(uri, new String[] { "date", "body" }, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String date = cursor.getString(cursor.getColumnIndex("date"));
String body = cursor.getString(cursor.getColumnIndex("body")); Date d = new Date(Long.valueOf(date));
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = dateFormat.format(d); Log.d("TTTT", "时间:" + dateStr + ",内容:" + body); }
}
cursor.close();
}
});
}
}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="cn.lixyz.readsmstest.MainActivity" > <Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点我读取短信" /> </LinearLayout>

在AndroidManifest.xml文件中添加读取短信的权限

<uses-permission android:name="android.permission.READ_SMS"/>

插入联系人:

MainActivity.java

package cn.lixyz.writecontacts;

import android.app.Activity;
import android.content.ContentUris;
import android.content.ContentValues;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity { private Button button;
public static final Uri CONTACTS_URI = ContactsContract.Contacts.CONTENT_URI;
public static final Uri Phone_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) { ContentValues values = new ContentValues();
// 首先向RawContacts.CONTENT_URI执行一个空值插入(raw_contacts 表),
// 为了获取生成的联系人 ID
Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);
// 然后获取系统返回的rawContactId , 就是新加入的这个联系人的 ID
long rawContactId = ContentUris.parseId(rawContactUri);
/*
* Andorid 中,将联系人的姓名、电话、分别存放在 data 表的同一个字段的两条记录当中 因此要 Insert 两次
*/
// 往data表入姓名数据
values.clear();
// raw_contacts_id 字段,是 raw_contacts表id 的外键,用于说明此记录属于哪一个联系人
values.put(Data.RAW_CONTACT_ID, rawContactId);
// mimitype_id 字段,用于描述此数据的类型,电话号码?Email?....
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); // 注意查看第二个参数的常量值
values.put(StructuredName.GIVEN_NAME, "肆肆肆"); // 这个名字真好听
getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
// 往data表入电话数据
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, "444444444");
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
}
});
}
}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="cn.lixyz.writecontacts.MainActivity" > <Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> </RelativeLayout>

在AndroidManifest.xml中添加写入联系人的权限

<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

Android笔记(五十五) Android四大组件之一——ContentProvider,使用系统提供的ContentProvider的更多相关文章

  1. Android笔记(十五) Android中的基本组件——单选框和复选框

    单选框和多选框通常用来在设置用户个人资料时候,选择性别.爱好等,不需要用户直接输入,直接在备选选项中选择,简单方便. 直接看代码: <?xml version="1.0" e ...

  2. Android笔记(七十五) Android中的图片压缩

    这几天在做图记的时候遇第一次遇到了OOM,好激动~~ 追究原因,是因为在ListView中加载的图片太大造成的,因为我使用的都是手机相机直接拍摄的照片,图片都比较大,所以在加载的时候会出现内存溢出,那 ...

  3. Android笔记(六十五) android中的动画——属性动画(propertyanimation)

    补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(prope ...

  4. Android笔记二十四.Android基于回调的事件处理机制

        假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...

  5. Android笔记(六十六) android中的动画——XML文件定义属性动画

    除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在 ...

  6. Android笔记(十) Android中的布局——表格布局

    TableLayout运行我们使用表格的方式来排列控件,它的本质依然是线性布局.表格布局采用行.列的形式来管理控件,TableLayout并不需要明确的声明包含多少行多少列,而是通过添加TableRo ...

  7. Android笔记(六十四) android中的动画——补间动画(tweened animation)

    补间动画就是只需要定义动画开始和结束的位置,动画中间的变化由系统去补齐. 补间动画由一下四种方式: 1.AplhaAnimation——透明度动画效果 2.ScaleAnimation ——缩放动画效 ...

  8. Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...

  9. [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...

  10. Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例

    前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...

随机推荐

  1. UI Automator 介绍

    简介 Android 4.3发布的时候包含了一种新的测试工具–uiautomator,uiautomator是用来做UI测试的.也就是普通的手工测试,点击每个控件元素 看看输出的结果是否符合预期.比如 ...

  2. sshpass命令使用

    1.直接远程连接某主机 sshpass -p {密码} ssh {用户名}@{主机IP} 2.远程连接指定ssh的端口 sshpass -p {密码} ssh -p ${端口} {用户名}@{主机IP ...

  3. python:对list去重

    1.set()方法 numbers = [1,7,3,2,5,6,2,3,4,1,5] new_numbers = list(set(numbers)) print new_numbers 输出 [1 ...

  4. OpenSSL 创建自签名证书

    1.生成服务器私钥 openssl genrsa -out client.key 4096   2.生成证书签名请求(CSR) openssl req -new -key client.key -ou ...

  5. XML解析详解|乐字节

    大家好,乐字节的小乐又来了,Java技术分享哪里少的了小乐!上次我们说了可扩展标记语言XML之二:XML语言格式规范.文档组成,本文将介绍重点——XML解析.   基本的解析方式有两种:一种叫 SAX ...

  6. 小程序常用操作,if,for,跳转,弹出提示

    if <block wx:if="{{result.child_items}}"> ... </block> <block wx:else> . ...

  7. [转帖]Linux 下软链接和硬链接的区别

    Linux 下软链接和硬链接的区别 http://os.51cto.com/art/201911/605267.htm 软连接 文件是小的 只是一个链接 删除和其他处理不影响 原始文件的计数 删除源文 ...

  8. redis连接相关命令

    命令名称:echo 语法:echo message 功能: 打印一个特定的信息message,测试时使用. 返回值: message自身 命令名称:ping 语法:ping 功能: 使用客户端向red ...

  9. STL之 stack的基础应用

    头文件 #include<stack> stack<int>  s; stack<char> s;//定义一个名字为s 的存int char的stack 基本指令 ...

  10. .net语音播放,自定义播报文字

    // using System.Speech.Synthesis; SpeechSynthesizer synth = new SpeechSynthesizer(); // Configure th ...