Android Studio の初心者向けの例: ContentProvider が携帯電話の連絡先を読み取る

実験は、ContentProvider を介して携帯電話のアドレス帳を読み取ることです。

ナレッジポイントには、RecyclerView コントロール、UriMatcher、ContentResolver が含まれます

まずは効果を見て、電話のアドレス帳を表示します

 1つ目はインターフェースのレイアウトコードです。

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>

2 つ目は、RecyclerView のアイテム レイアウト コードです。このコードでは、丸い角を便利かつ迅速に保存するために CardView が使用されます。

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>

連絡先エンティティ クラス

コミュニケーション
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;
    }
}
RecyclerView 用アダプター:
Main59アダプター
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();
    }
}

ロジックコード

メインアクティビティ59

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



}

AndroidManifest.xml にも注意してください。

権限を追加します。

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

情報を参照して静的または動的に適用することも、携帯電話システムを直接使用して携帯電話のアドレス帳にアプリのアクセス許可を与えることもできます。

おすすめ

転載: blog.csdn.net/m0_59558544/article/details/130617474