因为在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"/>

最新文章

  1. Android中 Bitmap和Drawable相互转换的方法
  2. DNS(二)之bind的视图功能
  3. 信息安全系统设计基础exp_2
  4. 开启mysql sql追踪
  5. Ubuntu 下一个可用的音乐播放器
  6. 利用ioctl()获取无线速率
  7. ca-bundle.crt to java truststore(e.g. trustStore.jks)
  8. 练习使用jquery.并将验证强度的功能加到注册页面中
  9. Lambda表达式的面纱(一)
  10. Android快速开发框架汇总
  11. 谷歌技术面试要点(Google面试)(14年5月20日交大专场)
  12. or1200中IMMU分析(续)
  13. jquery-scrollstop
  14. PyTorch官方中文文档:torch.Tensor
  15. POJ-3723 Conscription---最大权森林---最小生成树
  16. ArcGis——好好的属性表,咋就乱码了呢?
  17. SpringBoot启动如何加载application.yml配置文件
  18. 用ajax对数据进行删除和查看
  19. 最近因为突然喜欢这方面的ui设计,所以搜刮了很多我试过可用性强的界面,又可爱又实用&#183;&#183;&#183;分享给大家咯
  20. Javascript、Jquery获取浏览器和屏幕各种高度宽度(单位都为px)

热门文章

  1. css几个优先级测试和!important
  2. [LeetCode] 340. Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串
  3. ehcache和redis的区别及适用场景
  4. java注解简单使用
  5. PHP 23种设计模式
  6. springboot2.1.8使用poi导出数据生成excel(.xlsx)文件
  7. 01-打印Hello World、变量
  8. golang数组
  9. machine learning相关会议
  10. 协议——SPI