往通讯录里添加联系人

首先,在清单文件里添加读写权限

  1. <uses-permission android:name="android.permission.READ_CONTACTS"/><!-- 读取通讯录权限 -->
  2. <uses-permission android:name="android.permission.WRITE_CONTACTS"/><!-- 写入通讯录权限 -->

MainActivity.java

  1. package com.aimee.android.play.addcontact;
  2.  
  3. import android.Manifest;
  4. import android.content.ContentResolver;
  5. import android.content.ContentValues;
  6. import android.database.Cursor;
  7. import android.net.Uri;
  8. import android.os.Bundle;
  9. import android.text.TextUtils;
  10. import android.view.View;
  11. import android.widget.EditText;
  12. import android.widget.Toast;
  13.  
  14. public class MainActivity extends BaseActivity {
  15. private static final String TAG = "MainActivity";
  16.  
  17. private EditText mEtname;
  18. private EditText mEtmail;
  19. private EditText mEtphone;
  20.  
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main);
  25. performCodeWithPermission("插入联系人信息", new PermissionCallback() {
  26. @Override
  27. public void hasPermission() {
  28.  
  29. }
  30.  
  31. @Override
  32. public void noPermission() {
  33.  
  34. }
  35. }, Manifest.permission.WRITE_CONTACTS, Manifest.permission.READ_CONTACTS);
  36.  
  37. mEtname = findViewById(R.id.et_name);
  38. mEtmail = findViewById(R.id.et_email);
  39. mEtphone = (EditText) findViewById(R.id.et_phone);
  40. }
  41.  
  42. /**
  43. * 添加联系人信息
  44. * @param view
  45. */
  46. public void addContact(View view) {
  47. //1.判断是否为空
  48. String name = mEtname.getText().toString().trim();
  49. String email = mEtmail.getText().toString().trim();
  50. String phone = mEtphone.getText().toString().trim();
  51. if (TextUtils.isEmpty(name)){
  52. Toast.makeText(this,"姓名不能为空",Toast.LENGTH_SHORT).show();
  53. return;
  54. }
  55.  
  56. //2.在raw_contact表里面添加联系人id
  57. ContentResolver resolver = getContentResolver();
  58. Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
  59. Uri dataUri = Uri.parse("content://com.android.contacts/data");
  60.  
  61. Cursor cursor = resolver.query(uri, null, null, null, null, null);
  62. int new_id = cursor.getCount() + 1;
  63.  
  64. ContentValues values = new ContentValues();
  65. resolver.insert(uri,values);
  66.  
  67. //3.在data表里面添加联系人数据
  68. ContentValues namevalues = new ContentValues();
  69. namevalues.put("raw_contact_id",new_id);
  70. namevalues.put("data1",name);
  71. namevalues.put("mimetype","vnd.android.cursor.item/name");
  72. resolver.insert(dataUri,namevalues);
  73.  
  74. ContentValues phonevalues = new ContentValues();
  75. phonevalues.put("raw_contact_id",new_id);
  76. phonevalues.put("data1",phone);
  77. phonevalues.put("mimetype","vnd.android.cursor.item/phone_v2");
  78. resolver.insert(dataUri,phonevalues);
  79.  
  80. ContentValues emailvalues = new ContentValues();
  81. emailvalues.put("raw_contact_id",new_id);
  82. emailvalues.put("data1",email);
  83. emailvalues.put("mimetype","vnd.android.cursor.item/email_v2");
  84. resolver.insert(dataUri,emailvalues);
  85.  
  86. Toast.makeText(this,"添加信息成功",Toast.LENGTH_SHORT).show();
  87. }
  88. }

activity_main.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8.  
  9. <EditText
  10. android:id="@+id/et_name"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_marginStart="8dp"
  14. android:layout_marginTop="32dp"
  15. android:layout_marginEnd="8dp"
  16. android:ems="10"
  17. android:hint="请输入name"
  18. android:inputType="textPersonName"
  19. app:layout_constraintEnd_toEndOf="parent"
  20. app:layout_constraintHorizontal_bias="0.503"
  21. app:layout_constraintStart_toStartOf="parent"
  22. app:layout_constraintTop_toTopOf="parent" />
  23.  
  24. <EditText
  25. android:id="@+id/et_email"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:layout_marginStart="8dp"
  29. android:layout_marginTop="32dp"
  30. android:layout_marginEnd="8dp"
  31. android:ems="10"
  32. android:hint="请输入邮箱"
  33. android:inputType="textPersonName"
  34. app:layout_constraintEnd_toEndOf="parent"
  35. app:layout_constraintHorizontal_bias="0.503"
  36. app:layout_constraintStart_toStartOf="parent"
  37. app:layout_constraintTop_toBottomOf="@+id/et_name" />
  38.  
  39. <EditText
  40. android:id="@+id/et_phone"
  41. android:layout_width="wrap_content"
  42. android:layout_height="wrap_content"
  43. android:layout_marginStart="8dp"
  44. android:layout_marginTop="32dp"
  45. android:layout_marginEnd="8dp"
  46. android:ems="10"
  47. android:hint="请输入号码"
  48. android:inputType="textPersonName"
  49. app:layout_constraintEnd_toEndOf="parent"
  50. app:layout_constraintHorizontal_bias="0.503"
  51. app:layout_constraintStart_toStartOf="parent"
  52. app:layout_constraintTop_toBottomOf="@+id/et_email" />
  53.  
  54. <Button
  55. android:id="@+id/button3"
  56. android:layout_width="91dp"
  57. android:layout_height="wrap_content"
  58. android:layout_marginStart="8dp"
  59. android:layout_marginTop="32dp"
  60. android:layout_marginEnd="8dp"
  61. android:onClick="addContact"
  62. android:text="Button"
  63. app:layout_constraintEnd_toEndOf="parent"
  64. app:layout_constraintStart_toStartOf="parent"
  65. app:layout_constraintTop_toBottomOf="@+id/et_phone" />
  66.  
  67. </android.support.constraint.ConstraintLayout>

界面:

输入姓名,邮箱,电话,然后点击Button就可以将其存储到通讯录中

第四十九篇 -- 添加联系人信息Addcontact的更多相关文章

  1. 第四十九篇 入门机器学习——数据归一化(Feature Scaling)

    No.1. 数据归一化的目的 数据归一化的目的,就是将数据的所有特征都映射到同一尺度上,这样可以避免由于量纲的不同使数据的某些特征形成主导作用.   No.2. 数据归一化的方法 数据归一化的方法主要 ...

  2. C++第四十九篇 -- 将一个项目Copy到另一台电脑

    最近写项目,由于设备原因,需要将一台电脑的项目拷贝到另一台电脑上,在另一个电脑上继续编写.由于配置属性原因,最终还是在另一台电脑上创建了新项目,只是把这些cpp文件都复制过去了,然后重新部署属性. 背 ...

  3. 第四十九篇:webpack的基本使用(三) --安装和配置html-webpack-plugin插件

    好家伙, 1.html-webpack-plugin的作用 讲一下为什么需要这个插件 存在问题:在点开locahost:8080之后出现的是项目的根目录,而不是网页 这时候需要再点开scr文件夹才能看 ...

  4. Python之路【第十九篇】:爬虫

    Python之路[第十九篇]:爬虫   网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...

  5. Gradle 1.12用户指南翻译——第四十九章. Build Dashboard 插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  6. SQL注入之Sqli-labs系列第四十七关,第四十八关,第四十九关(ORDER BY注入)

    0x1 源码区别点 将id变为字符型:$sql = "SELECT * FROM users ORDER BY '$id'"; 0x2实例测试 (1)and rand相结合的方式 ...

  7. 第四十九个知识点:描述在IPsec和TLS后的基本想法

    第四十九个知识点:描述在IPsec和TLS后的基本想法 网络安全协议(Internet Protocol Security,IPsec)和安全传输层协议(Transport Layer Securit ...

  8. “全栈2019”Java第四十九章:重载与重写对比详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)

    第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...

随机推荐

  1. 【渗透实战】记一次艰难的内网漫游第四期_蹭我WIFI?看我如何利用组合拳日进蹭网者内网

    /文章作者:Kali_MG1937 CSDN博客ID:ALDYS4 QQ:3496925334/ 内网漫游系列第三期:[渗透实战]记一次艰难的内网漫游第三期_我是如何利用APT攻击拿到内网最高权限的 ...

  2. 【SQLite】知识点概述

    1.SQLite不与诸如MySQL,Oracle,PostgreSQL或SQL Server之类的客户端/服务器SQL数据库引擎竞争,SQLite与fopen()竞争,读写快35%.2.SQLite数 ...

  3. centos7 安装卸载程序rpm使用方法

    1.安装 rpm 包: ➢ 基本语法 rpm -ivh RPM 包全路径名称 2.卸载 rpm 包: ➢ 基本语法 rpm -e RPM 包的名称 ➢ 应用案例 删除 firefox 软件包 rpm ...

  4. 5000字长文,kurryluo 的自学编程之路

    我是程序员.大众口中非科班的那种,带着高中时期对二进制的恐惧,在大学参加科研比赛后保研,再到和校友一起创业,现在在某大型互联网公司做前端开发,一路走来都是靠自己学习. 前端框架 VUE 的作者尤大说过 ...

  5. PowerMockito的一些注意事项

    PowerMockito的一些注意事项 目录 PowerMockito的一些注意事项 1 注解@PowerMockIgnore({"javax.crypto.*"}) 2 Powe ...

  6. python使用venv

    venv模块支持使用自己的站点目录创建轻量级"虚拟环境",可选择与系统站点目录隔离.每个虚拟环境都有自己的Python二进制文件(与用于创建此环境的二进制文件的版本相匹配),并且可 ...

  7. Vue3全家桶升级指南二ref、toRef、toRefs的区别

    ref是对原始数据的拷贝,当修改ref数据时,模板中的视图会发生改变,但是原始数据并不会改变. toRef是对原始数据的引用,修改toRef数据时,原始数据也会发生改变,但是视图并不会更新. 在vue ...

  8. Sql Server 查询正在执行的sql信息和锁定事务

    执行中的sql SELECT [Spid] = session_Id, ecid, [Database] = DB_NAME(sp.dbid), [User] = nt_username, [Stat ...

  9. Mysql 主键的操作

    ​ 主键:primary key ,主要的键.一张表只能有一个字段可以使用对应的键,用来唯一的约束字段里面的数据,数据不能重复,这种键称之为主键,一张表只能最多有一个主键.  一.增加主键 方法一:在 ...

  10. MySQL主从异常恢复

    说明 MySQL主从出现不同步的情况时,或者要添加新的从库时,可以使用以下方法进行操作回复主从. 停止业务应用 停止所有连接到主从库上的应用,在恢复主从期间禁止任何增删改等操作,否则恢复失败 停止主从 ...