Android7.0以上(自动安装)文件访问报异常android.os.FileUriExposedException: file:///storage/emulated/0/app/****

本文主要是介绍Android7.0以上(自动安装)文件访问报异常android.os.FileUriExposedException: file:///storage/emulated/0/app/****,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

了解了一下出现问题的原因:Android N(对应sdk24)(版本7.0)及以上对访问文件权限收回,按照Android N的要求,若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。 

而进行此授权的最简单方法:使用 FileProvider类。

步骤一:在AndroidManifest.xml文件中注册一个provider

​
<provider//这里是自己应用的包名android:authorities="自己的包名.fileprovider"android:name="android.support.v4.content.FileProvider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"//在res中建立一个xml文件夹,在文件夹中创建filepaths.xml文件android:resource="@xml/filepaths"/></provider>​

步骤二:创建filepaths.xml文件

<?xml version="1.0" encoding="utf-8"?>
<paths><external-pathname="external_path"path="app/" /></paths>

上面的两个属性要根据自己的使用来配置。

其中 <external-path> 就是手机的外置存储目录。

path="自己共享的目录"

其他节点说明:

    <!--代表外部存储区域的根目录下的文件 Environment.getExternalStorageDirectory()/DCIM/XX目录-->
    <external-path name="hm_DCIM" path="DCIM/XX" />
    <!--代表外部存储区域的根目录下的文件 Environment.getExternalStorageDirectory()/Pictures/XX目录-->
    <external-path name="hm_Pictures" path="Pictures/XX" />
    <!--代表app 私有的存储区域 Context.getFilesDir()目录下的images目录 /data/user/0/com.hm.camerademo/files/images-->
    <files-path name="hm_private_files" path="images" />
    <!--代表app 私有的存储区域 Context.getCacheDir()目录下的images目录 /data/user/0/com.hm.camerademo/cache/images-->
    <cache-path name="hm_private_cache" path="images" />
    <!--代表app 外部存储区域根目录下的文件 Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)目录下的 Pictures目录-->
    <!--/storage/emulated/0/Android/data/com.hm.camerademo/files/Pictures-->
    <external-files-path name="hm_external_files" path="Pictures" />
    <!--代表app 外部存储区域根目录下的文件 Context.getExternalCacheDir目录下的images目录-->
    <!--/storage/emulated/0/Android/data/com.hm.camerademo/cache/images-->
    <external-cache-path name="hm_external_cache" path="" />

   <!--/storage/emulated/0/app/下的目录 内部存储-->

   <external-path name="external-path" path="app/" />

步骤三:应用内自动安装

private Intent getInstallIntent() {String fileName = savePath + appName + ".apk";Uri uri = null;Intent intent = new Intent(Intent.ACTION_VIEW);try {if (Build.VERSION.SDK_INT >= 24) {//7.0 Android N    //com.xxx.xxx.fileprovider为上述manifest中provider所配置相同uri = FileProvider.getUriForFile(mContext, "你自己的包名.fileprovider", new File(fileName));intent.setAction(Intent.ACTION_INSTALL_PACKAGE);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//7.0以后,系统要求授予临时uri读取权限,安装完毕以后,系统会自动收回权限,该过程没有用户交互} else {//7.0以下uri = Uri.fromFile(new File(fileName));intent.setAction(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}intent.setDataAndType(uri, "application/vnd.android.package-archive");startActivity(intent);return intent;} catch (IllegalArgumentException e) {e.printStackTrace();}catch (ActivityNotFoundException e){e.printStackTrace();}catch (Exception e){e.printStackTrace();}return intent;}

这样就顺利解决访问文件权限的问题了,完成自动安装

这篇关于Android7.0以上(自动安装)文件访问报异常android.os.FileUriExposedException: file:///storage/emulated/0/app/****的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384505

相关文章

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术