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 个月的时…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
32位寻址与64位寻址
32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...
python打卡第47天
昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...
