博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android项目实战(四十):Andoird 7.0+ 安装APK适配
阅读量:5818 次
发布时间:2019-06-18

本文共 2143 字,大约阅读时间需要 7 分钟。

原文:

  

   首先看一下安装apk文件的代码

   /**     * 通过隐式意图调用系统安装程序安装APK     */    public static void install(Context context) {        Intent intent = new Intent(Intent.ACTION_VIEW);        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        intent.setDataAndType(Uri.fromFile(                new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "xxxx.apk")),                "application/vnd.android.package-archive");        context.startActivity(intent);    }

  

    测试发现该段代码在7.0一下的机型上可以成功打开指定路径下的指定apk文件 , 但是在7.0+的机型上调用该代码会报错:

  android.os.FileUriExposedException: file:///storage/emulated/0/Download/xxxx.apk exposed beyond app through Intent.getData()

 

 

     原因在于:Android 7.0 版本开始  禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常。

   

  解决方法:

  一、在AndroidManifest.xml 文件中添加 四大组件之一的 <provider>

    

 

   注意这里的  android :authorities 属性的值 中的 com.xxx.xxxx 是你的包名,不可随意填写

 

  二、res 目录下 建一个xml 文件,并新建xml文件file_paths.xml 

    注意文件名要和第一步中的 resource 属性的值一致 

    内容为:

 

 

  

  三、根据机型的Android系统级别执行不同的安装apk的代码

      注意,根据系统版本执行不同代码,7.0以下调用7.0+的代码会报错,7.0+的调用7.0以下的会报错。

      if (file!=null){   // file 即 apk文件                Intent intent = new Intent(Intent.ACTION_VIEW);                // 由于没有在Activity环境下启动Activity,设置下面的标签                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                if(Build.VERSION.SDK_INT>=24) { //判读版本是否在7.0以上                    //参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致   参数3  共享的文件                    Uri apkUri =                            FileProvider.getUriForFile(context, "com.xxx.xxxxx.fileprovider", file);                    //添加这一句表示对目标应用临时授权该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);            }

 

转载地址:http://vswdx.baihongyu.com/

你可能感兴趣的文章
红黑树
查看>>
UIImagePickerController拍照与摄像
查看>>
python调用windows api
查看>>
第四章 mybatis批量insert
查看>>
Java并发框架——什么是AQS框架
查看>>
【数据库】
查看>>
Win配置Apache+mod_wsgi+django环境+域名
查看>>
linux清除文件内容
查看>>
WindowManager.LayoutParams 详解
查看>>
find的命令的使用和文件名的后缀
查看>>
Android的Aidl安装方法
查看>>
Linux中rc的含义
查看>>
曾鸣:区块链的春天还没有到来| 阿里内部干货
查看>>
如何通过Dataworks禁止MaxCompute 子账号跨Project访问
查看>>
js之无缝滚动
查看>>
Django 多表联合查询
查看>>
logging模块学习:basicConfig配置文件
查看>>
Golang 使用 Beego 与 Mgo 开发的示例程序
查看>>
ntpdate时间同步
查看>>
+++++++子域授权与编译安装(一)
查看>>