美文网首页
Android——通讯录

Android——通讯录

作者: 鱼嘿蛮仁 | 来源:发表于2024-09-24 10:43 被阅读0次

一、权限:

在Android系统中,访问通讯录需要相应的权限。从Android 6.0(API 23)开始,权限被划分为正常权限和敏感权限,访问通讯录属于敏感权限,因此需要动态申请。
首先,在你的AndroidManifest.xml中添加权限声明:

    <!--允许应用程序写出到联系人-->
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
    <!--允许应用程序读取到联系人-->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>

然后,在Activity代码中检查和请求权限:

private static final int MY_PERMISSIONS_REQUEST_CODE = 1;


// 判断当前是否有权限
        if (ContextCompat.checkSelfPermission(TwoActivity.this, android.Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(TwoActivity.this, new String[]{android.Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS}, MY_PERMISSIONS_REQUEST_CODE);
        } else {
            // 权限已被授权,执行操作
        }

//权限请求结果的回调方法
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_CODE:
                // 结果是授予权限则读取联系人列表
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 权限被授予,执行操作

                } else {
                    Toast.makeText(this, "you denied the permission", Toast.LENGTH_SHORT).show();
                }
                break;

            default:
        }
    }

二、通讯录数据库表

Android通讯录主要包括以下几个表

  1. ContactsContract.Contacts:表示不同联系人的行,基于聚合的原始联系人行。这个表保存了本机保存的所有联系人,每个联系人占一行,包含了联系人的基本信息,如ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加到收藏夹等信息。

  2. ContactsContract.RawContacts:包含联系人数据摘要的行,针对特定用户帐户和类型。这个表保存了所有创建过的手机联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。

  3. ContactsContract.Data:包含原始联系人详细信息(例如电子邮件地址或电话号码)的行。这个表保存了所有创建过的手机联系人的所有信息,每个字段占一行,通过MimeTypeIDRawContactIDRawContacts表和Mimetypes表联系起来。联系人的所有信息保存在列data1data15中,各列中保存的内容根据MimeTypeID的不同而不同。

  4. Mimetypes:定义了所有的MimeTypeID,即联系人的各个字段的唯一标志。这个表列出了不同的数据类型,如电子邮件、电话号码、姓名等,通过MimeTypeID的值来区分不同行数据的真实类型。

关于联系人的一些URI
管理联系人的Uri:
ContactsContract.Contacts.CONTENT_URI
管理联系人的电话的Uri:
ContactsContract.CommonDataKinds.Phone.CONTENT_URI
管理联系人的Email的Uri:
ContactsContract.CommonDataKinds.Email.CONTENT_URI
(注:Contacts有两个表,分别是rawContact和Data,
rawContact记录了用户的id和name,
其中id栏名称为:ContactsContract.Contacts._ID,
name名称栏为 :ContactContract.Contracts.DISPLAY_NAME,
其余的电话、Email信息都在Data表:
电话信息表的外键id为:ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
电话号码栏名称为:ContactsContract.CommonDataKinds.Phone.NUMBER.
data表中Email地址栏名称为:
ContactsContract.CommonDataKinds.Email.DATA
其外键栏为:ContactsContract.CommonDataKinds.Email.CONTACT_ID)

三、通讯录的增删改查

 @SuppressLint("Range")
    public void query() {
        Cursor cursor = null;
        try {

            Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; //Data表查询 联系人电话Uri;
            cursor = getContentResolver().query(uri, null, null, null, null);
            if (cursor != 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));
                    Log.d(TAG, "联系人:${displayName}"+displayName+"---电话:${number}"+number);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    }

    public void insert() {
        String name = "season";
        String phone = "123456789101";
        //首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
        ContentValues values = new ContentValues();
        Uri uri = getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values);
        long rawContentID = ContentUris.parseId(uri);

        //往data表入姓名数据
        values.clear();
        values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContentID);
        values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
        values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name);
        getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);

        //往data表入电话数据
        values.clear();
        values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContentID);
        values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
        values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
        values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);
        getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);


    }

    public void update() {

        String name_update = "season";
        String phone_update = "111";

        Long rawContactId = 0L;
        ContentResolver resolver = getContentResolver();
        ContentValues values1 = new ContentValues();
        values1.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone_update);
        if (!name_update.equals("")) {
            Cursor cursor2 = getContentName(name_update);
            if (cursor2.moveToFirst()) {
                rawContactId = cursor2.getLong(0);
            }
            resolver.update(ContactsContract.Data.CONTENT_URI, values1, "mimetype=? and raw_contact_id=?"
                    , new String[]{ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, rawContactId + ""});
            cursor2.close();
        }


    }

    private Cursor getContentName(String name_search) {

        Cursor cursor = getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + "=?", new String[]{name_search}, null);
        return cursor;
    }



    public void delete() {
        getContentResolver().delete(ContactsContract.Data.CONTENT_URI,null,null);
    }

}

相关文章

网友评论

      本文标题:Android——通讯录

      本文链接:https://www.haomeiwen.com/subject/mknkhjtx.html