Android Studio beginner example: ContentProvider reads mobile phone address book

The experiment is to read the mobile phone address book through ContentProvider

Knowledge points include RecyclerView control, UriMatcher, ContentResolver

First look at the effect, display the phone address book

 The first is the layout code of the interface

activity_main59.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=".MainActivity59">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#42BCF3"
        android:gravity="center"
        android:text="通讯录"
        android:textColor="#FFFFFF"
        android:textSize="30dp" />

    <androidx.recyclerview.widget.RecyclerView

        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#E4E0E0"
        />
</LinearLayout>

The second is the item layout code of RecyclerView, which uses CardView for convenient and quick storage of rounded corners.

main59_item.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:padding="40dp"
    app:cardCornerRadius="40px"
    android:layout_marginTop="20dp"
    android:background="@color/white">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/txlogo"/>
    <LinearLayout
        android:layout_marginLeft="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓名"
            android:textSize="20dp"
            android:textStyle="bold" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="号码"
            android:layout_marginTop="10dp"
            android:id="@+id/number"
            android:textSize="20dp"/>
    </LinearLayout>
    </LinearLayout>

</androidx.cardview.widget.CardView>

A contact entity class

Communication
public class Communication {
    private  String name;
    private String number;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Communication(String name, String number) {
        this.name = name;
        this.number = number;
    }
}
Adapter for RecyclerView:
Main59 Adapter
import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

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

import org.jetbrains.annotations.NotNull;

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

public class Main59Adapter extends RecyclerView.Adapter<Main59Adapter.MyViewHolder> {

    private  RecyclerView mRv;
    private Context context;
    private List<Communication> dataSource;


    public Main59Adapter(Context context,RecyclerView recyclerView){
        this.context=context;
        this.dataSource=new ArrayList<>();
        this.mRv=recyclerView;
    }
    public void setDataSource(List<Communication> dataSource) {
        this.dataSource = dataSource;
        notifyDataSetChanged();
    }


    class  MyViewHolder extends RecyclerView.ViewHolder{

        TextView name,number;
        public MyViewHolder(@NonNull @NotNull View itemView) {
            super(itemView);
            name=itemView.findViewById(R.id.name);
            number=itemView.findViewById(R.id.number);
        }
    }

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

    @Override
    public void onBindViewHolder(@NonNull @NotNull MyViewHolder holder, int position) {
        holder.name.setText(dataSource.get(position).getName());
        holder.number.setText(dataSource.get(position).getNumber());

    }

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

logic code

MainActivity59

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

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.view.ViewGroup;

import org.jetbrains.annotations.NotNull;

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

public class MainActivity59 extends AppCompatActivity {
/*
* ContentProvider
* 我们想在自己的应用中访问别的应用,或者说一些ContentProvider暴露给我们的一些数据, 比如手机联系人,短信等!我们想对这些数据进行读取或者修改,这就需要用到ContentProvider了
* 我们自己的应用,想把自己的一些数据暴露出来,给其他的应用进行读取或操作,我们也可以用 到ContentProvider,另外我们可以选择要暴露的数据,就避免了我们隐私数据的的泄露
* 并不仅仅可以查数据,根据权限 还能增删改数据
* */
    RecyclerView recyclerView;
    Cursor cursor;
    List<Communication>communications=new ArrayList<>();
    private  Main59Adapter mAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main59);
        //动态申请权限
        getContacts();
        recyclerView=findViewById(R.id.rv);
        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        mAdapter=new Main59Adapter(this,recyclerView);

        recyclerView.setAdapter(mAdapter);
        mAdapter.setDataSource(communications);

    }


//获取手机联系人
    private void getContacts(){
        //①查询raw_contacts表获得联系人的id
        ContentResolver resolver = getContentResolver();
        Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        //查询联系人数据
        cursor = resolver.query(uri, null, null, null, null);
        cursor.moveToFirst();
       do
        {
            //获取联系人姓名,手机号码
            String cName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String cNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            communications.add(new Communication(cName,cNum));
        }while (cursor.moveToNext());
        cursor.close();
    }



}

Also note that in AndroidManifest.xml

Add permissions:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 手机联系人 -->

You can browse the information to apply statically or dynamically, or you can directly use the mobile phone system to grant the mobile phone address book permission to the APP

Guess you like

Origin blog.csdn.net/m0_59558544/article/details/130617474