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();
    }

 

posted @ 2019-05-07 08:22  雨后观山色  阅读(1630)  评论(0编辑  收藏  举报