Android N及以上版本应用安装包下载完成自动弹出安装界面的适配方法

Android N及以上版本应用安装包下载完成自动弹出安装界面的适配方法

  在实现下载和安装APP功能的时候在Android较高版本可能会遇到如下的问题:

  • 安装Apk时报错:android.os.FileUriExposedException: file:///storage/emulated/0/Download/*.apk exposed beyond app through Intent.getData();
  • 弹不出安装界面。

  上面遇到的这两个问题主要是Android 8.0针对未知来源应用做了权限限制,针对该问题的解决及完整适配方法如下。

完整适配步骤

1、适配Android 8.0及以上系统,需要在AndroidManifest.xml中添加安装权限:

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

  Android O及Android 8.0及以上系统若不加该权限,会遇到跳转到安装界面时闪退的问题,原因是8.0针对未知来源应用,在应用权限设置的“特殊访问权限”中,加入了“安装其他应用”的设置。
2、在AndroidManifest.xml中添加provider声明:

<application
    ......
    <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/file_paths" />
    </provider>
</application>

3、在res目录下新建一个名为xml的目录,并在xml目录下新建一个名为file_paths.xml的文件;
4、在file_paths.xml的文件中添加如下代码:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path name="external_files_path" path="Download" /><!--path:需要临时授权访问的路径(.代表所有路径)
    name:就是你给这个访问路径起个名字-->
    <!--为了适配所有路径可以设置 path = "." -->
    <external-path path="." name="external_storage_root" />
</paths>

5、适配Android N弹出安装界面的代码:

private void isAPK(String filePath) {
    File file = new File(filePath);
    if (file.getName().endsWith(".apk")) {
        try {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            Uri uri;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 适配Android 7系统版本
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
                uri = FileProvider.getUriForFile(XRetrofitApp.getApplication(), XRetrofitApp.getApplication().getPackageName() + ".fileprovider", file);//通过FileProvider创建一个content类型的Uri
            } else {
                uri = Uri.fromFile(file);
            }
            intent.setDataAndType(uri, "application/vnd.android.package-archive"); // 对应apk类型
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            XRetrofitApp.getApplication().startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

PS:下载完文件,可以通过发送扫描广播,告诉系统扫描数据库及时刷新文档里面的文件,这样即使下载安装出错,还可以进入文档查看安装应用包,代码如下:

Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
//根据需要自定义IMG_PATH路径
Uri uri = Uri.fromFile(new File(downLoadPath + java.io.File.separator));
intent.setData(uri);
context.sendBroadcast(intent);
已标记关键词 清除标记
课程简介: 历经半个多月的时间,Debug亲自撸的 “企业员工角色权限管理平台” 终于完成了。正如字面意思,本课程讲解的是一个真正意义上的、企业级的项目实战,主要介绍了企业级应用系统中后端应用权限的管理,其中主要涵盖了六大核心业务模块、十几张数据库表。 其中的核心业务模块主要包括用户模块、部门模块、岗位模块、角色模块、菜单模块和系统日志模块;与此同时,Debug还亲自撸了额外的附属模块,包括字典管理模块、商品分类模块以及考勤管理模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程! 核心技术栈列表: 值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部分常用技术,包括Spring Boot、Spring MVC、Mybatis、Mybatis-Plus、Shiro(身份认证与资源授权跟会话等等)、Spring AOP、防止XSS攻击、防止SQL注入攻击、过滤器Filter、验证码Kaptcha、热部署插件Devtools、POI、Vue、LayUI、ElementUI、JQuery、HTML、Bootstrap、Freemarker、一键打包部署运行工具Wagon等等,如下图所示: 课程内容与收益: 总的来说,本课程是一门具有很强实践性质的“项目实战”课程,即“企业应用员工角色权限管理平台”,主要介绍了当前企业级应用系统中员工、部门、岗位、角色、权限、菜单以及其他实体模块的管理;其中,还重点讲解了如何基于Shiro的资源授权实现员工-角色-操作权限、员工-角色-数据权限的管理;在课程的最后,还介绍了如何实现一键打包上传部署运行项目等等。如下图所示为本权限管理平台的数据库设计图: 以下为项目整体的运行效果截图: 值得一提的是,在本课程中,Debug也向各位小伙伴介绍了如何在企业级应用系统业务模块的开发中,前端到后端再到数据库,最后再到服务器的上线部署运行等流程,如下图所示:
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页