017 Android 获取手机SIM卡序列号和读取联系人
1.获取手机SIM卡序列号
//5.存储sim卡系列号 //5.1获取sim卡系列号 TelephonyManager manager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); //以下if内容为自动生成 if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } String simSerialNumber=manager.getSimSerialNumber();
2.读取系统联系人
系统联系人提供了一个内容提供者,通过内容解析器,匹配Url地址
(1)内容解析器
(2)Url地址,查看系统联系人数据库,内容提供者源码
先看清单文件
后看java类(联系人数据库有多张表)
Uri地址格式:contents://com.android.contacts/表名
获取联系人数据库:
data--->data--->com.android.providers.contacts--->database---->contacts2.db
(3)系统联系人数据库中有3张核心表,表结构
<1>raw_contacts 联系人表: contact_id 联系人唯一性id值
<2>data 用户信息表:raw_contact_id作为外键,和raw_contacts中contact_id做关联查询
获取data1字段,包含了电话号码以及联系人名称
mimetype_id字段,包含了当前行data1对应的数据类型
<3>mimetypes 类型表: 获取data表中mimetype_id和mimetypes中_id做关联查询,获取指向的信息类型
电话号码:vnd.android.cursor.item/phone_v2
用户名称:vnd.android.cursor.item/name
google公司提供:data表和mimetypes生成了一个视图
(4)表的访问方式(Uri)
content://com.android.contacts/raw_contacts
content://com.android.contacts/data
(5)源码
/** * 获取系统联系人数据方法 */ private void initData() { //读取联系人,可能是一个耗时操作,最好放到一个子线程中处理 new Thread(){ @Override public void run() { //1.获取内容解析器对象 ContentResolver contentResolver=getContentResolver(); //2.查询系统联系人数据库(添加权限) //参数1:raw_contacts表的访问路径,参数2(projection):查询的字段,参数3:查询条件,参数5:排序方式 Cursor cursor=contentResolver.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"contact_id"}, null, null, null ); contactsList.clear(); //3.循环游标,直到没有数据为止(循环一次,读取一个联系人的姓名和电话号码) while (cursor.moveToNext()){ String id=cursor.getString(0); //Log.i(tag,"id:"+id); //4.根据用户唯一性id值,查询data表和mimetype表生成的视图,获取data和mimetype字段 Cursor indexCursor=contentResolver.query(Uri.parse("content://com.android.contacts/data"), new String[]{"data1","mimetype"}, "raw_contact_id=?", new String[]{id}, null); HashMap<String,String> hashMap=new HashMap<>(); //5.循环获取每一个联系人的电话号码以及姓名、数据类型 while (indexCursor.moveToNext()){ Log.i(tag,"data="+indexCursor.getString(0)); Log.i(tag,"mimetype="+indexCursor.getString(1)); //6.区分数据类型给hashMap填充数据 String data=indexCursor.getString(0); String type=indexCursor.getString(1); if(type.equals("vnd.android.cursor.item/phone_v2")){ if(!TextUtils.isEmpty(data)){ hashMap.put("phone",data); } }else if(type.equals("vnd.android.cursor.item/name")){ if(!TextUtils.isEmpty(data)){ hashMap.put("name",data); } } } indexCursor.close(); contactsList.add(hashMap); //将hashmap值存放到list中 } cursor.close(); //7.消息机制 System.out.println(tag+contactsList); handler.sendEmptyMessage(0); //告诉主线程数据已经准备好了 } }.start(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)