ContentProvider程序之间数据的相互调用
1权限的获取和调用
权限分为普通权限和危险权限,除了日历信息,电话,通话记录,相机,通讯录,定位,麦克风,电话,传感器,界面识别(Activity-Recognition),SMS和存储权限11组是危险权限之外,其他都是普通权限。
普通权限只需要在xml文件中声明即可使用相应的权限,但是对于危险权限的获取,需要在代码中进行动态的由用户确认才行。
以打电话为例进行危险权限的调用和同意需求:在一个应用中点击按钮就可以直接到电话应用中进行电话的拨打
前置工作准备好按钮,和连接好模拟器等简单工作,然后进行申请权限操作
class PhoneCallActivity:AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.content_provider_phonecall)phone_call.setOnClickListener(){//一点击这个按钮,就要让他拨打电话,拨打电话属于危险权限,所以需要进行权限的申请,先判断当前权限是否已经被允许,如果没有被允许则需要去请求权限,三个参数,第二个参数是一个数组,存放所有需要的权限,第三个参数是一个唯一的标识,用来在下面方法中针对当前请求,进行再次处理的逻辑if(ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED){//如果当前权限还没有授权,就去请求权限ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE),1)}else{call()}}//父类的请求权限允许的解过,只要用户进行结果确认之后,不管结果如何都会调用这个方法override fun onRequestPermissionsResult(requestCode: Int,permissions: Array<out String>,grantResults: IntArray) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)when(requestCode){1->{if(grantResults.isNotEmpty()&&grantResults[0]==PackageManager.PERMISSION_GRANTED){call()}else{Toast.makeText(this,"您未授权允许进行拨号",Toast.LENGTH_SHORT).show()}}}}private fun call(){try{val intent=Intent(Intent.ACTION_CALL)intent.data= Uri.parse("tel:10086")startActivity(intent)}catch (e:SecurityException){e.printStackTrace()}}}
别忘了在xml文件中进行拨号权限的声明
<uses-permission android:name="android.permission.CALL_PHONE"/>
2使用ContentResolver来获取其他应用中的数据
场景:在当前应用程序中获取通讯录
前置准备,一个按钮,一个即将展示通讯录内容的recyclerview界面,在模拟器上新建几个用户,
确定其用户名和电话,然后开始进行数据的调用的权限访问工作
1因为涉及到点击按钮时进行界面的跳转,所以需要声明contact通讯录的实体类,而且还要其进行实现序列化接口,因为要在intent中传输
1实体类:
import java.io.Serializable
class ContactFriend(val name:String,val number:String):Serializable
2
class PhoneCallActivity:AppCompatActivity() {//存放所有读取的通讯录名单private lateinit var list:ArrayList<ContactFriend>override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.content_provider_phonecall)phone_call.setOnClickListener(){//一点击这个按钮,就要让他拨打电话,拨打电话属于危险权限if(ContextCompat.checkSelfPermission(this,Manifest.permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED){//如果当前权限还没有授权,就去请求权限ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE),1)}else{call()}}//一点击之后需要跳转到另一个界面上用来展示当前的所有数据,所有需要跳转到一个新的界面show_contact.setOnClickListener(){//当前权限是否获取,如果没获取就去申请,如果获取过了,就直接进行跳转显示即可if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS)!=PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_CONTACTS),2)}else{readContacts()val intent=Intent(this,DisplayPhoneContact::class.java)intent.putExtra("contacts",list)//Log.d("tong","第一个好友姓名${list[0].name}第一个好友电话${list[0].number}")startActivity(intent)}}}//父类的请求权限允许的解过override fun onRequestPermissionsResult(requestCode: Int,permissions: Array<out String>,grantResults: IntArray) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)when(requestCode){1->{if(grantResults.isNotEmpty()&&grantResults[0]==PackageManager.PERMISSION_GRANTED){call()}else{Toast.makeText(this,"您未授权允许进行拨号",Toast.LENGTH_SHORT).show()}}2->{if(grantResults.isNotEmpty()&&grantResults[0]==PackageManager.PERMISSION_GRANTED){//readContacts()//Toast.makeText(this,"感谢您的信任",Toast.LENGTH_SHORT).show()readContacts()val intent=Intent(this,DisplayPhoneContact::class.java)intent.putExtra("contacts",list)startActivity(intent)}else{Toast.makeText(this,"您未授权允许查看通讯录",Toast.LENGTH_SHORT).show()}}}}private fun call(){try{val intent=Intent(Intent.ACTION_CALL)intent.data= Uri.parse("tel:10086")startActivity(intent)}catch (e:SecurityException){e.printStackTrace()}}@SuppressLint("Range")private fun readContacts(){list= ArrayList<ContactFriend>()contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null)?.apply{while(moveToNext()){val name=getString(getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))val number=getString(getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))list.add(ContactFriend(name,number))}close()}}
}
3获取到数据之后,在另一个界面进行数据的展示所以需要layout中由recyclerview展示数据,所有又牵扯到Adapter的编写,如下
每个item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="90dp"><TextViewandroid:id="@+id/contact_name"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><TextViewandroid:id="@+id/contact_number"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/></LinearLayout>
展示通讯录数据界面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_phone_contact"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>
adapter的编写
package com.njupt.kotlinlearn.contendProviderimport android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.njupt.kotlinlearn.R
import com.njupt.kotlinlearn.entity.ContactFriendclass ContactsAdapter (var contactList:List<ContactFriend>):RecyclerView.Adapter<ContactsAdapter.ViewHolder>(){inner class ViewHolder(view:View):RecyclerView.ViewHolder(view){val name:TextView=view.findViewById(R.id.contact_name)val number:TextView=view.findViewById(R.id.contact_number)}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ContactsAdapter.ViewHolder {val view=LayoutInflater.from(parent.context).inflate(R.layout.content_provider_display_contact_item,parent,false)var viewHolder=ViewHolder(view)return viewHolder}override fun onBindViewHolder(holder: ContactsAdapter.ViewHolder, position: Int) {val contact=contactList[position]holder.name.text=contact.nameholder.number.text=contact.number}override fun getItemCount(): Int {return contactList.size}}
数据展示
class DisplayPhoneContact:AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.content_provider_display_contact)//跳转过来之后,获取到intent中的数据,然后进行绑定Adapter数据展示val contacts=intent.getSerializableExtra("contacts") as ArrayList<ContactFriend>//准备好数据之后可以进行数据在当前界面的展示,绑定Adapterval recyclerView=findViewById<RecyclerView>(R.id.recycler_phone_contact)val layoutManager=LinearLayoutManager(this)recyclerView.layoutManager=layoutManagerrecyclerView.adapter=ContactsAdapter(contacts)}
}
最后即可将数据进行展示在界面上,如下

相关文章:
ContentProvider程序之间数据的相互调用
1权限的获取和调用 权限分为普通权限和危险权限,除了日历信息,电话,通话记录,相机,通讯录,定位,麦克风,电话,传感器,界面识别(Activity-Recognit…...
金三银四最近一次面试,被阿里P8测开虐惨了...
都说金三银四涨薪季,我是着急忙慌的准备简历——5年软件测试经验,可独立测试大型产品项目,熟悉项目测试流程...薪资要求?5年测试经验起码能要个20K吧 我加班肝了一页半简历,投出去一周,面试电话倒是不少&a…...
算法题——给定一个字符串 s ,请你找出其中不含有重复字符的最长子串 的长度
给定一个字符串 s ,请你找出其中不含有重复字符的最长子串 的长度 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”&am…...
机器学习中的数学原理——F值与交叉验证
通过这篇博客,你将清晰的明白什么是F值、交叉验证。这个专栏名为白话机器学习中数学学习笔记,主要是用来分享一下我在 机器学习中的学习笔记及一些感悟,也希望对你的学习有帮助哦!感兴趣的小伙伴欢迎私信或者评论区留言࿰…...
vue.js介绍
个人名片: 😊作者简介:一名大一在校生,web前端开发专业 🤡 个人主页:python学不会123 🐼座右铭:懒惰受到的惩罚不仅仅是自己的失败,还有别人的成功。 🎅**学习…...
【设计模式】1、设计模式七大原则
目录一、单一职责二、接口隔离三、依赖倒置(倒转)四、里氏替换五、迪米特法则(Law of Demeter)六、开闭七、合成复用一、单一职责 类(或方法)功能的专一性。一个类(或方法)不应该承担…...
【前端老赵的CSS简明教程】10-1 CSS预处理器和使用方法
大家好,欢迎来到本期前端课程。我是前端老赵,今天的课程将讲解CSS预处理器的概念和使用方法,希望能够帮助大家更好地进行前端开发。 CSS预处理器是什么? CSS预处理器是一种将类似CSS的语言转换为CSS的工具。它们提供了许多额外的功能,如变量、嵌套、混入、函数等等。这些…...
BFC详解
1. 引言 在前端的布局手段中,一直有这么一个知识点,很多前端开发者都知道有它的存在,但是很多人也仅仅是知道它的存在而已,对它的作用也只是将将说得出来,可是却没办法说得非常的清晰。这个知识点,就是BFC…...
C++:哈希结构(内含unordered_set和unordered_map实现)
unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到$log_2 N$,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好 的查询是ÿ…...
Java实现调用第三方相关接口(附详细思路)
目录1.0.简单版2.0.升级版2-1.call.timeout()怎么传入新的超时值2-2.timeout(10, TimeUnit.SECONDS)两个参数的意思,具体含义3.0.进阶版3-1.java.net.SocketTimeoutException: 超时如何解决4.0.终极版1.0.简单版 以下是一个使用 Java 实际请求“第三方”的简单示例代…...
基础数据结构:单链表
今天懒洋洋学习了关于基础数据结构有关单链表的相关操作,懒洋洋来这温习一下。一:单链表的定义链表定义:用链式存储的线性表统称为链表,即逻辑结构上连续,物理结构上不连续。链表分类:单链表、双链表、循环链表、静态链…...
基于51单片机的智能计算器Protues仿真设计
目录 一、设计背景 二、实现功能 三、硬件设计 3.1 总体硬件设计 3.2 键盘电路的设计 3.3 显示电路的设计 四、仿真演示 五、源程序 一、设计背景 随着社会的发展,科学的进步,人们的生活水平在逐步的提高,尤其是微电子技术的发展&am…...
Pandas数据分析实战练习
Pandas数据分析实战练习 文章目录 Pandas数据分析实战练习一、读取Excel文件中的数据1、读取工号、姓名、时段、交易额这四列数据,使用默认索引,输出前10行数据2、读取第一个worksheet中所有列,跳过第1、3、5行,指定下标为1的列中数据为DataFrame的行索引标签二、筛选符合特…...
C++ 继承下(二篇文章学习继承所有知识点)
5.继承与友元友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员 //验证友元不能继承 class B {friend void Print(); public:B(int b): _b(b){cout << "B()" << endl;}protected:int _b; };class D : public B { public:D(int b,…...
【C++】C++11新特性——类的改进|lambda表达式
文章目录一、类的改进1.1 默认生成1.2 移动构造函数1.3 移动赋值重载函数1.4 成员变量缺省值1.5 强制生成默认函数的关键字default1.6 禁止生成默认函数的关键字delete1.6.1 C98防拷贝1.6.1 C11防拷贝二、lambda表达式2.1 对比2.2 lambda表达式语法2.3 捕捉列表2.4 函数对象与l…...
C语言进阶(37) | 程序环境和预处理
目录 1.程序的翻译环境和执行环境 2.详解编译链接 2.1 翻译环境 2.2 编译本身也分为几个阶段: 2.3 运行环境 3.预处理详解 3.1预定符号 3.2 #define 3.3 #undef 3.4 命令行定义 3.5 条件编译 3.6 文件包含 了解重点: 程序的翻译环境程序的执行环境详解: C语言程…...
Golang每日一练(leetDay0005)
目录 13. 罗马数字转整数 Roman to Integer ★ 14. 最长公共前缀 Longest Common Prefix ★ 15. 三数之和 3Sum ★★★ 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 13. 罗马数字转…...
occt_modeling_data(一)——拓扑
下面是我基于opencascade英文文档中关于occt_modeling_data中Topology部分进行的翻译,英文好的还是建议直接看文档,部分我不肯定的地方我会附上英文原句。如发现有错误欢迎评论区留言。 OCCT Topolog允许用户访问和操纵物体的数据,且不需要处…...
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(3)
目录 写在前面: 题目:93. 递归实现组合型枚举 - AcWing题库 读题: 输入格式: 输出格式: 数据范围: 输入样例: 输出样例: 解题思路: 代码: AC &…...
宇宙最强-GPT-4 横空出世:最先进、更安全、更有用
文章目录前言一、准确性提升1.创造力2.视觉输入3.更长的上下文二、相比于ChatGPT有哪些提升1.GPT-4 的高级推理能力超越了 ChatGPT2.GPT-4 在多种测试考试中均优于 ChatGPT。三、研究团队在GPT-4模型都做了哪些改善1.遵循 GPT、GPT-2 和 GPT-3 的研究路径2.我们花了 6 个月的时…...
二分查找算法:中间值左偏还是右偏?
还记得吗?我们在前面探讨了区间的选择和主循环的停止判断条件,但是没有提到 中间索引位置的计算公式 middle(st, ed)。当区间的长度是奇数时,中间索引只有一个位置 mid (st ed) / 2,而当区间长度是偶数时,中间索引就…...
不想注册Nvidia账户?手把手教你修改app.js文件,让GeForce Experience直接进主界面
免登录畅享GeForce Experience:技术流修改指南 每次打开GeForce Experience都要面对那个恼人的登录窗口?作为资深PC玩家,我完全理解这种困扰。重装系统后最烦人的就是各种强制登录,尤其是当我们只想快速使用屏幕录制或游戏优化功能…...
如何通过开源自动化工具优化《明日方舟》基建管理效率
如何通过开源自动化工具优化《明日方舟》基建管理效率 【免费下载链接】arknights-mower 《明日方舟》长草助手 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-mower 在《明日方舟》的长期游戏过程中,基建管理往往成为玩家需要频繁处理的核心环节。…...
ElevenLabs企业客户成功路径图:从POC验证到年度千万级合同签署的5个不可跳过的合规锚点
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs企业客户成功路径图:从POC验证到年度千万级合同签署的5个不可跳过的合规锚点 企业在采用ElevenLabs语音合成平台构建AI客服、无障碍内容生成或本地化语音交付系统时,技…...
CATIA二次开发—API高效查询与架构解析
1. CATIA二次开发入门:从V5到V6的跨越挑战 如果你是从CATIA V5转向V6开发的工程师,可能会遇到这样的困惑:为什么在V5中得心应手的API调用方式,到了V6就完全不管用了?这就像突然从手动挡汽车换成了自动驾驶电动车&#…...
终极D2DX指南:让《暗黑破坏神2》在现代电脑上焕发新生
终极D2DX指南:让《暗黑破坏神2》在现代电脑上焕发新生 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 还在为经典…...
不使用库函数,实现 strcpy,strcat,strcmp
文章目录 1、strcpy 原型2、strcmp 原型 1、strcpy 原型 char* strcpy(char* des, const char* source) {char* r des;assert((des ! NULL) && (source ! NULL));while((*r *source)!\0);return des; }可以自行实现: char* myStrcpy(char* dest, char* …...
手把手教你用Arduino/树莓派DIY一个OBD-II数据记录器(附K线电平转换电路详解)
从零构建车载OBD-II数据记录器:硬件选型与K线通信实战指南 在汽车电子爱好者和嵌入式开发者的圈子里,OBD-II接口一直是个充满魔力的数据宝库。想象一下,通过几十元的开发板和简单的电路改造,就能实时获取发动机转速、水温、节气门…...
从零到一:在Visual Studio中集成海康机器人工业相机SDK的完整指南
1. 环境准备:搭建开发基础 第一次接触工业相机开发时,我也被各种专业术语和配置步骤搞得头晕眼花。后来发现只要把环境搭建好,后面的开发就会顺利很多。咱们先从最基础的软件安装开始,就像盖房子要先打地基一样。 Visual Studio的…...
VRM Converter for VRChat:打破虚拟化身平台壁垒的技术解决方案
VRM Converter for VRChat:打破虚拟化身平台壁垒的技术解决方案 【免费下载链接】VRMConverterForVRChat 项目地址: https://gitcode.com/gh_mirrors/vr/VRMConverterForVRChat 在虚拟内容创作领域,平台壁垒一直是开发者面临的最大挑战。当你在V…...
