Android N安装apk报错:android.os.FileUriExposedException

StackOverflow: http://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed

1.在AndroidMainifest.xml文件中添加:

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

###:

authorities:app的包名.fileProvider 
grantUriPermissions:true,表示授予 URI 临时访问权限 
exported:false 
resource:下一步添加的文件

2.在res下新建一个名为xml的文件家,再新建文件provider_paths:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="files_root"
        path="Android/data/com.example.downloadapk/"/>
    <external-path
        name="external_storage_root"
        path="."/>
</paths>

###:

path:需要临时授权访问的路径(.代表所有路径) 
name:给访问路径命名

3.安装apk文件:

   /**
     * 安装apk文件
     *
     * @param apkFile 安装包所在目录
     */
    private void installApk(File apkFile) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        try {
            String[] command = {"chmod", "777", apkFile.toString()};
            ProcessBuilder builder = new ProcessBuilder(command);
            builder.start();
        } catch (IOException ignored) {
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(getApplicationContext(),
                    BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }

        startActivity(intent);
    }
时间: 2024-11-03 22:10:29

Android N安装apk报错:android.os.FileUriExposedException的相关文章

我的Android进阶之旅------&gt;解决Android Studio编译后安装apk报错:The APK file does not exist on disk

1.错误描述 今天用Android Studio编译应用后安装APK的时候,报错了,错误如下所示: The APK file build\outputs\apk\OYP_2.3.4_I2Base_6476_official_debug.apk does not exist on disk. Error while Installing APK 如下图所示 2.解决方法 1.尝试了Build -> Clean Project再编译,还是无效 2.尝试重启Android Studio无效 然后我去打

安装apk报错INSTALL_FAILED_UPDATE_INCOMPATIBLE的解决方法

其实不能叫解决方法,因为最后没解决(囧),只是觉得解决的过程有一定的意义,故记录一下 问题的产生是因为要在一部中兴手机上安装中兴应用市场,不过手机上之前已经有了中兴应用市场(我自己要装的是debug版的,没签名).于是乎第一次安装就报上面的错了 一看到错我就纳闷了,不是把老版本的apk卸了吗,怎么还是报冲突.于是网上找了半天,在/data/data/目录下把该apk的目录删了,再run,依然无效. 又在网上看到另一种做法,把/system/packages.xml中该apk的节点信息删除.看了下

解决 genymotion 安装apk报错 app contains ARM native code and your Genymotion device cannot run ARM instructions

1.某些APP安装在模拟器时提示“ this probably means that the app contains ARM native code and your Genymotion device cannot run ARM instructions. You should either build your native code to x86 or install an ARM tanslation tool in your device.” 解决方案:1.下载并安装Genymot

Android 线程更新UI报错 : Can&#39;t create handler inside thread that has not called Looper.prepare()

MainActivity中有一个按钮,绑定了save方法 public void save(View view) { String title = titleText.getText().toString(); String timelength = lengthText.getText().toString(); ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new NewsService(getApp

android studio创建模拟器报错解决 emulator: ERROR: This AVD&#39;s configuration is missing a kernel file!!

android studio创建模拟器报错 emulator: ERROR: This AVD's configuration is missing a kernel file!! 的解决办法 原因有二:1 没有,解决办法通过sdk mangager 下载 2 找不到,解决办法看系统环境变量path(此种情况多数发生在android Studio和EclipseADT同时存在的情况下) 原因是在刚刚安装完毕的androidstudio的sdk目录下没有system-image目录,也许有但没有相

Android Studio集成SVN报错:can&#39;t use subversion command line client : svn

Android Studio集成SVN插件,check out出代码后,每次开启都会在右上角出现如下错误: Can't use Subversion command line client: svn Probably the path to Subversion executable is wrong. Fix it. Errors found while svn working copies detection. Fix it. 下面直接上解决方案吧: 1.安装客户端http://ncu.dl

android studio :com.android.support:appcompat-v7:21.+ 报错

android studio :com.android.support:appcompat-v7:21.+ 报错: 在project——>app——>build.gradle修改: apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { applicationId "com.example.ri

android studio - 导入工程报错[Plugin with id &#39;com.android.application&#39; not found]

出错现象: 大概意思是找不到:com.android.application 插件,以上现象对于初学者来说会经常碰到,下面分析下产生的原因. 原因分析 首先来看看导入后的工程结构: 对于此工程结构,是否有个疑问? 这是未正常同步完成的结构,Gradle Scripts下面似乎少了个 build.gradle ,上图红框部分描述清楚了是 Module: GraphicsDemo ,表示该 build.gradle 是Module的,而不是Project的.来看看一个正常的 Project+Modu

Mac OSX Android 开发环境 模拟器报错

直接下载ADT mac版 模拟器报错处理 1. 显示隐藏文件命令 显示:defaults write com.apple.finder AppleShowAllFiles -bool true隐藏:defaults write com.apple.finder AppleShowAllFiles -bool false 2. 修改 /.android/avd/你的模拟器名字/emulator-user.ini window.x = 0 原因没有深究,可能和双屏有关? Mac OSX Androi