原理是通过,contentprovider获取系统联系人数据库中的字段信息而达到获取内容目的
效果图如下:
这是默认排版
然后是点击左边实现的效果
如上图可看获取了所有联系人再页面(采用ListView)
右边按钮 点击后跳转到系统的联系人列表中获取值到ListView中(我来理解就是带有目的性跳转)
点击阿宝联系人返回到自己APP
当然是不可以添加一样的联系人所以判断一下Toast出来
基本的功能就是这样。
下面是具体逻辑代码
-
布局文件
- Java文件
- 清单文件配置
一:布局文件
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
二:Java文件
MainActivity.java
package com.example.contentprovider_b;import android.app.Activity;import android.content.ContentResolver;import android.content.Intent;import android.database.Cursor;import android.net.Uri;import android.provider.ContactsContract;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class MainActivity extends AppCompatActivity { //ListView private ListView sy; //内容访问者 private ContentResolver resolver; //适配器 private SimpleAdapter sa; //数据 private List
//参数是跳转到联系人的参数
Intent intent = new Intent(Intent.ACTION_PICK); intent.setData(ContactsContract.Contacts.CONTENT_URI);
//有目的性跳转第二个参数是相当于一把钥匙(但是这钥匙有二把 还是一把在回调函数方法中
// 如果一致 就可以“开门”(获取结果)) startActivityForResult(intent,0); }
//这个方法是右边按钮 有目的性跳转的回调函数 @Override protected void onActivityResult(int requestCode, int resultCode, Intent datai) { super.onActivityResult(requestCode, resultCode, datai); Map
map=new HashMap<>(); switch (requestCode){ case 0: if (resultCode== Activity.RESULT_OK){ //获取路径 Uri dataData = datai.getData(); //查询到单个联系人id Cursor cursor = managedQuery(dataData, null, null, null, null); cursor.moveToFirst(); //联系人名 String sname=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); map.put("names",sname); //联系人id String id=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); //查询表 Cursor query = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+id, null, null); while (query.moveToNext()){ //获取手机号 String data1=query.getString(query.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); map.put("number",data1); } Notify(sname,map); } break; } }
//这个方法是判断是否有重复 public void Notify(String sname,Map map){ //去掉重复值 if (!data.isEmpty()) { for (Map objectMap : data) { String name = (String) objectMap.get("names"); list.add(name); } if (!list.contains(sname)){ data.add(map); }else { Toast.makeText(this, sname+"已经在列表中", Toast.LENGTH_SHORT).show(); } }else { data.add(map); } //通知适配器改变 sa.notifyDataSetChanged(); }}
三: 清单文件配置
因为是获取系统的,必须添加权限(在 清单文件在配置)
怎么样,其实就是获取数据库内容而以,记一下系统表的路径
(例如 content://com.android.contacts/raw_contacts), 注意不要忘记添加协议
是不是很容易,希望对大家有帮助。
- Android(安卓)选择联系人+返回对应手机号码
- gen下R文件消失 && 工程无故报错
- Android(安卓)开发者 for Flutter (2)如何布局? XML layout 文件跑
- Android之微信分享
- android官方最新以及2.2、2.3.5源代码(完整)下载以及用source insi
- Android用户界面设计学习之旅-第二站
- 使用动画和fragment改善Android表单
- 跟Google学习Android开发-起始篇-保存数据(2)
- Android屏幕锁定详解完整版(二)
随机推荐
-
c语言字符串定义的方法是什么
-
c语言除法如何运算
-
c语言二进制输出的方法
-
c语言简单小游戏-扫雷游戏
-
c语言程序的调试方法
-
c语言求x的n次方的函数是什么
-
c语言中合法的字符常量如何定义?
-
c语言逗号表达式的运算规则
-
executenonquery 的用法详解
-
c语言允许函数的递归调用吗