Android软件自动更新升级(自动下载安装新版本)

本文介绍了Android 8.0及以上版本遇到的自动更新问题,包括因存储权限导致的SDK下载失败及安装新版本未弹出界面。详细解析了解决方案,动态申请权限,使用FileProvider进行文件共享,并提供安装未知应用的权限检查方法。附带相关源码链接。
摘要由CSDN通过智能技术生成

因为Android系统版本的不同踩了不少坑,在此记录。

1.Android 8.0以后无法下载到SDK中

问题原因: 文件的存储权限原因导致的

  1. 动态申请sdk存储权限:Android 6.0以后都是需要动态申请权限的,注意即使动态申请了权限也要在AndroidManifest.xml申请一下,因为需要兼容低版本,低版本中没有动态申请权限一说。
  2. Android 7.0以后又对存储权限加了限制应用私有目录被限制访问 
  •  私有文件的文件权限不应再由所有者放宽,使用MODE_WORLD_READABLE/MODE_WORLD_WRITEABLE将抛出异常 
  • 向应用外传递file://URI会出发FileUriExposedException

解决方法:

   问题一:判断版本,动态申请权限

 //----------------------------------------动态申请权限-------------------------------
 private void sdkPermission() {
        if(Build.VERSION.SDK_INT>Build.VERSION_CODES.M) {//高于6.0版本,动态申请权限
            if (ContextCompat.checkSelfPermission(context, "android.permission.WRITE_EXTERNAL_STORAGE") != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"}, 111);
            } else {
                downloadApk();
            }
        }
        else {
            downloadApk();//低于6.0版本,直接下载apk
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 111:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //权限已经都通过了,可以下载apk到SDk中了
                    downloadApk();
                } else {
                   // 没有申请权限
                    showPermissionDialog();
                }
                break;
            default:
        }
    }

   问题二:7.0以后使用FileProvider访问sdk私有文件

FileProvider:   

     当targetSdkVersion>=24时,会存在上述问题,可能涉及到的场景有:拍照,程序安装等。 
     同时,官方在v4包(api=22开始)中引入FileProvider类用于程序间私有文件的共享。该类继承自ContentProvider,使用时需  要在清单文件中注册

  • 第一步   注册:在清单文件中通过标签注册,参考代码对属性进行说

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值