关于Android8.0版本更新权限的探讨

今天和小伙伴聊到关于8.0版本应用更新权限的问题,8.0没有得到未知应用的安装权限是不能安装的,但是,我在oppo8.0上测试的结果却表明,没有设置此权限,依然能安装上,但是中间会增加个关于对未知应用安装的提示,所以这部分确实不是所有机型都是一样的,对于8.0的安装,代码给各位大佬们附上。

/**
     * 下载完成后自动跳到安装界面
     *  download_path 为默认安装路径
     * @param context
     */
    public static void installApk(String versionName, Context context) {
        if (TextUtils.isEmpty(versionName)) {
            return;
        }
        File file = new File(Environment.getExternalStorageDirectory(), DOWNLOAD_PATH + "/" + versionName);
        ///medcare-doctor.apk
        Intent mintent = new Intent();
        mintent.setAction(Intent.ACTION_VIEW);
        mintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        String type = getMIMEType(file, context);
        //判断版本是否在7.0以上
        if (Build.VERSION.SDK_INT >= 24) {
            //provider authorities
            //Granting Temporary Permissions to a URI
            Uri data = FileProvider.getUriForFile(context, "你的应用包名.fileProvider", file);
            mintent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            mintent.setDataAndType(data, type);
        }else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O{
            boolean  hasInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
            if (!hasInstallPermission) {
               ToastUtil.makeText(MyApplication.getContext(), MyApplication.getContext().getString(R.string.string_install_unknow_apk_note), false);
               startInstallPermissionSettingActivity();
               return;
            }
            Uri data = FileProvider.getUriForFile(context, "你的应用包名.fileProvider", file);
            mintent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            mintent.setDataAndType(data, type);
        }else {
            mintent.setDataAndType(Uri.fromFile(file), type);
        }
        context.startActivity(mintent);
    }
    
    /**
     * 解析apk安装包,如若不能解析,用户则手动选择安装包
     *
     * @param f
     * @param context
     * @return
     */
    private static String getMIMEType(File f, Context context) {
        String type = "";
        String filename = f.getName();
        String endname = filename.substring(filename.lastIndexOf(".") + 1, filename.length());

        if (endname.equals("apk")) {
            type = "application/vnd.android.package-archive";
        } else {
            type = "*/*";
            Toast.makeText(context, "解析包错误,请手动选择安装包进行安装...", Toast.LENGTH_SHORT).show();
        }
        return type;
    }
    
 	/**
     * 跳转到设置-允许安装未知来源-页面
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    private void startInstallPermissionSettingActivity() {
        //注意这个是8.0新API
        Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);
    }    

除此之外,你还需要配置7.0以上就需要配置的fileProvider,这个可以参考其他资料。
感谢一只懂音乐的码虫的博客,附上链接:

https://blog.csdn.net/zj_blog/article/details/79897241?tdsourcetag=s_pctim_aiomsg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值