Android Studio初学者实例:ContentProvider读取手机通讯录

这篇具有很好参考价值的文章主要介绍了Android Studio初学者实例:ContentProvider读取手机通讯录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

该实验是通过ContentProvider读取手机通讯录

知识点包含了RecyclerView控件、UriMatcher、ContentResolver

先看效果,显示手机通讯录

android studio 读取手机通讯录运行结果,Android初学者,android studio,android

 首先是界面的布局代码

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>

其次是RecyclerView的item布局代码,其中使用了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>

一个联系人的实体类

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;
    }
}
RecyclerView的适配器:
Main59Adapter
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();
    }
}

逻辑代码

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



}

另外请注意在AndroidManifest.xml

添加权限:

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

可以翻看资料进行静态或动态申请,也可以直接进行手机系统将手机通讯录权限给APP

这里给出一个例子:

点击按钮没有权限申请权限,有权限跳转通讯录界面,注意:这只是个例子需要你修改,

一般报错如下是这个原因:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mk.zhengtailai.PersonalBankManager/com.mk.zhengtailai.PersonalBankManager. TXLActivity}: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts. ContactsProvider2 from ProcessRecord{85e7d40 8538:com.mk.zhengtailai. PersonalBankManager/u0a124} (pid=8538, uid=10124) requires android.permission. READ_CONTACTS or android.permission.WRITE_CONTACTS

 view.findViewById(R.id.button5).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(ContextCompat.checkSelfPermission(getContext(), Manifest.permission.READ_CONTACTS)
                        != PackageManager.PERMISSION_GRANTED){
                    ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.READ_CONTACTS},1);
                }else {
                    Intent intent=new Intent(getContext(),TXLActivity.class);
                    startActivity(intent);
                }
            }
        });

今天又写了一遍发现,手机没有通讯录的话会报错:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mk.zhengtailai.PersonalBankManager/com.mk.zhengtailai.PersonalBankManager. TXLActivity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

所以我就随便加个try处理一下:文章来源地址https://www.toymoban.com/news/detail-777933.html

 try {
         Intent intent=new Intent(getContext(),TXLActivity.class);
         startActivity(intent);
      }catch (Exception e){
          Toast.makeText(getContext(), "通讯录无联系人", Toast.LENGTH_SHORT).show();
       }

到了这里,关于Android Studio初学者实例:ContentProvider读取手机通讯录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Android Studio初学者实例:SQLite实验:绿豆通讯录

    本次实验是使用SQLite对一个通讯录表进行简单增删改查 以下是实验效果:  首先是继承SQLiteOpenHelper的数据库自定义类 对于此类必须继承于SQLiteOpenHelper ,当new创造该类的实例的时候会执行创建数据库以及表的操作,例如本代码中数据库名为itcast,数据库表名为informatoin。db

    2024年02月08日
    浏览(36)
  • Android Studio初学者实例:Fragment学习--仿美团外卖界面

    本次课程为Fragment为主题,课程的示例仿美团外卖界面,不同于底部导航栏的Fragment案例,此界面分为左侧切换与顶部切换。本文先是发布代码与效果,后续讲解将会在后续补充。先看看效果: 首先是布局文件代码:Activity布局:activity_main.xml: 首先父布局用的LinearLayout布局,

    2024年02月03日
    浏览(50)
  • Android Studio初学者实例:音乐播放器与Service学习

    本次一个案例实现的一个简单的音乐播放器 用到的知识点最主要的几点是:Service、handler(实现音乐播放的进度条更新与图片旋转)以及用于播放音频的MediaPlayer 看一下案例效果:  由于Service是Android的四大组件之一,Activity、Service等等一个重要知识点就是生命周期的问题,

    2024年02月03日
    浏览(31)
  • git初学者使用教程(包含Android studio中git使用)

    参考博客 git地址 如: 点击创建后会出这个页面 我推荐使用这个部分命令行来设置仓库 在想要创建git仓库的文件夹右键打开Git Bash Here(前提是安装了git) 输入命令(每次输入一句) 3. 右键打开Git设置 在Git中就会出现用户信息(我电脑的Git用户是别人的,我没有修改) 先看

    2024年02月06日
    浏览(34)
  • R语言爬虫实例 初学者自用

    本文记录了使用rvest RSelenium 包进行爬虫与网页渲染的相关知识点及本人的编程操作过程。涉及到基本爬取操作、爬取缺失部分如何处理、操作网页过滤等步骤。 本人非计算机专业,如有措辞不慎敬请提出。 这学期为了凑学分,选了一门R语言的课,才发现R语言远比我们想象

    2024年02月02日
    浏览(33)
  • OpenCV实例解析(OpenCV初学者)

    一、计算机视觉 1.定义:给计算机安装上眼睛(照相机)和大脑(算法),让其能感知周围的环境。它是对生物视觉的一种模拟,通常的做法是通过对采集的图像或视频进行处理来获得相应场景的三维信息。 2.应用: 计算机科学和工程、信号处理、物理学、应用数学和统计学

    2024年02月08日
    浏览(32)
  • 初学者使用R语言读取excel/csv/txt的注意事项

    本文首发于: 医学和生信笔记 ,完美观看体验请至公众号查看本文。 本文面向R语言初学者,尤其是生物医药领域的初学者,大佬勿喷~ 在之前的推文中,我们用两个视频详细介绍了 R语言、rtools、Rstudio以及R包的安装 ,解决新手最先碰到的两大难题! 接下来大家就面临把数

    2023年04月19日
    浏览(35)
  • 在 Android 中使用 C/C++:初学者综合指南

    Java 作为一种编程语言,具有许多良好的功能,使其成为应用程序开发的首选语言。它独立于平台(因为虚拟机执行)、JIT 编译、多线程支持以及为程序员提供的富有表现力的简单语法。由于其与平台无关的特性,Java 包可以跨 CPU 架构移植,这使得库开发变得更加容易,从而

    2024年03月13日
    浏览(51)
  • Mac安装配置Visual Studio Code(vscode)以及Java环境详细教程(初学者必看)

    原本博主今天想继续给大家出Java接下来的教程,但是就在昨天我在配置vscode的时候遇到了一些问题,Windows系统的小伙伴配置起来肯定很方便,但是在Mac的小伙伴却显得十分无奈,所以我想给大家出一篇Mac的Visual Studio Code配置以及Java环境搭建教程! 博客主页:Jovy.的博客_CSDN博客-领

    2024年02月01日
    浏览(66)
  • 初学者不会写接口怎么办?微软Visual Studio 2022无脑式API接口创建——Swagger一键导入APIKit快速测试

    目录 VsualStudio2022各版本说明 社区版本具体说明 VisualStudio2022下载选项 VisualStudio2022启动样式 VisualStudio2022图标样式 VisualStudio2022初始内存消耗 创建项目ASP.NET Core项目 具体项目创建 编辑项目名称与项目位置 创建配置 创建API控制器 修改路由配置 配置跨域 准备创建接口 创建【

    2024年02月05日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包