Android API 23+版本APK下载安装故障求助
嘿,我完全懂你这种明明逻辑捋得通,但高版本系统就是跑不起来的抓狂感!API 23(Android 6.0)之后安卓的权限机制、文件访问规则变了好多,这大概率是你踩坑的核心原因,我给你梳理几个最容易出问题的关键点:
运行时权限的缺失
API 23+把WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE划为了危险权限,光在Manifest里声明根本没用,必须在代码里动态申请。如果你的更新包是下载到外部存储目录,没拿到权限的话会直接读写失败,自然没法走到安装那一步。
检查点:下载前有没有调用checkSelfPermission()判断权限状态?有没有在用户授权后再执行下载逻辑?FileProvider替代
Uri.fromFile()
API 24+开始,直接用Uri.fromFile()生成文件Uri会抛出FileUriExposedException——安卓禁止向其他应用暴露file://格式的Uri。必须用FileProvider生成content://格式的Uri,才能让系统安装器正常访问到更新包文件。
检查点:- 有没有在Manifest里注册FileProvider组件?
- 有没有在
res/xml下配置file_paths.xml,指定允许共享的文件目录? - 生成Uri时是不是用了
FileProvider.getUriForFile()方法? - 启动安装Intent时有没有添加
Intent.FLAG_GRANT_READ_URI_PERMISSION,给安装器临时的文件读取权限?
API 26+的安装权限特殊处理
Android 8.0(API 26)新增了REQUEST_INSTALL_PACKAGES权限,这个权限同样需要动态申请。如果没处理,系统会直接拦截安装请求,甚至连错误提示都不会弹出来。
检查点:有没有在Manifest里声明android.permission.REQUEST_INSTALL_PACKAGES?有没有在代码里判断getPackageManager().canRequestPackageInstalls(),如果返回false就引导用户去系统设置开启「允许安装未知应用」的权限?下载路径的合规性(API 29+)
Android 10(API 29)之后推荐使用应用私有存储目录(比如getExternalFilesDir(null))来存放更新包,这个目录不需要申请读写权限,还能避开FileProvider的复杂配置。如果你的下载路径还是公共外部存储,高版本系统可能会限制应用对它的访问。
你可以先对照这几点逐一排查代码,比如先确认FileProvider的配置和Uri生成逻辑有没有问题,再检查权限申请的流程是否完整。要是还是找不到问题,把你API 23+版本的核心代码片段贴出来,大家能更精准地帮你定位问题!
内容的提问来源于stack exchange,提问作者snowman

