安卓7.0下载更新并且自动跳转到安装页面

Android7.0后台服务器更新之后使用Intent跳转至APK安装 问题描述:华为荣耀8  Android7.0手机系统下载APK更新包之后未跳转至APK安装页,报 android.os.FileUriExposedException:(在相应的手机安装目录下能找apk文件)其他手机能正常跳转。原因:Android N对访问权限收回,按照Android N的要求,若要在应用间共享文件,您应发送一项content://URI,并授予URI临时访问权限。因此进行此授权... 阅读详情

一.前言

    安卓6.0之后有很多的改动,比如动态获取权限,特别是获取内部存储的权限只能动态获取,不能在AndroidManifest.xml写死,同时        跳转安装页面的代码也有所改动,网上也有相关资料,我在这里把我遇到问题整理,并且发不出来,以android下载更新这个Demo来说明.

 

1.动态获取内部存储访问权限

    (1).在代码里面声明你的权限列表,用字符串数组存储.如下:

    

     private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE};

  这里我们声明了对外部存储的读和写权限.

 (2).需要在代码里面判断当前系统的版本,看是否支持动态获取,代码如下:

   

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);
            }
        }

 如果当前系统版本大于LOLLIPOP的话,判断当前系统是否获取读写外部存储的功能,如果没有则获取权限,这个的REQUEST_PERMISSION_CODE是一个整型常量,标识请求权限吗,这里设置为1,接下来就是正式获取权限了.

(3).这里需要重写 onRequestPermissionsResult方法,该方法用于获取在PERMISSIONS_STORAGE里面获取的权限,请注意注解TargetApi,如果你要兼容android6.0以下的版本的系统的话,我这里要兼容4.4版本,因此默认是无法使用此api的,编译器会报错,该注解标识忽略兼容性问题,但是你还要处理兼容性问题,这里我在AndroidManifest.xml配置了权限以兼容4.4版本

    

 /*
    * 申请读取/写入文件的权限
    * */
    @Override
    @TargetApi(23)
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_PERMISSION_CODE) {
            for (int i = 0; i < permissions.length; i++) {
                Log.i("MainActivity", "申请的权限为:" + permissions[i] + ",申请结果:" + grantResults[i]);
            }
        }
    }

 (4).完整的代码如下:

    

private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE};
    private static int REQUEST_PERMISSION_CODE = 1;


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        String versionName = getVersionName();
        //System.out.println("versionName:"+versionName);
        TextView tv_version  = findViewById(R.id.tv_version);
        tv_version.setText("版本:"+versionName);//动态设置版本信息
        mTv_progress = findViewById(R.id.tv_progress);//默认隐藏
        checkVersion();
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);
            }
        }





    }

/*
    * 申请读取/写入文件的权限
    * */
    @Override
    @TargetApi(23)
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_PERMISSION_CODE) {
            for (int i = 0; i < permissions.length; i++) {
                Log.i("MainActivity", "申请的权限为:" + permissions[i] + ",申请结果:" + grantResults[i]);
            }
        }
    }

2.跳转安装页面

     获取硬盘存储权限后就是下载安装文件apk,之后就是跳转到安装页面进行安装了,这里说下跳转安装页面,这里也有所改动了(android7.0的改动).

   (1).在AndroidManifest.xml下面配置provider

  <provider
                android:name="android.support.v4.content.FileProvider"
                android:authorities="你的包名.fileProvider"
                android:grantUriPermissions="true"
                android:exported="false">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" 
            android:resource="@xml/file_paths" />
        </provider>

   注意provider需要配置自己报名,provider需要配置到application里面

 

  (2).在res文件夹里面创建xml的文件夹,在该文件夹里面创建名字为file_paths的xml文件,如下图:

   

 (3).在file_paths.xml文件中写入如下内容:

     

<?xml version="1.0" encoding="utf-8"?>
<paths>
             <external-path path="Android/data/你的包名/" name="files_root"/>
             <external-path path="." name="external_storage_root"/>
</paths>

   path标识你要获取临时访问权限的目录,"."表示所有的目录,name标识是外部或者内部存储

 (4).代码里面判断当前系统版本是否大于androidN,如果是的话调用新的方法,如果不是的话调用旧的方法

    

//跳转到系统下载页面
                      Intent intent = new Intent(Intent.ACTION_VIEW);
                      intent.addCategory(Intent.CATEGORY_DEFAULT);
                      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                          intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                          Uri contentUri = FileProvider.getUriForFile(SplashActivity.this, BuildConfig.APPLICATION_ID + ".fileProvider", responseInfo.result);
                          intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
                      } else {
                          intent.setDataAndType(Uri.fromFile(responseInfo.result), "application/vnd.android.package-archive");
                          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                      }

                      //startActivity(intent);
                      startActivityForResult(intent,0);//如果用户取消安装的话,

 intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)给Uri授予临时读取权限,Uri contentUri = FileProvider.getUriForFile(SplashActivity.this, BuildConfig.APPLICATION_ID + ".fileProvider", responseInfo.result)生成了文件的uri,之前我们在files_path.xml中配置的path就是临时获取权限的目录,

 

3.一些需要注意的地方

     在测试时需要一个问题就是在AndroidManifest.xml更改系统版本好没有效果,其实在android使用gradle来构建之后,AndroidManifest.xml的效果被削减了,其实你改版本号的话需要在build.gradle中修改才可以.

这样下载更新安装的功能就可以用了.

Android实现下载APK文件并自动执行安装 立即下载

相关推荐

下载APK文件后自动安装安卓源码

下载APK文件后自动安装安卓源码,可以测试看看,有什么问题可以给我留言。

Android 自动安装APK,并停留在安装完成页面(适配7.0+)。

最近又整理一下,安装Apk的流程。适配了android7.0+版本的机型。 这里配置就要注意了,如果配置不好,回出现 “解析安装包异常”,这样问题其实不是包存在问题,而是我们的配置出现了偏差, 当然我们也需要注意,我们的包的确是没有问题的。才去看代码是哪里出现了问题。 废话不多说之间上代码。其实还是蛮简单的 Intent install = new Intent(In...

WL-鬼 1788

Android 自动安装apk

android 自动安装apk的demo,可根据自己的需求进行修改。

Android 应用更新提醒自动跳转安装

Android 更新提示自动安装

Java 璐到底 1505

Android下载Apk安装包,下载完毕后,系统自动进行安装

如题,Android App新版本检测升级 实现步骤: 1、权限 小米11,android12,必须申请android.permission.REQUEST_INSTALL_PACKAGES权限 <!-- 文件读写权限 --> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.perm

沧海龙腾LV的博客 6935

手机版本android升级包下载,安卓7.0通用升级包安装

安卓7.0通用升级包安装,这是有安卓最新推出的手机系统更新版本,用户通过这款版本能够轻松让自己的手机进行更新升级,让使用过程更加流畅,不卡顿,还提供了多种多样更新的细节等待大家去发现,安装过程中也会自动对手机内存文件进行保存备份,大家可以放心下载安卓7.0通用升级包安装特点:1、这里直接安装到自己的手机就可以了,还可以根据步骤一步步的操作哦!2、保持手机最好的速度,大家都可以玩各种娱乐应用,并且...

weixin_29887801的博客 2万+

android官方升级包下载安装,安卓7.0正式版安装下载

安卓7.0正式版安装包是一款针对低端手机打造的安卓系统。目前运行Android 7.0开发者预览版的设备能够第一时间收到推送,而还处于Android 6.0的设备则需要更长时间,用户可以通过线刷的方式来让自己的手机进行升级。【全新功能】分屏多任务进入后台多任务管理页面,然后按住其中一个卡片,然后向上拖动至顶部即可开启分屏多任务,支持上下分栏和左右分栏,允许拖动中间的分割线调整两个APP所占的比例。...

weixin_39696197的博客 1万+

Android7.0以上版本更新跳转安装页面

项目场景: 提示:这里简述项目相关背景: 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大) 问题描述: 提示:这里描述项目中遇到的问题: 例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据 APP 中接收数据代码: @Override public void run() { bytes = mmInStream.read(buffer); mHandler.obta

weixin_44520691的博客 399

#Android开发杂记--如何让App自动更新跳转安装界面(完美兼容Android10)

#Android开发杂记--如何让App自动更新跳转安装界面(完美兼容Android10)引言自动更新App的步骤定义FileProviderFileProvider常见问题解析: 引言        一款发行的app不可能一开始就达到完美,因此App自动更新的重要性不言而喻。        到了7.0以后使用FileProvider访问sdk私有文件,原本只需要草

投笔丶从戎的博客 6058

Android7.0适配

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布转载请注明出处:http://blog.csdn.net/chay_chan/article/details/57083383关于Android7.0的适配  最近在软件的维护和更新过程中,了解到一些关于Android7.0的适配,在这里和大家分享一下,据我所知,需要对Notification、拍照、图片的裁剪进行适配一、Notifi

Chay_Chan的博客 3万+

Android更新下载完成后不出现安装界面

Android系统升级到7.0以上后发现,所有的APP升级,下载完成后不自动跳转安装界面,找到如下解决办法,完美 1、指定访问的文件的路径 在res下,创建xml文件夹,创建file_paths.xml文件 2、file_paths.xml内容为: <?xml version="1.0" encoding="utf-8"?> <paths>...

haorenwoyige的专栏 4969

BTTV安卓版版本更新机制:自动更新与手动升级对比

BTTV(BetterTTV)安卓版是一款为Twitch移动应用提供增强功能的开源模组,支持BetterTTV、FrankerFaceZ和7TV表情等扩展功能。为确保用户始终能体验到最新功能与安全修复,BTTV安卓版设计了完善的版本更新机制,主要分为自动更新与手动升级两种方式。本文将详细对比这两种更新方式的工作原理、操作流程及适用场景,帮助用户选择最适合自己的更新策略。 [![BTTV安卓版应用

gitblog_00823的博客 983

Android实现自动更新及强制更新功能(附带源码)

Android实现自动更新及强制更新功能(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1007

Android版本更新完成自动安装解决方案(兼容版本7.0,8.0

1.简介 发布新版本时,用户已经安装的旧版本提示安装更新 版本更新分为选择更新和强制更新,区别就是弹窗提示是否可以取消,页面是否可以跳转问题 2.特点 1.Android7.0版本以下 这里不做解释,后面看代码。 2.Android7.0版本的FileProvider 主要就是在代码中和AndroidManifest.xml中使用FileProvider类 2.Android8.0及以...

fanhenghao的博客 5192

Android7.0 安装apk更新包的适配

项目中发现在自动更新功能的时候,下载好了apk的文件后在android7.0系统中不能自动跳到安装界面,后来百度了一番解决了问题。原因:我们先来看看产生的原因:当我们在7.0上使用系统服务去下载apk并且试图安装时,有可能由于权限问题导致安装失败。 每个Android版本的发布,对于安全性问题的要求越来越高,也为Android程序员增加了额外的工作量。Android6.0引入动态权限控制(Run

Young 8577

Android:应用内下载更新app,apk包在Android7.0以上系统安装失败

最近又更新了一下Android studio的gradle版本 结果。。。 与存储相关的无一幸免,Android6.0引入的动态权限控制(Runtime Permissions),Android7.0又引入“私有目录被限制访问”,“StrictMode API 政策”。“私有目录被限制访问“ 是指在Android7.0中为了提高私有文件的安全性,面向 Android N 或更高版本的应用私有目...

m0_37678565的博客 3480

Android apk下载安装

转载 :https://www.jianshu.com/p/a6cad97ea54f 相信很多应用都是采用内部下载的方式,这样的体验肯定比跳转到浏览器好得多!而应用商店审核周期长,无法实时更新最新应用!所以内部下载更新就显得尤为重要! 1.要美观好看,给用户实时的反馈下载情况: 界面体现为下载百分比%,下载速度 kb/s,圆环进度 2.下载完成后要自动安装Android6.0,需...

一站到底s的博客 9577

Android 7.0安装apk

在做应用版本更新的时候使用Android 7.0的手机测试发现一个问题:下载完成安装包之后,不能跳转安装界面,使用7.0以下的手机没遇到这种情况。 对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。 如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUr

github_2011的博客 7583
上一篇: Linux基础与Shell编程
下一篇: GridView的使用与跑马灯效果
K_122
博客等级 码龄11年 11粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值