读取android内置联系人_android 获取内置存储 - CSDN
  • 本源码演示Android如何获取系统内置的APP应用列表信息,比如获取android系统中的录音机、相机、应用包访问权限帮助程序、android系统信息、设置、联系人存储、外部存储设备属性、Android键盘(AOSP)、移动数据信息...
  • 因为读取联系人信息属于危险权限,所以此程序我用到了Android的动态申请权限,如果你对动态申请...其实我们的联系人信息都保存在Android内置数据库的一张表上,我们只要读取对应的那张数据表上的信息就可以了,读取...

    因为读取联系人信息属于危险权限,所以此程序我用到了Android的动态申请权限,如果你对动态申请权限还不了解,请看我的另一篇博客,链接地址如下

    Android动态申请权限

    现在我们来分析一下怎么使用Android的内容提供器读取手机联系人信息,首先你要知道联系人信息在哪?怎么读取?

    其实我们的联系人信息都保存在Android内置数据库的一张表上,我们只要读取对应的那张数据表上的信息就可以了,读取步骤如下:

    1. 调用getContentResolver().query()方法得到一个Cursor对象
    2. 将Cursor对象定位在第一行
    3. 对Cursor对象进行读取操作,对数据表以行的方式进行读取
    4. 将Cursor对象移到下一行
    5. 关闭Cursor对象

    别忘了在AndroidManifest.xml文件中声明权限,在AndroidManifest.xml加入以下代码:

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

    好了,现在正式开始程序,MainActivity的代码如下:

    public class MainActivity extends AppCompatActivity {
        private ListView mListView;
        private ArrayAdapter<String> adapter;
        private List<String> list = new ArrayList<>();
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 实例化ListView
            mListView = findViewById(R.id.main_list);
            // 实例化ArrayAdapter
            adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
            // 为ListView设置适配器
            mListView.setAdapter(adapter);
    
            // 判断有没有联系人读取权限,如果没有,就动态申请,有的话,就直接读取联系人
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
                // 动态申请联系人权限,此处的请求码是1
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);
            } else {
                // 读取联系人信息
                readContacts();
            }
    
        }
    
        // 读取联系人信息
        private void readContacts() {
            // 创建一个光标对象
            Cursor cursor = null;
    
            try {
                // 使用内容提供器得到一个光标对象
                cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
    
                while (cursor.moveToNext()) {
                    // 读取联系人姓名
                    String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    // 读取联系人手机号码
                    String Number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    //将读取的联系人姓名和手机号码添加到list列表中
                    list.add(displayName + "\n" + Number);
                }
                // 更新ListView显示的数据
                adapter.notifyDataSetChanged();
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }
    
        }
    
        // 动态申请权限的回调
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            // 通过请求码来判断需要申请的权限是否授权
            switch (requestCode) {
                case 1:
                    // 如果权限已经授权就调用readContacts()方法读取联系人,否则就提示一个Toast
                    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        readContacts();
                    } else {
                        Toast.makeText(this, "没有读取联系人权限", Toast.LENGTH_SHORT).show();
                    }
                    break;
                default:
            }
    
        }
    
    }
    
    

    程序解析:
    以上程序我是直接通过一个ListView来显示读取联系人信息,首先定义并初始化一个ListView组件,然后为ListView设置适配器,在判断是否获取了读取联系人信息的权限,如果没有,就动态申请,如果有,就直接调用已经写好的readContacts()方法进行读取,最后,在动态申请权限的回调方法中写上对应的逻辑操作。

    展开全文
  • 在我开发的每日短信程序中,有...关于这个程序介绍和界面可以参看:[url=http://renzhen.iteye.com/blog/1173238]我的第一个Android程序 [/url] 关于选择联系人,可以直接使用Android内置联系人实现,网上也有些...
    在我开发的每日短信程序中,有一个这样的功能,就是点击‘选择联系人’按钮,会出现联系人选择界面,点击选择联系人后,会将这个联系人的手机号码加入一个文本框中。关于这个程序介绍和界面可以参看:[url=http://renzhen.iteye.com/blog/1173238]我的第一个Android程序 [/url]
    关于选择联系人,可以直接使用Android的内置联系人实现,网上也有些例子,但是有些代码有点问题,有的在模拟器正常,手机上不行,有的手机OK,模拟器不行。原因是在联系人URI使用了硬编码,你可以使用ContactsContract.Contacts.CONTENT_URI常量来增强移植性。
    选择联系人部分代码如下:

    mChooseContactButton.setOnClickListener(new Button.OnClickListener(){

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);

    SMSSendActivity.this.startActivityForResult(intent, 1);
    }

    });

    接下来就是获取选择联系人的手机号码,首先需要通过函数onActivityResult获取选择的联系人,然后通过Content Provider查询联系人的手机号码,代码片段如下:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode)
    {

    case (1) :
    {

    if (resultCode == Activity.RESULT_OK)
    {

    Uri contactData = data.getData();

    Cursor c = managedQuery(contactData, null, null, null, null);

    c.moveToFirst();

    String phoneNum=this.getContactPhone(c);
    mPhoneNum.setText(phoneNum);

    }

    break;

    }

    }




    }


    //获取联系人电话
    private String getContactPhone(Cursor cursor)
    {

    int phoneColumn = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
    int phoneNum = cursor.getInt(phoneColumn);
    String phoneResult="";
    //System.out.print(phoneNum);
    if (phoneNum > 0)
    {
    // 获得联系人的ID号
    int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
    String contactId = cursor.getString(idColumn);
    // 获得联系人的电话号码的cursor;
    Cursor phones = getContentResolver().query(
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
    null,
    ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = " + contactId,
    null, null);
    //int phoneCount = phones.getCount();
    //allPhoneNum = new ArrayList<String>(phoneCount);
    if (phones.moveToFirst())
    {
    // 遍历所有的电话号码
    for (;!phones.isAfterLast();phones.moveToNext())
    {
    int index = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
    int typeindex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
    int phone_type = phones.getInt(typeindex);
    String phoneNumber = phones.getString(index);
    switch(phone_type)
    {
    case 2:
    phoneResult=phoneNumber;
    break;
    }
    //allPhoneNum.add(phoneNumber);
    }
    if (!phones.isClosed())
    {
    phones.close();
    }
    }
    }
    return phoneResult;
    }

    这样,就可以实现通过选择联系人来获取它的手机号码了,代码是我从我程序代码直接拷贝的,需要做部分修改,但是绝对可用。 :arrow:
    展开全文
  • 关于选择联系人,可以直接使用Android内置联系人实现,网上也有些例子,但是有些代码有点问题,有的在模拟器正常,手机上不行,有的手机OK,模拟器不行。原因是在联系人URI使用了硬编码,你可以使用...
    在我们的每日短信程序中,有一个这样的功能,就是点击‘选择联系人’按钮,会出现联系人选择界面,点击选择联系人后,会将这个联系人的手机号码加入一个文本框中。

    关于选择联系人,可以直接使用Android的内置联系人实现,网上也有些例子,但是有些代码有点问题,有的在模拟器正常,手机上不行,有的手机OK,模拟器不行。原因是在联系人URI使用了硬编码,你可以使用ContactsContract.Contacts.CONTENT_URI常量来增强移植性。
    选择联系人部分代码如下:
    Java代码
    mChooseContactButton.setOnClickListener(new Button.OnClickListener(){

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);

    SMSSendActivity.this.startActivityForResult(intent, 1);
    }

    });

    接下来就是获取选择联系人的手机号码,首先需要通过函数onActivityResult获取选择的联系人,然后通过Content Provider查询联系人的手机号码,代码片段如下:
    Java代码
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode)
    {

    case (1) :
    {

    if (resultCode == Activity.RESULT_OK)
    {

    Uri contactData = data.getData();

    Cursor c = managedQuery(contactData, null, null, null, null);

    c.moveToFirst();

    String phoneNum=this.getContactPhone(c);
    mPhoneNum.setText(phoneNum); //mPhoneNum为接收的EditText或TextView

    }

    break;

    }
    }
    }


    //获取联系人电话
    private String getContactPhone(Cursor cursor)
    {

    int phoneColumn = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
    int phoneNum = cursor.getInt(phoneColumn);
    String phoneResult="";
    //System.out.print(phoneNum);
    if (phoneNum > 0)
    {
    // 获得联系人的ID号
    int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
    String contactId = cursor.getString(idColumn);
    // 获得联系人的电话号码的cursor;
    Cursor phones = getContentResolver().query(
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
    null,
    ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = " + contactId,
    null, null);
    //int phoneCount = phones.getCount();
    //allPhoneNum = new ArrayList<String>(phoneCount);
    if (phones.moveToFirst())
    {
    // 遍历所有的电话号码
    for (;!phones.isAfterLast();phones.moveToNext())
    {
    int index = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
    int typeindex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
    int phone_type = phones.getInt(typeindex);
    String phoneNumber = phones.getString(index);

    // 获取联系人姓名代码改为: String phoneName=phones.getString(phones.getColumnIndex(PhoneLookup.DISPLAY_NAME));


    switch(phone_type)
    {
    case 2:
    phoneResult=phoneNumber;
    break;
    }
    //allPhoneNum.add(phoneNumber);
    }
    if (!phones.isClosed())
    {
    phones.close();
    }
    }
    }
    return phoneResult;
    }

    这样,就可以实现通过选择联系人来获取它的手机号码了。

    注意:最后要在AndroidManifest中配置读取联系人的权限,<uses-permission android:name="android.permission.READ_CONTACTS"/>。
    展开全文
  • 使用ContentProvider获取手机联系人。 二、作业过程和结果 1、首先在模拟器中添加几个联系人,作为本项目的获取目标。   2、本项目包含两个java文件和两个布局文件,如下图。后面会分别介绍这些文件。   3、...

    目录

    一、实验内容

    二、作业过程和结果

    三、完整代码


    一、实验内容

    使用ContentProvider获取手机联系人。

    二、作业过程和结果

    1、首先在模拟器中添加几个联系人,作为本项目的获取目标。

             

    2、本项目包含两个java文件和两个布局文件,如下图。后面会分别介绍这些文件。

              

    3、创建主活动ReadContacts,并对应布局activity_read_contacts.xml。布局很简单,就一个按钮和一个ListView。主活动中通过点击事件对联系人进行获取,其中最主要的是授权以及授权通过后的联系人获取,关键代码如下。

     

                             activity_read_contacts.xml布局文件 

              

                             点击按钮,创建适配器,并对权限进行判断 

                 

                                       对用户选择的权限进行接收处理 

              

                           权限通过后对联系人进行读取 

              

                             自定义适配器 

              

    4、MyPeople是联系人类,它包含name和number字段和对应属性方法,分别对应联系人的姓名和电话。

               

    5、people_info_xml是ListView中每个子项的布局,它包含两个TextView,分别显示联系人姓名和电话号码。在实例化适配器的时候传入该布局。

               

    6、最后在AndroidManifest文件中声明权限,如下。

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

    7、到此所有步骤完成,运行程序,点击获取联系人按钮,结果如下。

              

    三、完整代码

    ReadContacts.java

    package com.example.lab.getcontacts;
    
    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.database.Cursor;
    import android.graphics.Color;
    import android.provider.ContactsContract;
    import android.support.annotation.NonNull;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    import java.util.List;
    import android.Manifest;
    
    
    public class ReadContacts extends AppCompatActivity {
        //创建一个peopleList用于存储联系人
        public List<MyPeople> peopleList=new ArrayList<>();
        //创建一个适配器,后面将用它把联系人的信息传递给ListView
        PeopleAdapter adapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_read_contacts);
            Button getContacts=(Button)findViewById(R.id.btn_getContacts);
    
    
            getContacts.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    adapter=new PeopleAdapter(ReadContacts.this,R.layout.people_info,peopleList);
                    ListView myListView=(ListView)findViewById(R.id.myListView);
                    myListView.setAdapter(adapter);
                    //判断是否获得权限
                    if(ContextCompat.checkSelfPermission(ReadContacts.this, Manifest.permission.READ_CONTACTS)!=PackageManager.PERMISSION_GRANTED){
                        //打开授权对话框
                        ActivityCompat.requestPermissions(ReadContacts.this,new String[]{Manifest.permission.READ_CONTACTS},1);
                    }else{
                        readContacts();
                    }
    
                }
            });
        }
    
        //接收用户授权选择
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch(requestCode)
            {
                case 1:
                    if(grantResults.length>0 && grantResults[0]== PackageManager.PERMISSION_GRANTED){
                        readContacts();
                    }else{
                        Toast.makeText(this,"你没有获得权限!",Toast.LENGTH_LONG).show();
                    }
                    break;
                default:
            }
        }
    
        //读取联系人的方法
        private void readContacts()
        {
            Cursor cursor=null;
            try{
                //查询联系人数据
                cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
                //获得联系人个数
                int count=cursor.getCount();
                //创建MyPeople数组,用于装载每一位联系人
                MyPeople[] myPeoples=new MyPeople[count];
                int i=0;
                if(cursor!=null)
                {
                    while(cursor.moveToNext()){
                        String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                        String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        //实例化联系人对象
                        myPeoples[i]=new MyPeople();
                        myPeoples[i].setName(name);
                        myPeoples[i].setNumber(number);
                        //将每一个联系人放进peopleList
                        peopleList.add(myPeoples[i]);
                        i++;
                    }
                    adapter.notifyDataSetChanged();
                }
    
            }catch(Exception e)
            {
                e.printStackTrace();
            }finally{
                if(cursor!=null)
                {
                    cursor.close();
                }
            }
        }
    
        //自定义一个适配器
        public class PeopleAdapter extends ArrayAdapter<MyPeople>{
    
            private int resourceID;
            public PeopleAdapter(Context context, int resource, List<MyPeople> objects) {
                super(context, resource, objects);
                resourceID=resource;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                MyPeople myPeople=getItem(position);
                View view= LayoutInflater.from(getContext()).inflate(resourceID,parent,false);
                TextView tvName= (TextView)view.findViewById(R.id.textView_name);
                tvName.setText("姓名:"+myPeople.getName());
                tvName.setTextColor(Color.BLACK);
                TextView tvNumber= (TextView)view.findViewById(R.id.textView_number);
                tvNumber.setText("电话:"+myPeople.getNumber());
                tvNumber.setTextColor(Color.BLACK);
                return view;
            }
        }
    }
    

    MyPeople.java

    package com.example.lab.getcontacts;
    
    /**
     * Created by Lab on 2018/12/15.
     */
    
    public class MyPeople {
        String name;
        String number;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getNumber() {
            return number;
        }
    
        public void setNumber(String number) {
            this.number = number;
        }
    
    }
    
    展开全文
  • 要使用系统的内置ContentProvider,首先得... android:name="android.permission.READ_CONTACTS">   给出权限注册源码 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="co
  • Android 文件外/内部存储的获取各种存储目录路径

    万次阅读 多人点赞 2018-06-12 14:51:50
    前言 对于任何一个应用来说,无论是PC端应用还是Android应用,存储肯定是必不可少的。对于很多做Android开发的同学来说,可能认为文件存储很简单,调用一些诸如getFilesDir,getExternalStorageDirectory方法行了,...
  • APP层包括联系人、短信、拨号、InCallUI。framework层包括Telephony、Telecom、PhoneGlobal、RIL等,底层又涉及到通信模块,AT命令等,几大功能互相独立却又缠绕在一起,想要了解透彻非常复杂。 希望再接下来半年...
  • 本篇探究的通过ContentProvider机制获取联系人的API从Android2.0开始做了很大调整,原来的android.provider.Contacts类及其下相关类由android.provider.ContactsContract代替。原类体系标记为Deprecated(废弃),...
  • Android开发之获取联系人信息
  • Android 系统联系人操作完整版

    千次阅读 2014-01-26 11:43:24
    在网络上找了很多种版本的联系人操作,...包括对联系人手机内置 获取,添加,删除,修改 , 对SIM卡联系人 获取,添加,删除,修改。 public class ContactData { String id; String name; String number; p
  • Android系统自带的常用数据库

    千次阅读 2017-05-15 12:28:48
    联系人数据data/data/com.android.providers.contacts/databases/contacts2.db 1.当需要读取通话记录的时候,需要用到系统的数据库,现在需要去查看源码Android清单文件(路径:android-7.0.0_r1\packages\providers\...
  • Android studio 权限大全

    千次阅读 2018-11-28 22:10:00
    1.android.permission.WRITE_USER_DICTIONARY 允许应用程序向用户词典中写入新词 2.android.permission.WRITE_SYNC_SETTINGS 写入Google在线同步设置 3.android.permission.WRITE_SOCIAL_STREAM 读取用户的社交...
  • Android 获取手机中微信聊天记录

    千次阅读 2016-10-22 11:20:26
    几天事情比较多,可还是想尽快写下这篇文章。 本以为微信的聊天记录以我本人现存能力获取不到,但经过一番尝试,还是成功了。前提:手机需要已经 ...一般来说,Android 应用程序的数据库文件会保存在
  • Android开发之内置Intent.Action详解

    千次阅读 2013-02-20 11:22:23
    Android开发之Intent.Action 本文介绍Android中Intent的各种常见作用。   1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开始。比较常用。 ...
  • Android 获取取手机中微信聊天记录

    万次阅读 2016-04-16 10:43:12
    关于如何在 Android 手机上窃取微信聊天记录。 这几天事情比较多,可还是想尽快写下这篇文章。 本以为微信的聊天记录以我本人现存能力获取不到,但经过一番尝试,还是成功了。前提:手机需要已经 root。 在我的...
  • Intent的使用,获取联系人信息
  • 手机里面的联系人google的源码已经利用ContentProvider 共享了出来,ContentProvider的底层使用SQLite数据库实现的,所以其对数据的各种操作都是用sql实现的,只是在上层提供的是URI 可以通过两种方法创建...
  • android内置闹铃功能的简单介绍

    千次阅读 2011-09-18 22:47:55
    本文通过对android内置闹铃功能的简单介绍,来让开发者朋友们了解基于OPhone平台下客户/服务模式的编程模型,以及如何使用OPhone 系统提供的闹铃唤醒功能。与此同时,本文还对PendingIntent做一些简单的介绍,并...
  • 截获系统广播,读取消息,若联系人存在于通信录中,则让消息继续传播;若属于陌生号码,则中断消息,同时把信息显示在自己的程序中。
1 2 3 4 5 ... 20
收藏数 8,183
精华内容 3,273
关键字:

读取android内置联系人