版权声明:转载请说明出处 https://blog.csdn.net/qq_42046338/article/details/89641012
前言: 由于公司不想用 阿里的、腾讯的 热更新和热修复,所以只能自己写和后台哥们一起,想法调用底层C 进行交互下载可以完成差异下载和重新安装的需求,完成了 Android 7.0的私有文件夹 URI 的 路径判断和转换,但是测试机是android8.0的原因,在下载完成会进行一个无法拉起Intent进行安装,后期查看官方API 才发现在Android 8.0 又新加了一项权限“安装未知应用”。
清单文件中的 权限项
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
判断Android 8.0的代码
if (Build.VERSION.SDK_INT>26){
//查看是否打开权限
boolean b = getPackageManager().canRequestPackageInstalls();
if (b){
//打开直接进行更新安装
upDate();
}else {
//没有打开进行 回调进行申请和跳转
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REQUEST_INSTALL_PACKAGES}, DIME);
}
}else {
// 如果不是Android 8.0直接进行 Android 7.0封装到 下载的时调用的地方了
upDate();
}
回调 代码编写展示
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//将 requestCode 放到switch 进行比对一方遇到很多的权限申请等问题
switch (requestCode) {
// DIME我们申请权限的 int
case DIME:
//权限的长度 和权限打开的判断 如果打开 直接进行安装
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
upDate();
} else {
//如果没有那就进行Toast 进行显示,并使用Handler 演示2秒进行跳转
ToastUtils.showLong("需要打开CoinNew未知来源安装权限");
new Handler(getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
//重中之重 使用意图打开我们手机的安装未知应用的页面 为什么要打开
//因为此权限是需要用户手动打开我们无法进行强制打开
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
((Activity)MainActivity.this).startActivityForResult(intent,DIME);
}
},2000);
}
break;
}
}
附上 安装未知应用的界面 如果看不懂请看Android 动态授权教学
咋们Intent 就会跳转到 第一张图片的界面,需要用户手动打开。
如若需要差异化更新代码可联系博主QQ 1424817390 差异化更新组件包 jni包 .h 和Android.mk 等C 代码
封装到极致, 注册查看本地的版本, 发起更新地址和成功失败回调网络请求等无需关心。