Android 查询 添加 修改 删除通讯录联系人示例

时间:2023-02-02 13:18:48

1.AndroidManifest.xml中添加权限

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

2.布局

<?xml version="1.0" encoding="utf-8"?>
<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="com.example.lj.chapter9.MainActivity"> <EditText
android:id="@+id/contactNameTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:ems="10"
android:inputType="textPersonName"
android:text="姓名" /> <EditText
android:id="@+id/phoneNumberTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="phone"
android:text="号码"
android:layout_below="@+id/contactNameTxt"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" /> <TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Button Below to Run a Query"
android:textSize="17dip"
android:layout_below="@+id/phoneNumberTxt"
android:layout_alignRight="@+id/addButton"
android:layout_alignEnd="@+id/addButton"
android:layout_marginTop="34dp" /> <Button
android:id="@+id/queryButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click to Query Contacts Database"
android:layout_below="@+id/phoneNumberTxt"
android:layout_centerHorizontal="true"
android:layout_marginTop="88dp" /> <Button
android:id="@+id/addButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/queryButton"
android:layout_alignStart="@+id/queryButton"
android:layout_below="@+id/queryButton"
android:layout_marginTop="35dp"
android:text="Click to Add Contacts Database" />
<Button
android:id="@+id/updateButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/queryButton"
android:layout_alignStart="@+id/queryButton"
android:layout_below="@+id/addButton"
android:layout_marginTop="35dp"
android:text="Click to Update Contacts Database" /> <Button
android:id="@+id/deleteButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/queryButton"
android:layout_alignStart="@+id/queryButton"
android:layout_below="@+id/updateButton"
android:layout_marginTop="35dp"
android:text="Click to Delete Contacts Database" />
</RelativeLayout>

Android  查询  添加 修改 删除通讯录联系人示例

3.Activity活动

package com.example.lj.chapter9;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
private static final String TAG = "AndroidTest"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button queryBtn = (Button) findViewById(R.id.queryButton);
queryBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
queryContactPhoneNumber();
}
}); Button addBtn = (Button) findViewById(R.id.addButton);
addBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addContactPhoneNumber(getEditValue(R.id.contactNameTxt), getEditValue(R.id.phoneNumberTxt));
}
}); Button updateBtn = (Button) findViewById(R.id.updateButton);
updateBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateContactPhoneNumber(getEditValue(R.id.contactNameTxt), getEditValue(R.id.phoneNumberTxt));
}
}); Button deleteBtn = (Button) findViewById(R.id.deleteButton);
deleteBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
deleteContactPhoneNumber(getEditValue(R.id.contactNameTxt));
}
});
} private String getEditValue(@IdRes int id) {
EditText txt = (EditText) findViewById(id);
return txt.getText().toString();
} private void deleteContactPhoneNumber(String contactName) {
//根据姓名求id
Uri uri = ContactsContract.RawContacts.CONTENT_URI;
ContentResolver resolver = getContentResolver();
String where = ContactsContract.PhoneLookup.DISPLAY_NAME;
Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data._ID}, where + "=?", new String[]{contactName}, null);
if (cursor.moveToFirst()) {
int id = cursor.getInt(0);
//根据id删除data中的相应数据
resolver.delete(uri, where + "=?", new String[]{contactName});
uri = ContactsContract.Data.CONTENT_URI;
resolver.delete(uri, ContactsContract.Data.RAW_CONTACT_ID + "=?", new String[]{id + ""});
}
Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show();
} private void updateContactPhoneNumber(String contactName, String phoneNumber) {
Uri uri = ContactsContract.Data.CONTENT_URI;//对data表的所有数据操作
ContentResolver resolver = getContentResolver();
ContentValues values = new ContentValues();
values.put(ContactsContract.Data.DATA1, phoneNumber);
int result = resolver.update(uri, values, ContactsContract.Data.MIMETYPE + "=? and " + ContactsContract.PhoneLookup.DISPLAY_NAME + "=?",
new String[]{ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, contactName});
if (result > 0) {
Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show();
}
} private void addContactPhoneNumber(String contactName, String phoneNumber) {
ContentValues values = new ContentValues();
Uri uri = getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values);
long contact_id = ContentUris.parseId(uri); //插入data表
uri = ContactsContract.Data.CONTENT_URI;
String raw_contact_id = ContactsContract.Data.RAW_CONTACT_ID;
String data2 = ContactsContract.Data.DATA2;
String data1 = ContactsContract.Data.DATA1;
//add Name
values.put(raw_contact_id, contact_id);
values.put(ContactsContract.CommonDataKinds.Phone.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
values.put(data2, contactName);
values.put(data1, contactName);
getContentResolver().insert(uri, values);
values.clear();
//add Phone
values.put(raw_contact_id, contact_id);
values.put(ContactsContract.CommonDataKinds.Phone.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
values.put(data2, phoneNumber); //手机
values.put(data1, phoneNumber);
getContentResolver().insert(uri, values);
values.clear();
Toast.makeText(this, "添加新的联系人:" + contactName + " " + phoneNumber, Toast.LENGTH_SHORT).show();
} private void queryContactPhoneNumber() {
String[] cols = {ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
cols, null, null, null);
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToPosition(i);
// 取得联系人名字
int nameFieldColumnIndex = cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME);
int numberFieldColumnIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
String name = cursor.getString(nameFieldColumnIndex);
String number = cursor.getString(numberFieldColumnIndex);
Toast.makeText(this, name + " " + number, Toast.LENGTH_SHORT).show();
}
}
}

该活动主要是根据http://www.cnblogs.com/liaojie970/p/5744580.html这篇博客改编而来,将里面如:

Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");

方式改为了
uri = ContactsContract.Data.CONTENT_URI;

其基本思路是一样的

Android 查询 添加 修改 删除通讯录联系人示例的更多相关文章

  1. oracle JOB 查询 添加 修改 删除

    -------------查询JOB----------------- select job, what, next_date, next_sec, sysdate, failures, broken ...

  2. JavaWeb&lowbar;day03&lowbar;员工信息添加修改删除

    day03员工的添加,修改,删除 修改功能 思路 : 点击修改员工数据之后,跳转到单行文本,查询要修改的员工id的全部信息,主键id设置为readonly,其余的都可以修改, 修改之后,提交按钮,提交 ...

  3. Web 1三级联动 下拉框 2添加修改删除 弹框

    Web  三级联动 下拉框 using System; using System.Collections.Generic; using System.Linq; using System.Web; u ...

  4. 打通前后端全栈开发node&plus;vue进阶【课程学习系统项目实战详细讲解】&lpar;3&rpar;:用户添加&sol;修改&sol;删除 vue表格组件 vue分页组件

    第三章 建议学习时间8小时      总项目预计10章 学习方式:详细阅读,并手动实现相关代码(如果没有node和vue基础,请学习前面的vue和node基础博客[共10章] 演示地址:后台:demo ...

  5. 向Android模拟器中批量导入通讯录联系人

    使用adb命令向Android模拟器中批量导入通讯录联系人的方法: 使用adb提供的命令, 可以非常方便地从PC中将通讯录批量导入android模拟器中. 首先要先准备好固定格式的vcf文件, 该文件 ...

  6. SpringBoot定时任务升级篇(动态添加修改删除定时任务)

    需求缘起:在发布了<Spring Boot定时任务升级篇>之后得到不少反馈,其中有一个反馈就是如何动态添加修改删除定时任务?那么我们一起看看具体怎么实现,先看下本节大纲: (1)思路说明: ...

  7. 【转】C&num;添加修改删除文件文件夹大全

    [转]C#添加修改删除文件文件夹大全 C#添加修改删除文件文件夹大全 StreamWriter sw = File.AppendText(Server.MapPath(".")+& ...

  8. Android软件开发之获取通讯录联系人信息

    Android手机的通讯录联系人全部都存在系统的数据库中,如果须要获得通讯里联系人的信息就须要访问系统的数据库,才能将信息拿出来. 这一篇文章我主要带领同学们熟悉Android的通讯录机制. 图中选中 ...

  9. Swift - 添加、修改、删除通讯录联系人

    使用AddressBook.framework框架,我们除了可以很方便的获取通信录里的联系人.同时,还能对通讯录进行新增.修改.删除联系人操作. (注意:这些操作同查询一样,首先需要发起授权请求) 1 ...

随机推荐

  1. c 网络与套接字socket

    我们已经知道如何使用I/O与文件通信,还知道了如何让同一计算机上的两个进程进行通信,这篇文章将创建具有服务器和客户端功能的程序 互联网中大部分的底层网络代码都是用C语言写的. 网络程序通常有两部分组成 ...

  2. UI-切圆角、透明度、取消按钮点击高亮效果、按钮文字带下划线

    一.切UIView的某个角为圆角 如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore框架).而若要指定某 ...

  3. PHP&lowbar;SELF、 SCRIPT&lowbar;NAME、 REQUEST&lowbar;URI区别

    $_SERVER[PHP_SELF], $_SERVER[SCRIPT_NAME], $_SERVER['REQUEST_URI'] 在用法上是非常相似的,他们返回的都是与当前正在使用的页面地址有关的 ...

  4. &lbrack;osx&rsqb; 查看端口被占用

    netstat命令 netstat -an | grep 3306 3306替换成需要grep的端口号 lsof命令 sudo lsof -i :80 -i参数表示网络链接,:80指明端口号,该命令会 ...

  5. UVa 294 &lpar;因数的个数&rpar; Divisors

    题意: 求区间[L, U]的正因数的个数. 分析: 有这样一条公式,将n分解为,则n的正因数的个数为 事先打好素数表,按照上面的公式统计出最大值即可. #include <cstdio> ...

  6. 【HDU4366】【DFS序&plus;分块】Successor

    Problem Description Sean owns a company and he is the BOSS.The other Staff has one Superior.every st ...

  7. Python学习-使用matplotlib画动态多图

    最近常常使用matplotlib进行数学函数图的绘制,可是怎样使用matplotlib绘制动态图,以及绘制动态多图.直到今天才学会. 1.參考文字 首先感谢几篇文字的作者.帮我学会了怎样绘制.大家也能 ...

  8. android模拟器网络设置(局域网)

    Android模拟器如何设置DNS访问局域网内网站 我们需要用到android-sdk开发包中adb shell指令 见下图

  9. &lbrack;bzoj2157&rsqb;旅游 &lpar;lct&rpar;

    这个应该也算裸的模板题吧..主要是边权的问题,对于每条边u->v,我们可以新建一个节点代替他,把边的信息弄到新的点上,就变成u->x->v了... 当然了这样的话要防止u和v这些没用 ...

  10. &lbrack;翻译&rsqb; softmax和softmax&lowbar;cross&lowbar;entropy&lowbar;with&lowbar;logits的区别

    翻译自:https://*.com/questions/34240703/whats-the-difference-between-softmax-and-softmax-cr ...