【Android】跨程序共享数据——内容提供器初识

跨程序共享数据——探究内容提供器

内容提供器的简介

主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。目前,使用内容提供器是Android实现跨程序共享数据的标准方式。内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。

运行时权限

Android权限机制

在我们使用任何一个软件的时候,有时就会弹出来你是否允许使用摄像头…,这就是权限。安卓当中的权限非常多,要是所有的权限都要由我们来授权就会非常麻烦,因此Android现在将所有的权限归成了两类,一类是普通权限,一类是危险权限。普通权限指的是那些不会直接威胁到用户的安全和隐私的权限,对于这部分权限申请,系统会自动帮我们进行授权,而不需要用户再去手动操作了。危险权限则表示那些可能会触及用户隐私,或者对设备安全性造成影响的权限,如获取设备联系人信息、定位设备的地理位置等,对于这部分权限申请,必须要由用户手动点击授权才可以,否则程序就无法使用相应的功能。

下面Android中所有的危险权限,一共是9组24个权限:

在这里插入图片描述

当你要使用这张表中的权限,那么就需要进行运行时权限处理,如果不在这张表中,那么只需要在AndroidManifest.xml文件中添加一下权限声明就可以了。

注意,表格中每个危险权限都属于一个权限组,我们在进行运行时权限处理时使用的是权限名,但是用户一旦同意授权了,那么该权限所对应的权限组中所有的其他权限也会同时被授权。

在程序运行时申请权限

在上面的表格当中会看到CALL_PHONE权限是危险权限,就根据这个来学习在程序运行时申请权限吧。

对于一个权限无非就是授权和不授权两种情况:

  • PackageManager.PERMISSION_GRANTED:表示权限已经被授权
  • PackageManager.PERMISSION_DENIED:表示改权限处于未授权的状态

我们在程序运行时申请权限时,首先就是判断是否已经授权了,当处于已授权的状态时,就无需提示用户,直接进行操作,当没有授权我们就提示用户是否进行授权,根据用户的选择进行下一步改如何操作。下面就是代码的示例:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});Button buttonmakecall = (Button) findViewById(R.id.makecall);buttonmakecall.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE}, 1);} else {call();}}});}private void call() {try {Intent intent = new Intent(Intent.ACTION_CALL);intent.setData(Uri.parse("tel:17765079498"));startActivity(intent);} catch (SecurityException e) {e.printStackTrace();}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (requestCode == 1) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {call();} else {Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();}} else {;}}
}
  1. 我们在点击按钮之后,先对权限进行判断是否已经被授权,借助ContextCompat.checkSelfPermission()方法,是一个静态方法,用于检查应用是否具有执行某个操作所需的权限,接收两个参数:
  • Context:第一个参数是需要检查权限的上下文,上下文提供了一个环境,使得权限检查能够关联到正确的应用程序
  • String permission:第二个参数是需要检查的权限的名称
  1. 遇到没有授权,我们就需要向用户申请授权,借助ActivityCompat.requestPermissions()方法,接收三个参数:
  • Activity:第一个参数是 Activity 的实例,通常是当前的 Activity。这是请求权限的上下文,并且是接收权限请求结果的回调所在
  • String[] permissions:第二个参数是一个包含权限名称的字符串数组。这些权限是应用请求授权的权限列表
  • int requestCode:第三个参数是一个整数值,它是请求代码,用于唯一标识权限请求。当权限请求的结果返回时,这个值将用于确定是哪个权限请求的结果。这个值应该大于0,并且最好是一个不会与 Activity 中其他请求代码冲突的值
  1. 在调用requestPermissions()方法之后,无论结果如何都会回调到onRequestPermissionsResult()方法,此时就可以写用户不同选择带来的操作,这个方法也是三个参数,都是由调用 requestPermissions() 方法时传入的:
  • int requestCode: 一个整型值,用于标识请求权限的请求码
  • String[] permissions:一个字符串数组,包含请求的权限名称
  • int[] grantResults:用户的授权结果就会保存在这里面

if语句当中与允许授权作比较是很好理解的,前面还有一个是判断字符串的长度是否大于0,是因为数字所存放的是被处理的请求,如果不做判断,当数组长度为0直接访问会报错。

这下去运行程序当你按下按钮,就会出现让用户授权的提示:

在这里插入图片描述

按下允许就会执行相关操作,以上面为例就会出现拨打电话的页面:

在这里插入图片描述

这时能再次按下按钮就不会再次让你授权,你想要关闭授权就在设置里面关闭

访问其他程序中的数据

内容提供器的用法有两种:

  • 使用现有的内容提供器来读取和操作相应程序中的数据
  • 创建自己的内容提供器给我们程序的数据提供外部访问接口

ContentResolver的基本用法

对于每一个应用程序来说,如果想要访问内容提供器中共享的数据,就一定要借助ContentResolver类,可以通过Context中的getContentResolver()方法获取到该类的实例,它提供了增删改查的操作,与SQLite的方法名是相同的,但在操作上面所传参数有些许不同,不接受表名参数,而是使用一个Uri参数代替,这个参数被称之为内容URI。

内容URI主要由两部分组成:

  • authority:是用于对不同的程序做区分,一般为了避免冲突,都会采用程序包名的方式来进行命名
  • path:对同一应用程序的不同表做区分的,通常加到authority的后面

例如:content://com.example.app.provider/table1

得到了字符串要先转成Uri对象,调用Uri.parse()方法:

Uri uri = Uri.parse("content://com.example.app.provider/table1")

查询表中数据

Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);

在这里插入图片描述

接下来就可以使用循环读取数据了。

添加表中数据

ContentValues values = new ContentValues();
values.put("column1", "text");
values.put("column2", 1);
getContentResolver().insert(uri, values);

更新表中数据

ContentValues values = new ContentValues();
values.put("column1", "");
getContentResolver().update(uri, values, "column1 = ? and column2 = ?", new String[] {"text", "1"});

这段代码的目的是更新那些column1列的值为"text"且column2列的值为"1"的记录。只有同时满足这两个条件的记录会被更新,且column1的值会被更新为一个空字符串

删除表中数据

getContentResolver().delete(uri, "column2 = ?", new String[] {"1"});

值为"text"且column2列的值为"1"的记录。只有同时满足这两个条件的记录会被更新,且column1的值会被更新为一个空字符串

删除表中数据

getContentResolver().delete(uri, "column2 = ?", new String[] {"1"});

文章到这里就结束了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/394293.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv-图像透视变换

透射变换是视角变化的结果,是指利用透视中心,像点,目标点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴旋转某一角度,破坏原有的投影光束,仍能保持承影面上投影几何图形不变的变化) 它的本质将图…

【nginx】解决k8s中部署nginx转发不会自动更新域名解析启动失败的问题

文章目录 1. 问题2.解决办法3.扩展说明3.1 DNS解析阶段划分3.2 问题说明3.2.1 先看/etc/resolv.conf说明3.2.2 针对第一个问题3.2.3 针对第二个问题 【后端】NginxluaOpenResty高性能实践 参考: https://blog.csdn.net/u010837612/article/details/123275026 1. 问…

【二分查找】3143. 正方形中的最多点数

本文涉及的基础知识点 C二分查找 LeetCode3143. 正方形中的最多点数 给你一个二维数组 points 和一个字符串 s ,其中 points[i] 表示第 i 个点的坐标,s[i] 表示第 i 个点的 标签 。 如果一个正方形的中心在 (0, 0) ,所有边都平行于坐标轴&…

【数据结构入门 】栈

目录 前言 一、栈的概念及结构 二、栈的实现 1. 栈的声明 2.初始化栈 3. 栈的销毁 4.判断是否为空栈 5.入栈(只能插入栈顶元素) 6. 出栈(只能从栈顶删除) 7.栈的大小 8.获取栈顶元素 总结 前言 在计算机科学中&#xf…

【MySQL 01】在 Ubuntu 22.04 环境下安装 MySQL

文章目录 🌈 1. 说明🌈 2. 卸载不必要的环境🌈 3. 安装 MySQL🌈 4. 启动和关闭 MySQL 服务🌈 5. 临时登录 MySQL🌈 6. 设置 MySQL 密码🌈 7. 配置 MySQL 🌈 1. 说明 在安装与卸载中…

Python面试宝典第29题:袋鼠过河

题目 一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子。每隔一米就有一个桩子,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳得更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量…

Maven实战(五)- Nexus 私服安装与使用

Maven实战(五)- Nexus 私服安装与使用 文章目录 Maven实战(五)- Nexus 私服安装与使用1.安装Nexus1.1.下载安装包1.2.Nexus启动命令1.3.登陆Nexus 2.仓库与仓库组2.1.内置仓库2.2.仓库分类2.3.创建宿主仓库2.4.创建代理仓库2.5.创…

CSS基础知识day4

目录 1. 浮动 1.1 传统网页布局的三种方式 1.2 标准流(普通流/文档流) 1.3 为什么需要浮动? 1.4 什么是浮动? 1.5 浮动特性(重难点) 1.6 浮动元素经常和标准流父级搭配使用 2.常见网页布局 2.1 常…

WEB应用(十四)---文件上传

什么是文件上传漏洞 文件上传是Web应用的常见功能,允许用户上传图片、视频及其他文件类型文件。如果用户上传的是木马文件,则服务器就会收到攻击。 对于这个漏洞的练习有一个专门的靶场,即upload-labs,这个的安装可以在windows中使…

顺序表的实现【数据结构】

文章目录 1.线性表2.顺序表2.1 概念及结构 3.模拟实现3.1 准备工作3.2 顺序表的初始化与销毁3.3 顺序表的尾插3.4 顺序表的尾删3.5顺序表的打印3.6 顺序表的头插3.7 顺序表的头删3.8 顺序表查找3.9 顺序表在pos位置插入x3.10 顺序表删除pos位置的值 4.代码整合 1.线性表 线性表…

【Linux学习】深入理解软硬链接

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🎈软硬链接🐧软链接🐬硬链接 🐸总结软硬链接的原理🐍软硬链接的应用场景&…

观成科技:海莲花活跃木马KSRAT加密通信分析

概述 自2023年8月至今,海莲花组织多次利用KSRAT远控木马对我国发起攻击。KSRAT通过HTTP协议与C&C服务器进行通信,每个样本都使用了不同的URL。其心跳包采用XOR算法进行加密,而控制指令包和数据回传包则使用了XOR以及“XORAES-128-CBC”组…

DC系列靶场---DC 7靶场的渗透测试

DC-7渗透测试 信息收集 地址探测 使用arpscan对目标地址进行探测 arp-scan -l I eth0 得到目标主机IP地址为172.30.1.132 扫描端口 使用nmap对目标主机做端口扫描 nmap -sS -sV -T4 -p- -O 172.30.1.132 扫描到目标主机开启了80端口、22端口。 -sS Nmap的SYN扫描&…

mapbox-gl 实现房间面生成墙(借助jsts)

文章目录 一、前言 一、前言 当我们从室外放大到室内展示室内图层时,我们可能只有房间面的数据,这时要展示房间墙数据,就需要借助工具对房间面进行缓冲,但是数据变动时,我们还要再次进行一下缓冲区生成操作。下面是借…

Copy as cURL 字段含义

当前端在开发过程中,遇到接口错误反馈给后端人员时,一般在此接口处右键复制为cURL。 格式如下: curl https://xxx.xxx.cn/xxx/xxx/management/record/list \-H accept: application/json, text/plain, */* \-H accept-language: zh-CN,zh;q0…

1.4 C 程序的编译过程与 CLion 调试技巧

目录 1 程序的编译过程 1.1 编写源代码 1.2 预处理(Preprocessing) 1.3 编译(Compilation) 1.4 汇编(Assembly) 1.5 链接(Linking) 1.6 执行 2 编译过程的输入输出文件概览 …

谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)

文章目录 一,通过域名访问商城架构设计1,为什么nginx要将请求转发给网关2,架构设计 二,配置1,nginx配置1.1 nginx.conf1.2 gulimall.conf1.3 配置原理 2,网关配置 三,记录2个问题1,网…

【C++】初识面向对象:类与对象详解

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性 本章将介绍C中一个重要的概念——类。通过类,我们可以类中定义成员变量和成员函数,实现模块化封装,从而构建更加抽象和复杂的工程。 &…

基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 MSER 4.2 HOG特征提取 4.3 SVM 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2017b 3.部分核心程序 (完整版代码包含中…

CMU15445 (Fall 2023) Project 1 - Buffer Pool 思路分享

文章目录 写在前面Task 1 - LRU-K Replacement PolicyTask 2 - Disk SchedulerTask 3 - Buffer Pool ManagerNewPageFetchPageUnpinPageDeletePageFlushPage 写在最后 写在前面 操作系统为应用程序提供了默认的缓存机制,DBMS作为应用程序,为什么不使用默…