移动应用开发实验-内容提供者-ContentResolver的使用

这篇具有很好参考价值的文章主要介绍了移动应用开发实验-内容提供者-ContentResolver的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  • 本人将所学和前人的成果和经验结合,仅供学习和参考!!!
  • 本文大部分源码内容有清晰的注释,请认真阅读!

读取通讯录信息

要求

  • 通过线性布局和相对布局来搭建通讯录界面,界面效果如下图所示。创建布局文件contact_item.xml、导入界面图片、放置界面控件、创建条目界面的背景文件。创建ContactInfo类、在该类中创建联系人信息的属性。申请读取手机通讯录的权限,将数据显示到通讯录界面上。在AndroidMainfest.xml文件中添加读取系统通讯录的权限。运行Contacts程序,查看通讯录界面效果。
    移动应用开发实验-内容提供者-ContentResolver的使用

环境

  • minSdk 24
  • targetSdk 33
  • sourceCompatibility JavaVersion.VERSION_1_8
  • targetCompatibility JavaVersion.VERSION_1_8
  • gradle-7.5
  • Android Studio Electric Eel | 2022.1.1 Patch 1
  • 知识储备:RecyclerView布局和ContentResolver的内容学习储备

具体实现

  • 记得提前将需要的头像图片导入到drawable目录下

主页面布局(activity_main.xml)

移动应用开发实验-内容提供者-ContentResolver的使用

<?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"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="通讯录"
        android:gravity="center"
        android:background="#4889f4"
        android:textColor="@color/white"
        android:textSize="20sp"
        />
    <androidx.recyclerview.widget.RecyclerView
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:id="@+id/list"
        android:layout_height="wrap_content"
        />

</LinearLayout>

关于RecyclerView库的相关问题

  • 建议:该本地环境中,如果可以正常使用RecyclerView布局,即可不用引入RecyclerView库依赖,好像在其他的包中已经默认包含(亲测,正常运行程序)
  • 如果,要引入,请参考一下操作

添加RecyclerView库操作

移动应用开发实验-内容提供者-ContentResolver的使用
移动应用开发实验-内容提供者-ContentResolver的使用

com.android.support:recyclerview-v7

移动应用开发实验-内容提供者-ContentResolver的使用

  • 然后,可以在Android视图下,模块的build.grade配置文件dependencies中看到添加的依赖

解决报错

  • 在Android视图下,模块的build.properties配置文件中添加
android.useAndroidX=true #如果该项本来存在,则不用添加
android.enableJetifier=true

Item布局(info.xml)

移动应用开发实验-内容提供者-ContentResolver的使用

<?xml version="1.0" encoding="utf-8"?>
<!--item布局文件-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:orientation="horizontal"
    >
    <ImageView
        android:id="@+id/iv"
        android:layout_width="66dp"
        android:layout_height="67dp"
        android:src="@drawable/contact_photo"
        />
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="5dp">
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:textColor="#ff8f03" />

        <TextView
            android:id="@+id/telephoneNumber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:layout_marginTop="10dp"
            android:layout_below="@+id/name"
            android:textColor="#ff716c6d"
            android:maxLines="2"
            android:ellipsize="end"/>
    </RelativeLayout>

</LinearLayout>

添加访问权限

  • AndroidMainfest.xmlapplication上边标签添加通讯录访问权限
<!--添加读取系统通讯录的权限-->
<uses-permission android:name="android.permission.READ_CONTACTS" />

编写实体类(ContactInfo.java)

/**
 * 实体类,用于存储联系人信息
 */
public class ContactInfo {
    private String name, telephoneNumber;

    public String getName() {
        return name;
    }

    public String getTelephoneNumber() {
        return telephoneNumber;
    }

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

    public void setTelephoneNumber(String telephoneNumber) {
        this.telephoneNumber = telephoneNumber;
    }
}

编写适配器(MyAdapter.java)

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

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

import java.util.List;

/**
 * 自定义类实现数据适配
 */
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {
    private Context myContext;
    private List<ContactInfo> myContactInfos;
    public MyAdapter(Context context,List<ContactInfo> contactInfoList){
        this.myContext=context;
        this.myContactInfos=contactInfoList;
    }

    /**
     * 加载item界面的布局文件,并将RecyclerView.ViewHolder类的对象返回
     * @param parent The ViewGroup into which the new View will be added after it is bound to
     *               an adapter position.
     * @param viewType The view type of the new View.
     *
     * @return
     */
    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view=View.inflate(myContext,R.layout.info,null);
        MyHolder myHolder=new MyHolder(view);
        return myHolder;
    }

    /**
     * onBindViewHolder 将获取的数据设置到对应的控件上
     * @param holder The ViewHolder which should be updated to represent the contents of the
     *        item at the given position in the data set.
     * @param position The position of the item within the adapter's data set.
     */
    @Override
    public void onBindViewHolder(@NonNull MyHolder holder, int position) {
        ContactInfo contactInfo=myContactInfos.get(position);
        holder.name.setText(contactInfo.getName());
        holder.telephoneNumber.setText(contactInfo.getTelephoneNumber());
    }

    /**
     * 获取列表条目总数
     * @return
     */
    @Override
    public int getItemCount() {
        return myContactInfos.size();
    }

    /**
     * 创建MyHolder类,继承RecyclerView.ViewHolder类,在该类中获取Item界面上的控件
     */
    class MyHolder extends RecyclerView.ViewHolder{

        TextView name,telephoneNumber;
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            name=itemView.findViewById(R.id.name);
            telephoneNumber=itemView.findViewById(R.id.telephoneNumber);
        }
    }
}

编写主类(MainActivity.java)


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

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

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

public class MainActivity extends AppCompatActivity {
    private RecyclerView list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //申请权限
        getPermission();

        // 获取RecyclerView控件
        list=findViewById(R.id.list);
        // 设置item分割线
        list.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
        // 设置RecyclerView的显示方式为垂直布局
        list.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,true));
        // 通过setAdapter方法将适配器对象设置到RecyclerView控件上
        MyAdapter myAdapter=new MyAdapter(this,getContacts());
        list.setAdapter(myAdapter);

    }

    /**
     * 申请权限
     */
    public void getPermission(){
        //检查权限是否允许
        if (ActivityCompat.checkSelfPermission(this,"android.permission.READ_CONTACTS")!= PackageManager.PERMISSION_GRANTED){
            //请求android.permission.READ_CONTACTS权限
            ActivityCompat.requestPermissions(this,new String[]{"android.permission.READ_CONTACTS"},666);
            //shouldShowRequestPermissionRationale 检查是否需要展示请求权限的提示
            //首次运行程序时,选择允许权限访问,之后再次打开应用就不会出现请求权限的提示
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,"android.permission.READ_CONTACTS")){
                Toast.makeText(this, "需要开启联系人权限", Toast.LENGTH_SHORT).show();
            }else {
                ActivityCompat.requestPermissions(this,new String[]{"android.permission.READ_CONTACTS"},666);
            }
        }
    }

    /**
     * 手动请求权限之后的结果回调
     * @param requestCode 请求吗
     * @param permissions 系统的权限数据
     * @param grantResults 请求码的状态
     *
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode==666){
            /*
                判断权限数组中是否有一个状态值为android.permission.READ_CONTACTS 该状态值表示允许读取系统短信。
                如果有该状态值,提示联系人权限申请成功,否则,失败
            * */
            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();
                    return;
                }
            }
            Toast.makeText(this, "联系人权限申请失败", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 通过ContactInfo类和cursor遍历获取系统通讯录的联系人信息
     * @return
     */
    public List<ContactInfo> getContacts(){
        List<ContactInfo> contactInfos=new ArrayList<>();
        Cursor cursor01=getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
        while (cursor01.moveToNext()){
            ContactInfo contactInfo=new ContactInfo();
            String Name,phone,id;
            //获取name,并存入contactInfo
            Name=cursor01.getString(cursor01.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
            contactInfo.setName(Name);
            id=cursor01.getString(cursor01.getColumnIndexOrThrow(ContactsContract.Contacts._ID));

            //获取phoneNumber,并存入contactInfo
            Cursor cursor02=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+id,null,null);
            while (cursor02.moveToNext()){
                phone=cursor02.getString(cursor02.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
                contactInfo.setTelephoneNumber(phone);
            }
            //将其contactInfo存入contactInfos集合中
            contactInfos.add(contactInfo);
            //关闭游标
            cursor02.close();
        }
        cursor01.close();
        //最终返回list集合
        return contactInfos;
    }

}

运行测试

移动应用开发实验-内容提供者-ContentResolver的使用

移动应用开发实验-内容提供者-ContentResolver的使用文章来源地址https://www.toymoban.com/news/detail-482686.html

到了这里,关于移动应用开发实验-内容提供者-ContentResolver的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 简单步骤:Android studio 内容提供者 - 实现建立手机通讯录界面,读取系统联系人

    提示:本篇文章将会尽量保持精简,同时请诸位敲写代码时保持耐心,三连是最大的支持! 文章目录 前言 一、项目介绍 二、使用步骤 1.创建程序 2.添加 recyclerview-v7 库 3.放置界面控件 4.搭建界面布局 5.封装实体类 6.编写数据适配器 7.实现显示界面数据功能 8.去掉默认标题栏

    2024年02月08日
    浏览(54)
  • 移动应用开发 试题 复习

    1、Android 开发中常用的数据库是( ) A、 SQLite B、 Oracle C、 MySql D、 SQL Server A.SQLite 2、从其他应用中读取共享的数据库数据时,需要用到的是 query 方法,返回的是 Curser 数 据,那么这个方法是哪个对象的方法。( ) A、 SQLiteDatabase B、 SQLiteOpenHelper C、 ContentProvider D、 Content

    2024年02月13日
    浏览(39)
  • 第一篇【传奇开心果系列】beeware开发移动应用:轮盘抽奖移动应用

    一、项目目标 使用beeware的toga写传奇开心果轮盘抽奖安卓手机应用和苹果手机应用 二、开发传奇开心果轮盘抽奖安卓应用编程思路 要使用Beeware的Toga库来编写一个传奇开心果轮盘抽奖安卓应用,你需要按照以下步骤进行操作: 安装Beeware:首先,你需要安装Beeware的开发工具包

    2024年01月20日
    浏览(62)
  • Android移动应用开发的学习路线

    Android移动应用开发的学习路线。以下是一个基本的学习路线,供你参考: 1. Java基础 学习Java的基本语法和面向对象编程(OOP)的概念 了解Java的数据类型、变量和常量 学习控制结构(如条件语句、循环语句)和函数 2. Android基础 了解Android平台的基本概念和架构 学习Android的

    2024年02月11日
    浏览(48)
  • 移动应用开发环境搭建Android Studio

    记得提前开启电脑虚拟化支持,具体方法可自行百度 查看是否启用虚拟化 JDK安装与卸载 由于Andriod开发使用的语言是javaKotlin,这里使用的是java语言所以需要先安装java的开发环境 所有开发 Android 应用程序需要的工具都是开源的,并且可以从互联网上下载 Android Studio 是谷歌推

    2023年04月08日
    浏览(68)
  • 移动应用开发期末复习(自用复习勿转)

    主要考察实验中的通知:notification,service。数据库的增删改查操作结合界面的一些操作。 Android是一种基于Linux的软件平台和操作系统,采用了软件堆层(Software Stack)的架构,由下往上分别是Linux内核层、硬件抽象层、系统运行时库层(又称为中间件层)、应用程序框架层和系

    2024年02月05日
    浏览(42)
  • 移动应用开发介绍及iOS方向学习路线(HUT移动组版)

    ​ 作为一个HUT移动组待了一坤年(两年半)多的老人,在这里为还在考虑进哪个组的萌新们以及将来进组的新朋友提供一份关于移动应用开发介绍以及学习路线的白话文,因为我是iOS方向的,所以学习路线就只介绍iOS了,希望这篇文章对你了解移动应用开发有帮助。 ​ 从字

    2024年02月04日
    浏览(40)
  • Flutter:跨平台移动应用开发的未来

    Flutter的背景和概述 Flutter是由Google开发的一个开源UI工具包,用于构建漂亮、快速且高度可定制的移动应用程序。它于2017年首次发布,并迅速引起了开发者们的关注。Flutter采用了一种全新的方法来构建用户界面,通过使用自绘UI技术,可以实现高性能的跨平台应用开发。 Fl

    2024年01月22日
    浏览(92)
  • 第三篇【传奇开心果系列】Vant开发移动应用:财务管理应用

    使用vant实现财务管理应用:创建一个简单的财务管理应用,用户可以记录和跟踪他们的收入和支出,并生成报表和图表展示财务状况。 1. 首先,安装并引入Vant组件库,以便使用Vant提供的丰富组件来构建财务管理应用界面。 创建一个首页,包括收入、支出、报表和图表四个

    2024年01月22日
    浏览(55)
  • WPF应用开发之控件动态内容展示

    在我们开发一些复杂信息的时候,由于需要动态展示一些相关信息,因此我们需要考虑一些控件内容的动态展示,可以通过动态构建控件的方式进行显示,如动态选项卡展示不同的信息,或者动态展示一个自定义控件的内容等等,目的就是能够减少一些硬编码的处理方式,以

    2024年02月05日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包