热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Contact实现从通讯录中获取数据

这个项目实现了从通讯录中获取联系人信息,也实现了将数据储存在数据库中,并对数据进行增删改查的操作项目结构如图  在进行获取通讯录信息之前要在AndroidManifest.xml文

这个项目实现了从通讯录中获取联系人信息,也实现了将数据储存在数据库中,并对数据进行增删改查的操作

项目结构如图

 

 在进行获取通讯录信息之前要在AndroidManifest.xml文件中添加如下代码:


主活动布局如下:


xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:orientation="vertical"
android:layout_
tools:cOntext=".MainActivity">
android:id="@+id/ed_name"
android:layout_
android:hint="姓名"
android:layout_marginTop="25dp"
android:layout_/>
android:id="@+id/ed_phone"
android:layout_
android:hint="电话"
android:layout_marginTop="25dp"
android:layout_/>
android:layout_
android:layout_
android:layout_gravity="center"
android:layout_marginTop="25dp"
android:orientation="horizontal">
android:id="@+id/btn_add"
android:layout_marginRight="5dp"
android:layout_
android:layout_
android:text="添加"/>
android:id="@+id/btn_query"
android:layout_
android:layout_marginRight="5dp"
android:layout_
android:text="查询"/>
android:id="@+id/btn_update"
android:layout_
android:layout_
android:layout_marginRight="5dp"
android:text="修改"/>
android:id="@+id/btn_delete"
android:layout_
android:layout_marginRight="5dp"
android:layout_
android:text="删除"/>

android:id="@+id/btn_Contact"
android:layout_
android:layout_gravity="center"
android:layout_
android:text="获取通讯录联系人信息"/>
android:id="@+id/tv_show"
android:layout_
android:layout_/>

MainActivity.java:

package cn.itcast.tongxunludemo;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText edName;
private EditText edPhone;
private TextView tvShow;
private Button btnAdd;
private Button btnQuery;
private Button btnUpdate;
private Button btnDelete;
private Button btnContact;
MyHelper myHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edName=findViewById(R.id.ed_name);
edPhOne=findViewById(R.id.ed_phone);
tvShow=findViewById(R.id.tv_show);
btnAdd=findViewById(R.id.btn_add);
btnQuery=findViewById(R.id.btn_query);
btnUpdate=findViewById(R.id.btn_update);
btnDelete=findViewById(R.id.btn_delete);
btnCOntact=findViewById(R.id.btn_Contact);
myHelper=new MyHelper(this);
btnAdd.setOnClickListener((View.OnClickListener) MainActivity.this);
btnQuery.setOnClickListener((View.OnClickListener) MainActivity.this);
btnUpdate.setOnClickListener((View.OnClickListener) MainActivity.this);
btnDelete.setOnClickListener((View.OnClickListener) MainActivity.this);
btnContact.setOnClickListener((View.OnClickListener) MainActivity.this);
}
@Override
public void onClick(View v) {
String name,phone;
SQLiteDatabase db;
ContentValues values;
switch (v.getId()){
case R.id.btn_add:
name=edName.getText().toString();
phOne=edPhone.getText().toString();
db=myHelper.getWritableDatabase();
String sqlSave="insert into information (name,phone) values(?,?)";
db.execSQL(sqlSave,new String[]{name,phone});
Toast.makeText(this,"信息已经添加",Toast.LENGTH_SHORT).show();
db.close();
break;
case R.id.btn_query:
db=myHelper.getReadableDatabase();
Cursor cursor=db.rawQuery("select * from information",null);
if(cursor.getCount()==0){
tvShow.setText("");
Toast.makeText(this,"没有数据",Toast.LENGTH_SHORT).show();
}else {
cursor.moveToFirst();
tvShow.setText("Name:"+cursor.getString(1)+";Tel:"+cursor.getString(2));
}
while (cursor.moveToNext()){
tvShow.append("\n"+"Name:"+cursor.getString(1)+";Tel:"+cursor.getString(2));
}
cursor.close();
db.close();
break;
case R.id.btn_update:
String nerName=edName.getText().toString();
String newPhoto=edPhone.getText().toString();
db=myHelper.getWritableDatabase();
String sqlUpdata="update information set phOne=? where name=?";
db.execSQL(sqlUpdata,new String[]{newPhoto,nerName});
Toast.makeText(this,"信息已经修改",Toast.LENGTH_SHORT).show();
db.close();
break;
case R.id.btn_delete:
db=myHelper.getWritableDatabase();
db.execSQL("delete from information");
Toast.makeText(this,"信息已经删除",Toast.LENGTH_SHORT).show();
tvShow.setText("");
db.close();
break;
case R.id.btn_Contact:
if(Build.VERSION.SDK_INT<23){
//获取联系人信息
getContacts();
}else {
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED){
//发起动态权限申请
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_CONTACTS},1);
}else {
//获取联系人
getContacts();
}
}
break;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==1 && permissions[0].equals(Manifest.permission.READ_CONTACTS)&& grantResults[0]==PackageManager.PERMISSION_GRANTED){
//获取联系人信息
getContacts();
}else {
Toast.makeText(MainActivity.this,"您拒绝了相关权限,无法获取联系人信息!",Toast.LENGTH_SHORT).show();
}
}
private void getContacts(){
tvShow.setText("");
Uri uri= ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
ContentResolver resolver=getContentResolver();
Cursor cursor=resolver.query(uri,null,null,null,null);
if(cursor !=null){
while (cursor.moveToNext()){
String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phOne=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
tvShow.append("\n姓名:"+name+".电话:"+phone);
}
}
}
class MyHelper extends SQLiteOpenHelper{
public MyHelper(Context context){
super(context,"itcast.db",null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table information(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}

这样这个项目就完成了

 



推荐阅读
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
author-avatar
手机用户2602938483
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有