权限

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>   //允许安装未知来源的app
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

说明:REQUEST_INSTALL_PACKAGES该权限是8.0及以后得版本产生的,低于此版本不需要动态申请权限(当你动态申请权限的时候,会得到该权限没有授权的回调,但是你去申请权限是弹不出选择窗口,而是直接进了未授权的回调)。
清单文件
<application>
  ................   <!--适配7.0以上安装app-->
  <provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" /> //说明:这里的
filepaths是res下面新建的xml名称的文件夹下的文件
  </provider>
</application> res资源文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path path="." name="download" />
</paths>
</resources>

  该文件 <paths>标签下的标签有如下几种类型:

1、<files-path path="" name="camera_photos" />

  该方式提供在应用的内部存储区的文件/子目录的文件。它对应Context.getFilesDir返回的路径:    eg:"/data/data/com.jph.simple/files"。

2、<cache-path name="name" path="path" />

  该方式提供在应用的内部存储区的缓存子目录的文件。它对应getCacheDir返回的路径:eg:“/data/data/com.jph.simple/cache”;

3、<external-path name="name" path="path" />

  该方式提供在外部存储区域根目录下的文件。它对应Environment.getExternalStorageDirectory返回的路径:eg:"/storage/emulated/0";

4、<external-files-path name="name" path="path" />

  该方式提供在应用的外部存储区根目录的下的文件。它对应Context#getExternalFilesDir(String) Context.getExternalFilesDir(null)返回的路径。eg:"/storage/emulated/0/Android/data/com.jph.simple/files"。

5、<external-cache-path name="name" path="path" />

  该方式提供在应用的外部缓存区根目录的文件。它对应Context.getExternalCacheDir()返回的路径。eg:"/storage/emulated/0/Android/data/com.jph.simple/cache"。

6、<root-path path="" name="camera_photos" />

  root-path代表/也就是Android设备的根目录,该目录下包含着手机内部存储器,外置SD卡等所有文件的目录。

综上:对filepaths,xml文件的编写,需要根据你的apk包所在文件路径来选择paths的相对应类型,

    从而保障调用FileProvider.getUriForFile()时不会报“Failed to find configured root that contains”异常。

下载    
private void loadFromServer() {
DialogUtil.getInstance().showDialogText(this,"0%");
OkGo.<File>get(appurl)
.tag(this)
.execute(new FileCallback() {
@Override
public void onSuccess(Response<File> response) {
dialogDismiss();
installApp(response.body());
} @Override
public void onError(Response<File> response) {
super.onError(response);
if (newVersionBean!=null&&newVersionBean.getData()!=null&&"1".equals(newVersionBean.getData().getIs_force_update())){
android.os.Process.killProcess(android.os.Process.myPid()); //获取PID
System.exit(0);
}else{
dialogDismiss();
displayMessage(getResources().getString(R.string.prompt_downloadfauil));
}
} @Override
public void downloadProgress(Progress progress) {
super.downloadProgress(progress);
DialogUtil.getInstance().showContent((int)((progress.currentSize/(float)progress.totalSize)*100)+"%");
}
});
} 安装app
private void installApp(File file){
// setPermission(file.getPath());
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra("name", "");
intent.addCategory("android.intent.category.DEFAULT");
String packageName = getPackageName();
Uri data;
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){ //8.0以上需要在清单文件中写上权限:REQUEST_INSTALL_PACKAGES。小米的时候并不需要getPackageManager().canRequestPackageInstalls()的结果为true才做安装操作,会自动弹出允许安装未知来源的App的系统弹窗
//            boolean b = getPackageManager().canRequestPackageInstalls();
// 临时允许
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
data = FileProvider.getUriForFile(this, packageName + ".fileprovider", file);
}else if (Build.VERSION.SDK_INT >= 24){
// 临时允许
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
data = FileProvider.getUriForFile(this, packageName + ".fileprovider", file);
}else {
data = Uri.fromFile(file);
}
intent.setDataAndType(data, "application/vnd.android.package-archive");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
/**
* 提升读写权限
*
* @param filePath 文件路径
*/
private static void setPermission(String filePath) {
String command = "chmod " + "777" + " " + filePath;
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec(command);
} catch (IOException e) {
e.printStackTrace();
}
} // 获取当前App版本
private String getLocalVersion() {
// 获取包管理者对象
PackageManager pm = getPackageManager();
try {
// 获取包的详细信息
PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
// 获取版本号和版本名称
return info.versionName;
} catch (Exception e) {
return "";
}
}
鸣谢:

https://www.jianshu.com/p/121bbb07cb07
 

应用中对APK进行安装的更多相关文章

  1. adb取出安装在手机中的apk

    Android实战技巧之十八:adb取出安装在手机中的apk 场景: 朋友看见你Android手机中的游戏或应用很好玩,也想装一个此程序,但限于网络条件不能从网上下载.那么最简单的办法就是直接从你手机 ...

  2. 不安装谷歌市场,下载谷歌市场中的APK

    不安装谷歌市场,下载谷歌市场中的APK GooglePlayStore 是谷歌官方的的应用市场,有的时候还是需要从谷歌市场下载APK文件.国内的安卓手机厂商都不自带GooglePlay,甚至一些手机& ...

  3. android APK应用安装过程以及默认安装路径[转]

    一:安装过程 APK是类似Symbian Sis或Sisx的文件格式.通过将APK文件直接传到Android模拟器或Android手机中执行即可安装. Android应用安装有如下四种方式 1.   ...

  4. 用re-sign.jar重签名apk后安装失败的解决办法

    问题 打开re-sign.jar,将下载好的apk拖入re-sign.jar的界面进行重签名.重签名成功后,通过adb intall命令安装重签名后的apk文件失败.提示:Failure [INSTA ...

  5. Android apk 的安装过程

    Android应用安装有如下四种方式 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面 3.ADB工具安装――没有安装界面. 4.第三方应用 ...

  6. Android apk的安装、卸载、更新升级(通过Eclipse实现静默安装)

    一.通过Intent消息机制发送消息,调用系统应用进行,实现apk的安装/卸载 . (1) 调用系统的安装应用,让系统自动进行apk的安装 String fileName = "/data/ ...

  7. APK文件安装模拟器和ADB命令的使用

    1.安装APK文件到模拟器 Android手机使用的执行文件为APK格式,类似于Windows平台的exe文件.在Android模拟器中安装APK文件有多种方法,如果你是开发人员,可以通过Eclips ...

  8. Android中的Apk的加固(加壳)原理解析和实现

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

  9. Android中的Apk的加固(加壳)原理解析和实现(转)

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

随机推荐

  1. 关联分析Apriori算法和FP-growth算法初探

    1. 关联分析是什么? Apriori和FP-growth算法是一种关联算法,属于无监督算法的一种,它们可以自动从数据中挖掘出潜在的关联关系.例如经典的啤酒与尿布的故事.下面我们用一个例子来切入本文对 ...

  2. MySQL数据转移至SQL Server详解

    最近有个活是mysql数据转移到sql server 2012,直接手动转工作量太大,发现网上有工具教程,则记录一下. 一.安装MySQL ODBC驱动为MySQL安装Connector/ODBC驱动 ...

  3. 07--STL序列容器(Array)

    一:Array了解 array<T,N> 模板定义了一种相当于标准数组的容器类型.它是一个有 N 个 T 类型元素的固定序列.除了需要指定元素的类型和个数之外,它和常规数组没有太大的差别. ...

  4. Excel——使用INDEX和SMALL实现条件筛选

    如下图所示,如何实现Excel自带的筛选功能呢?(对的,就是软件自带的功能) 如何实现: B13的公式:=IFERROR(INDEX(B:B,SMALL(IF(A$1:A$10=B$12,ROW($1 ...

  5. mysql将表数据导出为txt或csv文件

    语法:select 字段 from 表名 into outfile 路径 示例txt:select * from stu_class into outfile './stu_class.text'; ...

  6. UE4命令行使用,解释

    命令行在外部 从命令行运行编辑项目 1 导航到您的[LauncherInstall][VersionNumber]\Engine\Binaries\Win64 目录中. 2 右键单击上 UE4Edit ...

  7. 使用以太网通信方式刷新AB PLC固件

    本文详细介绍如何使用以太网通信方式刷新AB PLC固件 一.准备工作 1.  AB PLC控制器一台,本文以5069-L330ER为例,将其通电: 2.  5069-L330ER的IP已设置为172. ...

  8. 你们都在用IntelliJ IDEA吗?或许你们需要看一下这篇博文

    写在前面 以前一直用的elipce,如今入坑IntelliJ IDEA,没想到啊.深深的爱上了它,强大到无所不能: "工欲善其事必先利其器",IntelliJ IDEA作为一个非常 ...

  9. 初识Asp.Net WebApi

    using System;using System.Collections.Generic;using System.Linq;using System.Net.Http;using System.T ...

  10. 论文阅读笔记(一)FCN

    本文先对FCN的会议论文进行了粗略的翻译,使读者能够对论文的结构有个大概的了解(包括解决的问题是什么,提出了哪些方案,得到了什么结果).然后,给出了几篇博文的连接,对文中未铺开解释的或不易理解的内容作 ...