在Android 项目上架后,需要迭代更新,一般更新方式有:手动下载apk包手动安装、通过浏览器下载手动安装、APP内部下载内部安装。本文章就只讲解APP内部下载内部安装这个APP 更新方式。虽然网上关于APP内部apk安装的代码和文章很多,但太过于绝对,没有考虑一些特殊情况。此文章就是对一些特殊情况处理和代码的说明。
在AndroidManifest.xml注册文件中,添加安装apk包权限
虽然在在AndroidManifest.xml添加了权限,但还是需求判断和授权,而且在Android 8.0(即Android O) 之前,设置 中的 允许安装未知来源 是针对所有APP的,只要开启了,那么所有的未知来源APP都可以安装。但是,8.0之后,将这个权限挪到了每一个APP内部,这样提高了手机的安全性。
注意:这个权限是需要用户跳转到系统的未知来源权限界面 ,手动开启。所以授权方式和普通申请授权是有区别的。
我这里是以APP 私有空间存储apk 文件,所以没有使用外部存储权限,如果apk需要存储在外部空间记得手动请求外部读写权限。
boolean isInstallPermission = getPackageManager().canRequestPackageInstalls();
if(!isInstallPermission){
//权限没有打开则提示用户去手动打开
openInstallPermission()
}
/**
* 跳转到设置-允许安装未知来源-页面
*/
private void openInstallPermission() {
Intent intent = null
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES
,Uri.parse("package:" +getPackageName()));
}else {
intent = new Intent(Settings.ACTION_SECURITY_SETTINGS
,Uri.parse("package:" +getPackageName()));
}
startActivityForResult(intent, INSTALL_PERMISS_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == INSTALL_PERMISS_CODE) {
}
}
注意:
authorities="自已的包名.fileprovider" ,自己的包名获取 可以通过${applicationId}来获取,如 “${applicationId}.fileprovider” ,当然不一定使用“fileprovider” 也可以 但要注意保持和下面安装代码一致就可以了。
android.support.FILE_PROVIDER_PATHS 注意
不能随意修改,它是常量。resource:就是引用下面的配置文件的地址,文件保存在项目app/src/main/res
文件夹下xml
文件夹里,并新建一个filepaths.xml
文件,编写需要安装apk 的存在路径或者上级路径,当然文件名可以自定义。
我这里是根目录下,name 可以自定义,path 则需要根据实际目的来,我这里为了方便采用了根目录。
注意:“.fileprovider” 需要和
Intent intent = new Intent(Intent.ACTION_VIEW);
File apkFile = new File(newApkPath);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri uri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", apkFile);
intent.setDataAndType(uri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
}
startActivity(intent);
如果对您有一些意义,希望您给博主一些鼓励(点赞、关注、收藏),如果有错误欢迎大家评论。