multi file error Exception No Activity found to handle Intent

应用中安装第三方apk的两种方法:利用Intent跳转安装页面、利用PackageInstaller静默安装 目前网上大多数关于应用程序中安装apk方法的文章,都会提到智能安装(需要跳转安装页面,但不需用户操作,利用(Google辅助功能),第二种是利用adb命令把安装包push到手机中实现静默安装。 但是本篇实现的方法有所不一样。一种是通过Intent实现(不需要root,跳转到安装界面,需要用户操作),一种是通过PackageInstaller.Session的方法实现静默安装(静默安装都是需要ro... 阅读详情

原文地址:http://www.czhzero.com/2016/12/21/how-to-install-apk-on-Android7-0/

Android系统升级到7.0之后,安全性提高了不少,过去我们通常是使用这样的代码进行apk的安装操作。

1
2
3
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
context.startActivity(intent);

但是在Android7.0的系统上,运行这段代码,会报如下错误。

Caused by: android.os.FileUriExposedException

原因是,安卓官方为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问 (0700)。此设置可防止私有文件的元数据泄漏,如它们的大小或存在性.

传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。因此,尝试传递 file:// URI 会触发 FileUriExposedException。分享私有文件内容的推荐方法是使用 FileProvider。

1.定义一个FileProvider

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<manifest>
    ...
    <application>
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.mydomain.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            ...
        </provider>
        ...
    </application>
</manifest>

2.添加可用权限的文件目录

在res目录下,增加xml文件夹,并新建一个名为 file_paths.xml 的文件。文件内容格式如下:

1
2
3
4
<paths xmlns:android="http://schemas.android.com/apk/res/android">
   		<files-path name="name1" path="test1" />
    	...
</paths>

标签下面必须包含至少包含以下标签中的一个或者多个。

files-path

1
<files-path name="name1" path="test1" />

表示Context.getFilesDir()目录或者其子目录。

示例 : /data/data/com.chen.gradle/files/test1

cache-path

1
<cache-path name="name2" path="test2" />

表示Context.getCacheDir()目录或者其子目录。

示例 : /data/data/com.chen.gradle/cache/test2

external-path

1
<external-path name="name3" path="test3" />

表示Environment.getExternalStorageDirectory()目录或者其子目录。

示例 : /storage/emulated/0/test3

external-files-path

1
<external-files-path name="name4" path="test4" />

表示Context.getExternalFilesDir(null)目录或者其子目录。

示例 : /storage/emulated/0/Android/data/com.chen.gradle/files/test4

external-cache-path

1
<external-cache-path name="name5" path="test5" />

表示Context.getExternalCacheDir()目录或者其子目录。

示例 : /storage/emulated/0/Android/data/com.chen.gradle/cache/test5

3.增加到provider

通过<meta-data>标签将上面的filepath添加到provider当中。

1
2
3
4
5
6
7
8
9
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.mydomain.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

4.通过provider生成Uri

1
2
3
4

File imagePath = new File(Context.getFilesDir(), "test1");
File newFile = new File(imagePath, "default_image.jpg");
Uri contentUri = FileProvider.getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);

5.赋予临时权限给Uri

1
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

最终安装apk的代码变成这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

public static void installApk(Context context, String apkPath) {
    if (context == null || TextUtils.isEmpty(apkPath)) {
        return;
    }

    
    File file = new File(apkPath);
    Intent intent = new Intent(Intent.ACTION_VIEW);

    //判读版本是否在7.0以上
    if (Build.VERSION.SDK_INT >= 24) {
        //provider authorities
        Uri apkUri = FileProvider.getUriForFile(context, "com.mydomain.fileprovider", file);
        //Granting Temporary Permissions to a URI
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
    } else {
        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
    }

    context.startActivity(intent);
}

参考文献

Android 7.0 行为变更

beegfs读取文件完整流程分析 读取小于512KB文件数据,小于1s 读取15MB文件数据,花费7秒。 阅读详情

相关推荐

从材料到磁场:ANSYS Workbench永磁体仿真全流程解析

本文详细解析了在ANSYS Workbench中进行永磁体仿真的完整流程。从钕铁硼等永磁材料的特性讲起,逐步指导如何在软件中搭建模型、定义关键磁化方向、设置边界条件与网格划分,并解读磁场分布结果。文章旨在帮助工程师掌握静磁场仿真核心技术,为电机、传感器等设备的设计与优化提供精准指导。

weixin_29229989的博客 272

如何在Android7.0系统下通过Intent安装apk

如何在Android7.0系统下通过Intent安装apk Android系统升级到7.0之后,安全性提高了不少,过去我们通常是使用这样的代码进行apk的安装操作。 1 2 3 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(apkFile),

wdd1324的博客 1049

revit二次开发环境搭建(2024版)(小白友好)

revit二次开发环境配置,SDK、addin manager和lookup新手友好安装教程

m0_56961251的博客 1419

Android之Intent意图之安装卸载apk

1、为了layout界面代码重用,在styles.xml中加入自定义样式 <resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your th...

阿宁的博客 911

手把手教你用Cesium和RayMarching实现逼真体积云(附完整Shader代码)

本文详细介绍了如何利用Cesium和RayMarching技术实现逼真的体积云效果,包括环境准备、核心逻辑、云层建模和光照增强等关键步骤,并提供了完整的Shader代码。通过噪声函数选型、动态风场模拟和多重散射近似等技术,开发者可以在数字地球可视化项目中创建沉浸式天气效果,显著提升场景的真实感。

weixin_29230649的博客 415

TLSR8258蓝牙Mesh实战:从SDK下载到自定义通信指令全流程(附避坑指南)

本文详细介绍了TLSR8258蓝牙Mesh开发的完整流程,从SDK下载、环境搭建到自定义通信指令的实现。通过实战案例和避坑指南,帮助开发者快速掌握低功耗蓝牙Mesh网络构建技巧,适用于智能家居、工业监控等物联网场景。

weixin_29176179的博客 199

Android关于安装应用的那些事

权限 在开始前,先说一下需要的权限。 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permis...

weixin_45365889的博客 1168

初识Classic AUTOSAR开发工具链

在过去,软件和硬件之间具有很强的耦合性,阻碍了软件组件在不同硬件平台上的可移植性和重用性。而AUTOSAR作为汽车电子行业的标准,提供标准的软件接口定义,工程师可以根据需求将软件组件分配到汽车的ECU中,实现标准软件组件的可重用性。

怿星科技的博客 8092

android隐式intent安装apk,使用Intent安装APK方法(兼容Android N)

Android N之前,通过Intent安装一个APK代码差多不是下面这个样子的:Intent install = new Intent(Intent.ACTION_VIEW);install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);File apkFile = new File(getExternalFilesDir(Environment.DIRECTO...

weixin_36419499的博客 1710

05 SAP CPI 访问第一个CPI接口

其中的clientid的值可作为Basic验证的用户名,clientsecret的值可作为Basic验证的密码。点击SEND按钮,可看见返回状态为200 OK。在04中,我们得到TOKEN令牌。POSTMAN向下滚动。点击按钮获取token。

SAP CPI 662

基于STM32L4XX、HAL库的ESP32-C3-WROOM-02-N4 WIFI模块驱动程序设计

支持802.11 b/g/n Wi-Fi (2.4GHz)RISC-V 32位单核处理器,主频高达160MHz。封装尺寸:18mm × 20mm × 3mm。工作温度范围:-40°C ~ 85°C。// 设置WiFi模式为STA。支持Bluetooth 5 (LE)// 发送AT指令测试通信。// 检查响应是否包含OK。内置4MB SPI Flash。// 连接TCP服务器。// 发送HTTP请求。// 初始化UART。// 建立TCP连接。低功耗设计,适合IoT应用。

zhusl6688的博客 384

android隐式intent安装apk,androidN通过intent安装apk需要使用FileProvider

有问题的安装:之前可以直接这样安装apk:/** *@param file *@return *@Description 安装apk */public void installApk(File file) {Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setDataAndType(Uri.from...

weixin_42345868的博客 545

USB_TYPE-C 母座电路设计

本文详细介绍了USB Type-C接口(C2765186)的电路设计要点,重点解析了电源、识别和数据三部分的关键连接方案。电源部分需并联VBUS和GND引脚并加宽走线以承载3A电流;识别部分必须为CC1/CC2引脚配置5.1kΩ±1%精度的下拉电阻,这是触发PD充电的核心条件;数据部分通过短接正反插引脚实现盲插功能。文档还提供了完整的引脚对照表,并强调PCB布局需注意ESD防护、差分走线阻抗控制等要点,为Type-C接口设计提供了实用指导。

在读研究生,FPGA电路设计与功能开发。 581

通过Intent安装apk

Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://"+ "/sdcard/solitaire.apk"),"application/vnd.android.package-archive"); startActivity(intent);

业精于勤荒于嬉,行成于思毁于随 567

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

APK安装过程解析

安装apk,本质上是通过系统的应用packageInstaller.apk来完成的。因此,我们需要查看的是packageInstaller的源码。

jxq1994的博客 879

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android install apk 兼容至 Android 8

code小生,一个专注 Android 领域的技术分享平台作者:可乐链接:https://www.jianshu.com/p/c0166d270783声明:已获 可乐 授...

code小生 3009

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android9 apk自动安装功能,如何在Android7.0、8.0、9.0系统下通过Intent安装apk

public static void installApk(Context context, String apkPath) {if (context == null || TextUtils.isEmpty(apkPath)) {return;}File file = new File(apkPath);Intent intent = new Intent(Intent.ACTION_VIEW)...

weixin_32273747的博客 1294

Android使用Intent跳转APK安装

Android7.0之前的跳转 Uri uri = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(uri ,"application/vnd.android.package-archive"); startActivity(intent); Android7.0的跳转 要在And

qq_45172616的博客 746

通过 intent安装 apk

一,我们通过 intent安装 apk:Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(Uri.parse("file://" + path),"application/vnd.android.package-ar

Jack_SivenChen的博客 2885

Android应用安装与自升级

想要安装应用就需要读取APK文件,因此就需要有文件读取的权限。关于APK的位置,可以自定义路径,如”根目录/Download/”下。

w2_2015的博客 2661

android应用安装流程详解

在InstallingAsyncTask的doInBackground()里会根据包的Uri,将APK的信息通过IO流的形式写入到PackageInstaller.Session中,最后会在onPostExecute()中调用PackageInstaller.Session的commit方法,进行安装。在上述的过程中,通过PackageInstaller维持了Session,把安装包写入到Session,真正的安装过程就要来看PMS了。在这里就通过文件流的操作,把Apk拷贝到/data/app的目录下了。

allen_xu_2012_new的博客 8282

在Android中在当前应用程序中安装另外一个应用程序

通过这种方式,你可以在应用中安装另一个APK文件。不过需要注意的是,从Google Play下载的应用无法自动静默安装其他应用程序。假设你有一个APK文件已经下载到设备的某个目录,你可以通过以下步骤调用该方法。假设你在一个Activity中调用。

LLZjiayou的博客 1402

Android7.0、8.0安装apk以及安装apk弹出“选择打开方式”的解决方案

目录 Android7.0安装apk导致的FileUriExposedException异常 问题描述 解决方案 Android8.0安装apk无法跳转到正常的APP安装页面 问题描述 解决方案 安装apk时弹出“选择打开方式”让用户选择而不是直接跳转到APP安装界面 问题描述 解决方案 安装apk代码示例 最近在做一款APP,做自动更新的时候,安装apk遇到了一些问题: ...

Lone_Star斌 的博客 1万+

【Android】在App里面安装Apk文件

在App里面安装Apk文件

每天不是在写bug就是在写bug的路上 4870

如何在Android上安装apk软件

Android软件APK安装方法很简单,下面我就和大家分享一下如何安装APK文件到Android模拟器的图文教程。 http://bbs.fengbao.com/thread-26195-1-1.html 1) 首先启动Android模拟器,在Android SDK的Tools文件夹中找到Emulator文件,双击emulator.exe即可启动模拟器

jiangxinyu的专栏 2258

android隐式intent安装apk,Android N 通过Intent安装APK

图片发自简书App封面图还是要有的之前使用Intent 安装APK文件,使用下面的代码可以直接调起安装界面。public void installAPK(Context context, File apkFile){Intent intent = new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK...

weixin_42394100的博客 779
上一篇: Glide使用之配置缓存
下一篇: Android屏幕适配小技巧sw<n>dp
束千凡
博客等级 码龄14年 21粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值