当前位置: 首页 > news >正文

Android笔记--应用安装

  这一节了解一下普通应用安装app的方式,主要是唤起系统来安装,直接上代码:

 申请权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /><uses-permission android:name="com.example.permission.SOME_PERMISSION" /><uses-permission android:name="android.permission.INSTALL_PACKAGES"tools:ignore="ProtectedPermissions" /><uses-permissionandroid:name="android.permission.WRITE_SETTINGS"tools:ignore="ProtectedPermissions" /><uses-permissionandroid:name="android.permission.ACCESS_SUPERUSER" /><uses-permissionandroid:name=".PERMISSION" /><uses-permissionandroid:name="android.permission.GET_PACKAGE_SIZE" /><uses-permissionandroid:name="android.permission.MANAGE_DOCUMENTS"tools:ignore="ProtectedPermissions" /><application>
...<providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.dc.cplustest.fileProvider"android:exported="false"android:permission="com.example.permission.SOME_PERMISSION"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/filepaths" /></provider>
...
</application>

res/xml/filepaths.xml

Activity中:

private static final String[] PERMISSIONS = new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION,android.Manifest.permission.READ_EXTERNAL_STORAGE,android.Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.MANAGE_EXTERNAL_STORAGE,android.Manifest.permission.INSTALL_PACKAGES,Manifest.permission.WRITE_SETTINGS,Manifest.permission.REQUEST_INSTALL_PACKAGES
};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);checkInstallPermission();initView();}public String apk = Environment.getExternalStorageDirectory() + File.separator + "Test" + File.separator + "APK" + File.separator+"fenshen.apk";private void initView() {if (!checkPermissions(PERMISSIONS)) {ActivityCompat.requestPermissions(this, PERMISSIONS, 1000);}findViewById(R.id.btn_test_so).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {install();} catch (Exception e) {throw new RuntimeException(e);}}});}public void checkInstallPermission() {boolean haveInstallPermission;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {haveInstallPermission = getPackageManager().canRequestPackageInstalls();Log.d("Test","Test haveInstallPermission:"+haveInstallPermission);if (!haveInstallPermission) {//没有权限让调到设置页面进行开启权限;Uri packageURI = Uri.parse("package:" + getPackageName());Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);startActivityForResult(intent, 10086);} } }public void install() {File apkFile = new File(apk);Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);intent.setAction(Intent.ACTION_VIEW);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//注意第二个参数,要保持和manifest中android:authorities的值相同Uri uri = FileProvider.getUriForFile(SecondActivity.this,SecondActivity.this.getPackageName() + ".fileProvider", apkFile);intent.setDataAndType(uri, "application/vnd.android.package-archive");intent.setData(uri);startActivity(intent);}private boolean checkPermissions(String[] neededPermissions) {if (neededPermissions == null || neededPermissions.length == 0) {return true;}boolean allGranted = true;for (String neededPermission : neededPermissions) {Log.d("Test","权限"+neededPermission+"是否已给: "+(ContextCompat.checkSelfPermission(this, neededPermission) == PackageManager.PERMISSION_GRANTED));allGranted &= ContextCompat.checkSelfPermission(this, neededPermission) == PackageManager.PERMISSION_GRANTED;}return allGranted;}

相关文章:

Android笔记--应用安装

这一节了解一下普通应用安装app的方式&#xff0c;主要是唤起系统来安装&#xff0c;直接上代码: 申请权限 <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name"android.permission.WRITE_EXT…...

今日分享站

同志们&#xff0c;字符函数和字符串函数已经全部学习完啦&#xff0c;笔记也已经上传完毕&#xff0c;大家可以去看啦。字符函数和字符串函数and模拟函数 加油&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;...

基于python flask的旅游数据大屏实现,有爬虫有数据库

背景 随着旅游行业的快速发展&#xff0c;数据在旅游决策和规划中的重要性日益凸显。基于 Python Flask 的旅游数据大屏实现研究旨在结合爬虫技术和数据库存储&#xff0c;为用户提供全面、实时的旅游信息展示平台。 爬虫技术作为数据采集的重要手段&#xff0c;能够从各种网…...

海尔智家牵手罗兰-加洛斯,看全球创牌再升级

晚春的巴黎西郊&#xff0c;古典建筑群与七叶树林荫交相掩映&#xff0c;坐落于此的罗兰加洛斯球场内座无虚席。 来自全球各地的数万观众&#xff0c;正与场外街道上的驻足者们一起&#xff0c;等待着全世界最美好的网球声响起…… 当地时间5月26日&#xff0c;全球四大职业网…...

【busybox记录】【shell指令】unlink

目录 内容来源&#xff1a; 【GUN】【unlink】指令介绍 【busybox】【unlink】指令介绍 【linux】【unlink】指令介绍 使用示例&#xff1a; 删除文件 - 默认 常用组合指令&#xff1a; 指令不常用/组合用法还需继续挖掘&#xff1a; 内容来源&#xff1a; GUN &#x…...

如何恢复被盗的加密货币?

本世纪&#xff0c;网络犯罪的首要目标是加密货币。 这要归功于加密货币的日益普及和价值&#xff0c;网络犯罪分子已经认识到经济收益的潜力&#xff0c;并将重点转向利用这种数字资产中的漏洞。 在今天的文章中&#xff0c;我们将讨论加密货币恢复和被盗加密货币恢复。 我们…...

英语学习笔记29——Come in, Amy!

Come in, Amy! 进来&#xff0c;艾米&#xff01; shut v. 关严 区别&#xff1a;shut the door 把门关紧 口语&#xff1a;Shut up! 闭嘴&#xff01;    态度强硬&#xff0c;不礼貌 例句&#xff1a;请不要把门关严。    Don’t shut the door, please. bedroom n. …...

grpc NewClient 报错 name resolver error: produced zero addresses

场景 grpc版本: google.golang.org/grpc v1.64.0 连接客户端: import("google.golang.org/grpc""net" ) // 拿着设备ID 去获取连接 var connMap map[string]net.Conn conn, err : grpc.NewClient("device_id",grpc.WithContextDialer(func(ctx…...

【Docker】2、配置SSL证书远程访问Docker

1、使用 openssl 生成 ca 1、创建文件夹 mkdir -p /root/dockercd /root/docker2、创建 RSA 私钥 会提示 2 次输入证书密码&#xff0c;至少 4 位&#xff0c;创建后会生成一个 ca-key.pem 文件 openssl genrsa -aes256 -out ca-key.pem 4096得到 ca-key.pem 文件 3、创建…...

HFish蜜罐管理端搭建:构建网络安全的主动防御系统

引言 在网络攻防对抗日益激烈的今天&#xff0c;蜜罐技术作为一种有效的主动防御手段&#xff0c;越来越受到网络安全专家的青睐。HFish蜜罐以其强大的功能和灵活的部署方式&#xff0c;成为网络安全防护体系中的重要组成部分。本文将详细介绍如何在CentOS 7.6系统上搭建HFish…...

探秘AI艺术:揭开Midjourney绘画的神秘面纱

在当今这个数字化迅速发展的时代&#xff0c;AI技术已经深入到我们生活的方方面面&#xff0c;而最令人着迷的莫过于它在艺术创作领域的应用。“Midjourney绘画”就是这样一个令人惊叹的例子&#xff0c;它通过高级AI技术&#xff0c;能够帮助用户生成独一无二的艺术作品。但是…...

29-ESP32-S3-WIFI_Driver-00 STA模式扫描全部 AP

ESP32-S3 WIFI_Driver 引言 ESP32-S3是一款集成了Wi-Fi和蓝牙功能的芯片。关于WIFI的部分&#xff0c;其实内容比我想象的要多得多。所以通常来说&#xff0c;如果你想要编写自己的Wi-Fi应用程序&#xff0c;最快捷的方法就是先找一个类似的示例应用&#xff0c;然后将它的相…...

2024了,还有人在问为甚死锁?

大家好&#xff0c;我是javapub。 接上篇提到了锁&#xff0c;《InnoDB有哪些锁类型》。这么多的锁&#xff0c;你有遇到过死锁吗&#xff1f; 死锁是在事务数据库中会发生的一种特殊现象&#xff0c;多个事务在执行过程中&#xff0c;相互等待对方持有的资源&#xff0c;导致…...

Java中Arrays.toString与new String()字节数组使用的差异

Java 编程语言提供了许多内置方法和类&#xff0c;这使得程序员能够更加方便的处理数据和对象。本文将讨论 Arrays.toString 方法和 new String() 方法在处理字节数组时的不同。 文章目录 Arrays.toString 方法new String() 方法总结 Arrays.toString 方法 Arrays.toString() …...

开源表单流程设计器有哪几个突出的优势特点?

当前&#xff0c;传统的表单制作已经无法满足现在企业的发展需求了。想要实现高效率发展&#xff0c;需要引进先进的低代码技术平台、开源表单流程设计器等优秀软件平台助力发展。它们具有可视化操作界面、灵活好操作、易维护、效率高等诸多优势特点&#xff0c;在推动企业实现…...

景源畅信:抖音小店如何开橱窗?

在当今数字化时代&#xff0c;社交媒体平台不仅仅是人们交流和分享生活的工具&#xff0c;更成为了商家们展示和销售产品的重要场所。抖音作为一款流行的短视频社交应用&#xff0c;其内置的电商功能——抖音小店&#xff0c;为众多商家和个人提供了便捷的在线销售途径。其中&a…...

Unix环境高级编程--8-进程控制---8.7函数waitid 8.8函数wait3 wait4

1、Single Unix Specification支持一个取得进程终止状态的函数--waitid&#xff0c;此函数类似于waitpid&#xff1a; pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options); int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options); …...

window.addEventListener 用法

window.addEventListener 是JavaScript中用来为DOM元素&#xff08;在本例中是浏览器窗口window&#xff09;添加事件监听器的方法。这对于响应用户操作&#xff08;如点击、滚动等&#xff09;或页面/浏览器的特定状态变化非常有用。下面是如何使用window.addEventListener的基…...

【全开源】活动报名表单系统(ThinkPHP+Uniapp+uView)

轻松构建高效报名平台 一、引言 随着线上活动的日益增多&#xff0c;一个高效、易用的活动报名表单系统成为了举办各类活动的必备工具。为了满足不同组织和个人的需求&#xff0c;我们推出了功能强大的“活动报名表单系统源码”。本文将为您详细介绍该源码的特点、功能以及使…...

python接口自动化之会话保持

&#x1f366; 会话保持-token 有的网站登录需要token鉴权&#xff0c;是啥意思呢&#xff0c;现在有两个接口&#xff0c;一个接口是登录&#xff0c;一个接口是提交订单&#xff0c;那你怎么保证&#xff0c;提交登录这个用户是登录状态呢。登录成功的接接口会在response里面…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...