Android笔记: 获取手机联系人列表

简介: Android笔记: 获取手机联系人列表

image.png

下面直接贴代码

1.先写一个实体类,来放名字和号码

    public class PhoneDto {
        private String name;        //联系人姓名
        private String telPhone;    //电话号码
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getTelPhone() {
            return telPhone;
        }
        public void setTelPhone(String telPhone) {
            this.telPhone = telPhone;
        }
        public PhoneDto() {
        }
        public PhoneDto(String name, String telPhone) {
            this.name = name;
            this.telPhone = telPhone;
        }
    }

2.写我们获取联系人的工具类

    public class PhoneUtil {
        // 号码
        public final static String NUM = ContactsContract.CommonDataKinds.Phone.NUMBER;
        // 联系人姓名
        public final static String NAME = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME;
        //上下文对象
        private Context context;
        //联系人提供者的uri
        private Uri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        public PhoneUtil(Context context){
            this.context = context;
        }
        //获取所有联系人
        public List<PhoneDto> getPhone(){
            List<PhoneDto> phoneDtos = new ArrayList<>();
            ContentResolver cr = context.getContentResolver();
            Cursor cursor = cr.query(phoneUri,new String[]{NUM,NAME},null,null,null);
            while (cursor.moveToNext()){
                PhoneDto phoneDto = new PhoneDto(cursor.getString(cursor.getColumnIndex(NAME)),cursor.getString(cursor.getColumnIndex(NUM)));
                phoneDtos.add(phoneDto);
            }
            return phoneDtos;
        }
    }

3.接下来贴主页面布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.test.content.MainActivity">
        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/lv_main_list"></ListView>
    </LinearLayout>

4.该贴主Activity代码了

    public class MainActivity extends AppCompatActivity {
        private List<PhoneDto> phoneDtos;
        private ListView lv_main_list;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            check();
        }
        /**
         * 检查权限
         */
        private void check() {
            //判断是否有权限
            if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS)
                    != PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_CONTACTS},201);
            }else{
                initViews();
            }
        }
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if(requestCode==201){
                initViews();
            }else{
                return;
            }
        }
        private void initViews() {
            PhoneUtil phoneUtil = new PhoneUtil(this);
            phoneDtos = phoneUtil.getPhone();
            lv_main_list = (ListView) findViewById(R.id.lv_main_list);
            MyAdapter myAdapter = new MyAdapter();
            lv_main_list.setAdapter(myAdapter);
            //给listview增加点击事件
            /*lv_main_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    //拨打电话
                    Intent intent = new Intent();
                    intent.setAction("android.intent.action.CALL");
                    intent.addCategory(Intent.CATEGORY_DEFAULT);
                    intent.setData(Uri.parse("tel:"+phoneDtos.get(position).getTelPhone()));
                    startActivity(intent);
                }
            });*/
        }
        //自定义适配器
        private class MyAdapter extends BaseAdapter {
            @Override
            public int getCount() {
                return phoneDtos.size();
            }
            @Override
            public Object getItem(int position) {
                return phoneDtos.get(position);
            }
            @Override
            public long getItemId(int position) {
                return position;
            }
            @SuppressLint("NewApi")
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                PhoneDto phoneDto = phoneDtos.get(position);
                LinearLayout linearLayout = new LinearLayout(MainActivity.this);
                LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.WRAP_CONTENT);
                layoutParams.weight = 1;
                TextView tv_name = new TextView(MainActivity.this);
                tv_name.setId(View.generateViewId());
                tv_name.setLayoutParams(layoutParams);
                tv_name.setText(phoneDto.getName());
                TextView tv_num = new TextView(MainActivity.this);
                tv_num.setId(View.generateViewId());
                tv_num.setLayoutParams(layoutParams);
                tv_num.setText(phoneDto.getTelPhone());
                linearLayout.addView(tv_name);
                linearLayout.addView(tv_num);
                return linearLayout;
            }
        }
    }

5.好了这样的话就已经完成了,大家有什么问题可以在下方留言。

目录
相关文章
|
2月前
|
Android开发 数据安全/隐私保护 虚拟化
安卓手机远程连接登录Windows服务器教程
安卓手机远程连接登录Windows服务器教程
127 4
|
3月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
89 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
3月前
|
Ubuntu Linux Android开发
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
本文介绍了如何在Android设备上安装Termux和AnLinux,并通过这些工具运行Ubuntu系统和桌面环境。
204 2
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
|
2月前
|
安全 搜索推荐 Android开发
Android vs. iOS:解锁智能手机操作系统的奥秘####
【10月更文挑战第21天】 在当今这个数字化时代,智能手机已成为我们生活中不可或缺的伙伴。本文旨在深入浅出地探讨两大主流操作系统——Android与iOS的核心差异、优势及未来趋势,帮助读者更好地理解这两个平台背后的技术哲学和用户体验设计。通过对比分析,揭示它们如何塑造了我们的数字生活方式,并展望未来可能的发展路径。无论您是技术爱好者还是普通用户,这篇文章都将带您走进一个充满创新与可能性的移动世界。 ####
99 3
|
3月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
120 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
Web App开发 Android开发
利用firefox调试安卓手机端web
该教程详细介绍如何通过Firefox浏览器实现手机与电脑的远程调试。手机端需安装最新版Firefox,并按指定步骤设置完成;电脑端则需安装15版及以上Firefox。设置完成后,通过工具栏中的“远程调试”选项,输入手机IP地址即可连接。连接确认后,即可使用电脑端Firefox调试器调试手机上的Web信息。注意,调试前手机需提前打开目标网页。
114 2
|
3月前
|
Android开发 iOS开发 UED
安卓与iOS的较量:谁才是智能手机市场的王者?
本文将深入探讨安卓和iOS两大智能手机操作系统之间的竞争关系,分析它们各自的优势和劣势。通过对比两者在市场份额、用户体验、应用生态等方面的表现,我们将揭示出谁才是真正的市场领导者。无论你是安卓粉丝还是iOS忠实用户,这篇文章都将为你提供一些有趣的观点和见解。
|
5月前
|
编解码 安全 Ubuntu
Android Selinux 问题处理笔记
这篇文章是关于处理Android系统中SELinux权限问题的笔记,介绍了如何通过分析SELinux拒绝的日志、修改SELinux策略文件,并重新编译部署来解决权限问题,同时提供了一些SELinux的背景知识和实用工具。
149 0
|
7月前
|
网络协议 Android开发 数据安全/隐私保护
Android手机上使用Socks5全局代理-教程+软件
Android手机上使用Socks5全局代理-教程+软件
5193 2
|
8月前
|
监控 安全 Android开发
【新手必读】Airtest测试Android手机常见的设置问题
【新手必读】Airtest测试Android手机常见的设置问题
228 0