Android 8.0 下载安装进入【安装未知应用】页面,两步简化一步
小菜昨天接到客户反馈的问题,说华为手机升级到 Android 8.0 系统以后,程序升级下载之后不能安装;找一个手机测试果然如此,每次下载完之后不跳转安装页面,重新进入程序又继续下载,之后依旧不跳转安装页面,再次进入循环...流程自然欠妥,但发现问题主要还是 Android8.0 权限管理的问题。
在 Android 8.0 系统中,未知来源应用不可直接安装,跳转到的是未知来源应用管理列表,如果需要安装,则需要手动授权"安装未知应用"。
网上大神们解决方案很多,基本一致,但小菜尝试发现每次安装跳转到【安装未知应用列表】页面,之后找到相应的应用,进入【安装未知应用】页面,再手动允许安装应用,小菜想弹框提醒一步允许安装,尝试如下:
- 权限添加,在 AndroidManifest.xml 清单文件中,添加如下权限;
<users-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
- 在【打开安装包】的代码中添加兼容 Android 8.0 的代码判断;
private void notifyToInstall() {
if (!StringUtils.isBlank(apkPath)) {
Intent intent = new Intent(Intent.ACTION_VIEW);
// 由于没有在Activity环境下启动Activity,设置下面的标签
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 24) { //判读版本是否在7.0以上
//参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致 参数3 共享的文件
Uri apkUri =
FileProvider.getUriForFile(context, "com.founder.newaircloud.fileprovider", new File(apkPath));
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
//兼容8.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
boolean hasInstallPermission = mContext.getPackageManager().canRequestPackageInstalls();
if (!hasInstallPermission) {
Intent intent2 = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivityForResult(intent2, 100);
return;
}
}
} else {
intent.setDataAndType(Uri.fromFile(new File(apkPath)), "application/vnd.android.package-archive");
}
activity.startActivity(intent);
}
}
- 在回调过程中添加一个状态,activity.startActivityForResult(intent2, 100); apkUrl 为下载到本地手机的 apk 路径,接收之后直接安装 apk;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100) {
if (!StringUtils.isBlank(mCache.getAsString("apkUrl"))) {
installApk(mCache.getAsString("apkUrl"));
}
}
}
//安装应用
private void installApk(String apkUrl) {
Intent intent = new Intent(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
intent.setDataAndType(Uri.fromFile(new File(apkUrl)),
"applicationnd.android.package-archive");
} else {//Android7.0之后获取uri要用contentProvider
Uri apkUri =
FileProvider.getUriForFile(context, "com.founder.chenbaoxinjiang.fileprovider", new File(apkUrl));
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "applicationnd.android.package-archive");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getBaseContext().startActivity(intent);
}
小菜的解决方法就是如此,希望以后大家对每次 Android 大版本更新的升级变更内容多做了解!下面的是小菜的公众号,欢迎闲来关注哦~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Android弹性收缩自适应布局FlexboxLayout
Android弹性收缩自适应布局FlexboxLayout 其在github上的项目主页:https://github.com/google/flexbox-layout 使用前先添加引用: dependencies { implementation 'com.google.android:flexbox:0.3.2' } 写一个布局演示: <?xml version="1.0" encoding="utf-8"?> <com.google.android.flexbox.FlexboxLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:alignContent="flex_start" app:flexDirection="row" ...
-
下一篇
Android若干条并排RecyclerView滑动实时联动
Android若干条并排RecyclerView滑动实时联动 以水平方向并排排列的两条RecyclerView为例,实现一个简单的功能:这两个RecyclerView要实时联合滚动,即其中任意一个RecyclerView,将触发其余所有RecyclerView同时滚动相同。 写布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view_1" android:layout_width="180dp" android:layout_heigh...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音