携帯電話のアドレス帳を読み取るAndroid開発

目次

1. アドレス帳のインターフェースレイアウト

activity_contact.xml インターフェイスのレイアウト:

contact_item.xml エントリ インターフェイスのレイアウト:

item_bg.xml 項目インターフェイスの背景ファイル (drawable フォルダーに作成):

2. Javaコード

ContactInfo.java は、連絡先情報エンティティ クラスをカプセル化します。

ContactAdapter.java データ アダプター:

ContactActivity.java は、アドレス帳のインターフェイス データを表示する機能を実現します。


 

AndroidManifest.xml にアドレス帳を読み取る権限を追加します。

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

1. アドレス帳のインターフェースレイアウト

activity_contact.xml インターフェイスのレイアウト:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ContactActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:padding="5dp"
        android:background="#BFDC9E"
        android:textSize="20sp"
        android:textColor="@color/black"
        android:text="通讯录" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_contact"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="2dp"
        android:background="#F2F4E2"/>
</LinearLayout>

contact_item.xml エントリ インターフェイスのレイアウト:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:padding="8dp"
    android:background="@drawable/item_bg">

    <ImageView
        android:id="@+id/iv_photo"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_centerVertical="true"
        app:srcCompat="@drawable/user" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/iv_photo"
        android:layout_marginTop="5dp"
        android:layout_toEndOf="@+id/iv_photo"
        android:layout_marginStart="20dp"
        android:textColor="@color/black"
        android:text="李雷" />

    <TextView
        android:id="@+id/tv_phone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/iv_photo"
        android:layout_marginBottom="5dp"
        android:layout_toEndOf="@+id/iv_photo"
        android:layout_marginStart="20dp"
        android:textColor="@color/black"
        android:text="13520677894" />
</RelativeLayout>

item_bg.xml 項目インターフェイスの背景ファイル (drawable フォルダーに作成):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#EBEFC5"/>
    <corners android:radius="10dp"/>
</shape>

2. Javaコード

ContactInfo.java は、連絡先情報エンティティ クラスをカプセル化します。

package com.example.contentprovider;

public class ContactInfo {
    private String contactName;
    private String phoneNumber;

    public String getContactName() {
        return contactName;
    }

    public void setContactName(String contactName) {
        this.contactName = contactName;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

ContactAdapter.java データ アダプター:

package com.example.contentprovider;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.MyViewHolder> {
    private Context context;
    private List<ContactInfo> contactInfoList;

    public ContactAdapter(Context context, List<ContactInfo> contactInfoList) {
        this.context = context;
        this.contactInfoList = contactInfoList;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        MyViewHolder holder = new MyViewHolder(
                LayoutInflater.from(context).inflate(
                        R.layout.contact_item,parent,false));
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.tv_name.setText((CharSequence) contactInfoList.get(position).getContactName());
        holder.tv_phone.setText((CharSequence) contactInfoList.get(position).getPhoneNumber());
    }

    @Override
    public int getItemCount() {
        return contactInfoList.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView tv_name, tv_phone;
        ImageView iv_photo;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            iv_photo = itemView.findViewById(R.id.iv_photo);
            tv_name = itemView.findViewById(R.id.tv_name);
            tv_phone = itemView.findViewById(R.id.tv_phone);
        }
    }
}

ContactActivity.java は、アドレス帳のインターフェイス データを表示する機能を実現します。

package com.example.contentprovider;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.annotation.SuppressLint;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Build;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class ContactActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact);
        init();
    }
    private void init() {
        recyclerView = findViewById(R.id.rv_contact);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        getPermissions();
    }
    String[] permissionList;

    //申请权限
    public void getPermissions() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            permissionList = new String[]{"android.permission.READ_CONTACTS"};
            ArrayList<String> list = new ArrayList<>();
            for (String s : permissionList) {
                if (ActivityCompat.checkSelfPermission(ContactActivity.this, s) !=
                        PackageManager.PERMISSION_GRANTED) {
                    list.add(s);
                }
            }
            if (list.size() > 0) {
                ActivityCompat.requestPermissions(ContactActivity.this, list.toArray(list.toArray(new String[list.size()])),1);
            } else {
                setDate();
            }
        } else {
            setDate();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1) {
            for (int i = 0; i < permissions.length; i ++) {
                if(permissions[i].equals("android.permission.READ_CONTACTS") &&
                        grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "读取通讯录权限申请成功", Toast.LENGTH_SHORT).show();
                    setDate();
                } else {
                    Toast.makeText(this, "读取通讯录权限申请失败", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
    private void setDate() {
        List<ContactInfo> contactInfoList = getContacts();
        ContactAdapter adapter = new ContactAdapter(ContactActivity.this , contactInfoList);
        recyclerView.setAdapter(adapter);
    }
    //获取通讯录数据
    private List<ContactInfo> getContacts() {
        List<ContactInfo> contactInfos = new ArrayList<>();
        Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
                null,null,null,null);
        while ( cursor.moveToNext() ) {
            @SuppressLint("Range") String id = cursor.getString(
                    cursor.getColumnIndex(ContactsContract.Contacts._ID));
            @SuppressLint("Range") String name = cursor.getString(
                    cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            @SuppressLint("Range") int isHas = cursor.getInt(
                    cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
            if (isHas > 0) {
                Cursor cursor1 = getContentResolver().query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id,
                        null, null);
                while (cursor1.moveToNext()) {
                    ContactInfo contactInfo = new ContactInfo();
                    contactInfo.setContactName(name);
                    @SuppressLint("Range") String number = cursor1.getString(
                            cursor1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).trim();
                    number = number.replace(" ","");
                    number = number.replace("-","");
                    contactInfo.setPhoneNumber(number);
                    contactInfos.add(contactInfo);
                }
                cursor1.close();
            }
        }
        cursor.close();
        return contactInfos;
    }
}

おすすめ

転載: blog.csdn.net/qq_51936803/article/details/130163724