原理是通过,contentprovider获取系统联系人数据库中的字段信息而达到获取内容目的

效果图如下:

这是默认排版

然后是点击左边实现的效果


如上图可看获取了所有联系人再页面(采用ListView)


边按钮 点击后跳转到系统的联系人列表中获取值到ListView中(我来理解就是带有目的性跳转)



点击阿宝联系人返回到自己APP


当然是不可以添加一样的联系人所以判断一下Toast出来


基本的功能就是这样。


下面是具体逻辑代码

  1. 布局文件

  2. Java文件
  3. 清单文件配置

一:布局文件

    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> data;    //存储姓名数据进行判断   private List list=new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //ListView        sy = (ListView) findViewById(R.id.sy);        //获取内容访问者        resolver = getContentResolver();        //数据来源        data = new ArrayList>();        //适配器        /** this 上下文         *  data 数据         *  R.layout.simple_list_item_2 系统的布局文件         *  因为数据展示用map集合  所以String集合是键         *  int集合是值         */        sa = new SimpleAdapter(this, data,android.R.layout.simple_list_item_2,new String[]{"names","number"},new int[]{android.R.id.text1,android.R.id.text2});        //listview 绑定适配器        sy.setAdapter(sa);    }    public void all(View view){        //先获取raw_contacts表        Cursor cursor = resolver.query(Uri.parse("content://com.android.contacts/raw_contacts"), null, null, null, null);        while (cursor.moveToNext()){            Map map=new HashMap<>();            int id = cursor.getInt(cursor.getColumnIndex("_id"));            String displayName=cursor.getString(cursor.getColumnIndex("display_name"));            //通过map绑定名字            map.put("names",displayName);            //根据联系人id获取联系人数据            Cursor cursor2 = resolver.query(Uri.parse("content://com.android.contacts/raw_contacts/"+id+"/data"), null, null, null, null);            while (cursor2.moveToNext()){                 //主要注意红色部分          //虽然使用工具查看data表 它有一列是mimetype_id         //但是它是和mimetype表是关联的 所有要用到mimetype                //你看到系统表的是mimetype_id例,但是不可以用这一例,因为data与mimetype相互关联,所以用mimetype_id是不行的                //int mimetype_id = cursor2.getInt(cursor2.getColumnIndex("mimetype_id"));                //获取这一列,因为这样查询出来有许多一样的数据  去除重复                String type = cursor2.getString(cursor2.getColumnIndex("mimetype"));                if("vnd.android.cursor.item/phone_v2".equals(type)){                    //手机号码                    String data1 = cursor2.getString(cursor2.getColumnIndex("data1"));                    //绑定手机号码                    map.put("number",data1);                    Notify(displayName,map);                }            }        }    }    //跳转到系统的联系人页面    public void system(View view){
   
        //参数是跳转到联系人的参数
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), 注意不要忘记添加协议
是不是很容易,希望对大家有帮助。



   




更多相关文章

  1. Android(安卓)选择联系人+返回对应手机号码
  2. gen下R文件消失 && 工程无故报错
  3. Android(安卓)开发者 for Flutter (2)如何布局? XML layout 文件跑
  4. Android之微信分享
  5. android官方最新以及2.2、2.3.5源代码(完整)下载以及用source insi
  6. Android用户界面设计学习之旅-第二站
  7. 使用动画和fragment改善Android表单
  8. 跟Google学习Android开发-起始篇-保存数据(2)
  9. Android屏幕锁定详解完整版(二)

随机推荐

  1. c语言字符串定义的方法是什么
  2. c语言除法如何运算
  3. c语言二进制输出的方法
  4. c语言简单小游戏-扫雷游戏
  5. c语言程序的调试方法
  6. c语言求x的n次方的函数是什么
  7. c语言中合法的字符常量如何定义?
  8. c语言逗号表达式的运算规则
  9. executenonquery 的用法详解
  10. c语言允许函数的递归调用吗