Android代码安装apk程序

文章目录

  • 一、高低版本兼容代码及配置
      • 1.java代码
      • 2.AndroidManifest.xml 配置ContentProvider
      • 3.paths xml 配置
  • 二、老版本代码
  • 三、可能出的问题及处理

一、高低版本兼容代码及配置

高版本提高了sdcard、 app文件空间的访问权限,高低版本的系统api有一定区别,Android7.0 及以上,开放(暴露)私有数据文件的唯一方式是通过 ContentProvider 来实现(我们的app提供我们的文件给系统安装程序)。

基本步骤
1、在AndroidManifest.xml 中配置 ContentProvider 信息;
2、配置要开放的 paths 信息;
3、Java 代码中通过 FileProvider 封装文件信息。

1.java代码

private void install(String path) {File apk = new File(path);Intent intent = new Intent(Intent.ACTION_VIEW);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//注意第二个参数,要保持和manifest中android:authorities的值相同Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider", apk);intent.setDataAndType(uri, "application/vnd.android.package-archive");} else {intent.setDataAndType(Uri.fromFile(apk), "application/vnd.android.package-archive");}try {context.startActivity(intent);} catch (Exception e) {e.printStackTrace();}}

特别注意
Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + “.fileProvider”, apk);
第二个参数一定要和provider 的android:authorities="${applicationId}.fileProvider"匹配。
applicationId是包名,context.getPackageName()也是包名,所以
context.getPackageName() + “.fileProvider”${applicationId}.fileProvider 是相同的字符串

2.AndroidManifest.xml 配置ContentProvider

配置安装权限

<!-- 应用安装权限 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

配置ContentProvider

<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.fileProvider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_provider" />
</provider>

provider 属性说明:

  1. android:name 属性填写的是 FileProvider 类的完整名称。这个类可以填写两个值,一个是位于 support(android.support.v4.content.FileProvider) 包下的,另一个是位于 androidx(androidx.core.content.FileProvider) 包下的。这两种都可以填写,本质上没有区别。要根据实际情况来决定用哪个,即要看工程引的是 androidx 支援包还是 support 支援包。

  2. android:authorities 属性就是和普通的 ContentProvider 一样的用于访问文件资源的 uri 标签头。值内容根据实际需要来填写即可。

  3. android:exported android:grantUriPermissions 两个属性的值照着填就好。大致是指允许其它应用单次使用自己的 Provider 资源。

  4. meta-data 标签中的内容需要关注的是 android:resource 属性中的内容。这个属性的值引向一个 xml目录的文件,这份 xml 文件描述要给其他应用访问的文件目录。

3.paths xml 配置

在工程 res 目录下新建一个 xml 没有的话新建)目录,则在目录中创建一个file_provider.xml(名称随意,和 android:resource=“@xml/file_provider” 一致即可),并在xml中添加需要对外提供的目录路径

<?xml version="1.0" encoding="utf-8"?>
<paths><external-pathname="path1"path="/data/dir1/" /><external-pathname="path2"path="/" /><external-files-pathname="path3"path="/data/dir2" /><external-cache-pathname="path4"path="/data/dir3" /><cache-pathname="path5"path="/data" /><files-pathname="path6"path="/ff" />
</paths>

简要说明:
不带external 是程序安装目录下的目录,cache-path 指程序安装目录下的cache目录。
带有external 的是指sdcard 目录下对应包名的专属目录,例如external-cache-path 指sdcard 目录下对应包名的专属cache目录。

例如下图是斗鱼直播的files目录:

<external-files-pathname="path3"path="/" />

对应下图
在这里插入图片描述
如果还有子目录,对应的增加接口,例如files 目录下的douyu, 那么xml如下:

<external-files-pathname="path3"path="/douyu/" />

二、老版本代码

老版本代码相对简单,粗暴且实用,只要知道 apk 的path,并拥有访问权限(sdcard),
再加上安装权限即可。

File apk = new File(apkPath);
Uri uri = Uri.fromFile(apk);
Intent intent = new Intent();
intent.setClassName("com.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity");
intent.setData(uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

manifest 添加对应的权限

<!--sdcard 读权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

三、可能出的问题及处理

  1. java.lang.NullPointerException: Attempt to invoke virtual method ‘android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)’ on a null object reference
    at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:591)
    原因:FileProvider.getUriForFile(context, context.getPackageName() + “.fileProvider”, apk); 第二个参数 “包名.fileProvider” 和 provider.xml 中 android:authorities=“${applicationId}.fileProvider” 的值(具体值:如com.eagle.app.fileProvider)不同,请仔细核对和修改一致。
  2. 权限问题
    一般app需要安装权限,除了在清单文件中列出外,还需要手动确认,注意留意并确认
  3. 下载的安装文件路径与file_provider 中描述的文件不匹配,仔细核对路径与描述。
  4. 安全提示要选择允许
    在这里插入图片描述

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

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

相关文章

Android adb 安装apk程序

文章目录ADB简单介绍安装命令安装失败情况adb 安装测试包adb 安装卸载的所有命令摘要前言多数情况下&#xff0c;用户都是从应用商店或某网页下载apk后从手机上直接安装apk文件&#xff0c;在调试或下载到电脑上时候&#xff0c;我们就可以直接通过adb安装到手机。在测试小伙伴…

XML十六进制无效的字符(0x0b 0x0c 0x02)

文章目录解决方法ASCII“字符”1、ASCII 打印字符2、ASCII 非打印控制字符3、扩展 ASCII 打印字符4、ASCII 之外ASCII 字符输入方法与常用地方1、在文档中插入 ASCII 字符2、输入方法前言xml 中包含了非打印字符的情况下&#xff0c;即使是放在cdata 中&#xff0c;在不同平台上…

tab栏圆点按钮_uniapp tabbar上的小圆点

需求在tabbar的图标右侧显示和隐藏小圆点。一般表示有新消息、新更新。基本代码序号从0开始计算。uni.showTabBarRedDot({index:1});uni.hideTabBarRedDot({index:1});修改代码App.vue或index页在App.vue的onLaunch周期或者是index页的onLoad加入代码&#xff0c;判定是否需要显…

Android OpenGLES2.0(一)OpenGLES2.0基础介绍

文章目录什么是OpenGL ES&#xff1f;OpenGL ES可以做什么&#xff1f;OpenGL ES版本及Android支持情况OpenGL ES 2.0的优点OpenGL ES 2.0中基本概念顶点着色器片元着色器着色器语言坐标系图形的绘制投影光照纹理映射其它OpenGL ES 2.0过程及理解什么是OpenGL ES&#xff1f; O…

如何 方法内指令重排 进制_谈谈指令重排

这个知识点也是很多人说不清道不明的地方&#xff0c;感觉都知道&#xff0c;说又说不出来。为什么会这样呢&#xff1f;因为这几个字&#xff0c;很容易被当成动词去理解&#xff0c;其实正确的理解是当成名词&#xff0c;即指令重排现象。那什么时候会产生指令重排现象呢&…

Windows ‘ls‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

文章目录前言原因解决办法前言 Windows和mac混用或Windows与linux混用的情况下&#xff0c;在windows dos窗口随手一个ls&#xff0c;出现了 ‘ls’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 原因 ls是linux的命令&#xff0c;不是windows的命令,win…

python问题解决了吗_Python 问题怎么解决?

展开全部主要问题和解决方法如下&#xff1a;中文路径的问题&#xff1a;在D盘下保32313133353236313431303231363533e58685e5aeb931333365633939存一个名字为‘中文.txt‘的文件。运行如下测试代码&#xff1a;# -*- coding: utf-8 -*-fopen(D:\\中文.txt, r)print f.read()&a…

Linux ls 命令使用介绍

文章目录命令格式命令功能常用参数常用示例示例1 列出文件夹下的所有文件和目录的详细资料示例2 列出当前目录中所有以“t”开头的目录的详细内容&#xff0c;示例3 只列出文件下的子目录命令&#xff1a;示例4 列出目前工作目录下所有名称是以s开头的档案&#xff0c;越新的排…

exls导入数据库 php_PHP读取excel文件并导入数据库

PHPExcel是一个PHP类库&#xff0c;用来帮助我们简单、高效实现从Excel读取Excel的数据和导出数据到Excel。下面是PHPExcel读取的使用教程&#xff1a;1.首先下载PHPExcel2.下载好文件&#xff0c;解压可以得到如下文件&#xff1a;为了使用方便&#xff0c;我们可以在根目录创…

Linux cd 命令使用介绍

文章目录1. 命令格式2. 命令功能3. 常用范例示例1&#xff1a;进入系统根目录cd /2&#xff1a;使用 cd 命令进入当前用户主目录3&#xff1a;跳转到指定目录4&#xff1a;返回进入此目录之前所在的目录5&#xff1a;把上个命令的参数作为cd参数Linux cd 命令是Linux中最基本的…

netty冲突 play sbt_《Netty官方文档》本地传输接口

原文链接 译者&#xff1a;gm777自4.016版本以来&#xff0c; Netty提供了本地的socket传输使Linux系统可以使用JNI(JAVA本地接口)。这个传输接口不仅有着高性能并且产生更少的垃圾&#xff0c;所以你也许会想尝试使用一下。使用本地传输接口由于这个本地传输接口是与NIO传输接…

Linux pwd 命令使用介绍

文章目录1&#xff0e;命令格式2&#xff0e;命令功能3&#xff0e;常用参数4&#xff0e;常用实例实例1&#xff1a;用 pwd 命令查看默认工作目录的完整路径实例2&#xff1a;使用 pwd 命令查看指定文件夹Linux中用 pwd 命令来查看”当前工作目录“的完整路径。每当我们在终端…

java参数传入泛型类型_Java泛型参数界定到任何一个类型的范围

是否有一种语法或解决方法来将泛型类型参数限制为任何一种类型的类型&#xff1f;我知道您可以将类型限制为所有类型的所有类型(即AND逻辑)&#xff1a;public class MyClass & Serializable> { } // legal syntax有OR逻辑版本,就是这样的&#xff1a;public class MyCl…

Linux mkdir 命令使用介绍

文章目录1&#xff0e;命令格式2&#xff0e;命令功能3&#xff0e;命令参数4&#xff0e;命令实例实例1&#xff1a;创建一个空目录实例2&#xff1a;递归创建多个目录或一次创建多级目录实例3&#xff1a;创建权限为777的目录实例4&#xff1a;创建新目录都显示信息实例5&…

jmeter修改redis_jmeter如何访问redis服务缓存

Redis(REmote DIctionary Server)是一个开源的内存数据结构存储&#xff0c;用作数据库&#xff0c;缓存和消息代理。作为内存数据库&#xff0c;它将所有数据保存在RAM中。Redis在读取/写入数据时实现高性能&#xff0c;并且在您需要确保在所有测试服务器上使用唯一数据时也很…

Linux rm/rmdir 命令使用介绍

文章目录1&#xff0e;命令格式2&#xff0e;命令功能3&#xff0e;命令参数4&#xff0e;命令实例1. 删除文件&#xff0c;系统会先询问是否删除。2. 强行删除文件&#xff0c;系统不再提示3. 删除任何.txt文件&#xff1b;删除前逐一询问确认4. 将目录及子目录中所有档案删除…

window服务器cpu过高的排查_线上服务器发生CPU占用率过高应该如何排查并定位问题?...

国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查&#xff0c;结果显示如下&#xff1a;排名前几的比较受重视的能力分别为&#xff1a;解决问题、编程语言熟练程度、Debug、系统设计和性能优化。解决问题的能…

Linux mv 命令使用介绍

文章目录1&#xff0e;命令格式2&#xff0e;命令功能3&#xff0e;命令参数4&#xff0e;命令实例1、文件改名&#xff08; 重命名&#xff09;2、移动文件3、将test目录下的文件text1.txt text2.txt text3.txt移动到目录mv中。4、将文件file1改名为file2&#xff0c;如果file…

Linux touch 命令使用介绍

文章目录1&#xff0e;命令格式2&#xff0e;命令参数3&#xff0e;命令功能4&#xff0e;使用范例1、创建不存在的文件&#xff0c;用法如下2、更新text.txt 的时间和text3.txt时间戳相同3、设定文件的时间戳-t time 格式详细说明linux中的touch命令一般用来修改文件时间戳&am…

qt怎么可以随意设置自己想要的表格_【Qt开发】QTableWidget的详细设置

在使用Qt不多的日子里&#xff0c;已经两次用到了QTableWidget这个控件&#xff0c;也慢慢的习惯和喜欢上了它。再使用QTableWidget的时候&#xff0c;已不像刚开始使用时的迷茫。嗯嗯。现在就来总结总结我与QTableWidget相识的历程......(*^__^*) 嘻嘻……使用时也查过不少资料…