Android8.0 安装apk
/*** 判断是否是8.0,8.0需要处理未知应用来源权限问题,否则直接安装*/
private void checkIsAndroidO() {if (Build.VERSION.SDK_INT >= 26) {boolean b = getPackageManager().canRequestPackageInstalls();if (b) {ToolsUtil.installApk(WelcomeActivity.this, ToolsUtil.getApkDir() + ToolsUtil.getApplicationName() + ".apk");//安装应用的逻辑(写自己的就可以)} else {//设置安装未知应用来源的权限Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);startActivityForResult(intent, 10012);}} else {ToolsUtil.installApk(WelcomeActivity.this, ToolsUtil.getApkDir() + ToolsUtil.getApplicationName() + ".apk");}
}@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == 10012) {checkIsAndroidO();}
}
ToolsUtil
private static boolean hasSDCard = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);private static String getAppDir() {if (hasSDCard) { // SD卡根目录的hello.textreturn Environment.getExternalStorageDirectory() + "/CarSystem";} else { // 系统下载缓存根目录的hello.textreturn Environment.getDownloadCacheDirectory() + "/CarSystem";}
}private static String mkdirs(String dir) {File file = new File(dir);if (!file.exists()) {file.mkdirs();}return dir;
}public static String getApkDir() {String dir = getAppDir() + "/apk/";return mkdirs(dir);
}
/*** 安装APK** @param context* @param apkPath*/
public static void installApk(Context context, String apkPath) {if (context == null || TextUtils.isEmpty(apkPath)) {return;}File file = new File(apkPath);Intent intent = new Intent(Intent.ACTION_VIEW);//判读版本是否在7.0以上if (Build.VERSION.SDK_INT >= 24) {//provider authoritiesUri apkUri = FileProvider.getUriForFile(context, "你的包名", file);//Granting Temporary Permissions to a URIintent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setDataAndType(apkUri, "application/vnd.android.package-archive");} else {intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");}context.startActivity(intent);
}
7.0以上需要用数据共享AndroidMainifest 配置如下:
<!--数据共享-->
<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="你的包名"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_path" />
</provider>
在res文件夹下新建xml文件夹,并建立xml子文件file_path
<?xml version="1.0" encoding="utf-8"?>
<paths><external-path name="CacheCarSystem" path="CarSystem"/>
</paths>
<files-path/>代表的根目录: Context.getFilesDir()<external-path/>代表的根目录: Environment.getExternalStorageDirectory()<cache-path/>代表的根目录: getCacheDir()
path="CarSystem"表示你要共享的文件夹
可参考:http://www.czhzero.com/2016/12/21/how-to-install-apk-on-Android7-0/
Android8.0 安装apk相关推荐
- Android8.0安装apk报错:Package xxx is currently frozen
问题出现 App版本更新时,使用Android 8.0的手机会出现问题:安装包下载完成之后,屏幕闪了一下并没有跳转到安装界面,使用8.0以下的手机并没有这个问题,查看异常信息,发现如下警告 java. ...
- Android 7.0/8.0 安装APK时解析包错误问题
在 Android 7.0 引入了"私有目录被限制访问",通过使用FileProvider来解决问题,但是在安装应用时却出现了解析包出错的问题 来检查一下代码 private vo ...
- Android7.0+安装apk文件之后不弹出安装完成的界面解决办法
在Android7.0+手上,版本升级完成,发现手机安装完成,不启动安装完成页面,而是直接关闭了,小编也是一头雾水.琢磨了很久,下面小编把解决办法show出来. 第一步:在资源文件下面新建 xml文件 ...
- AppUtils【获取手机的信息和应用版本号、安装apk】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 一个获取设备的系统版本号.设备的型号.应用版本号code值.应用版本号name值.包名.是否更新.安装apk的工具类. 其实这个工具 ...
- Android8.0+应用内更新安装apk失败
描述 应用内更新,下载apk调用系统api进行安装,在android8.0+手机上无法安装,在android8.0以下可以安装成功,看了看google for android 官网得知android8 ...
- 华为android7.0 root,android7.0更新安装apk的方法
StrictMode模式 从android7.0开始强制启用StrictMode"严苛模式".StrictMode是在android2.3引进的类.当时它的作用是作为一个开发工具用 ...
- Android8.0未知来源应用安装权限最好的适配方案
Android8.0未知来源应用安装权限最好的适配方案 你弄啥嘞 24 天前 Android8.0的诸多新特性中有一个非常重要的特性:未知来源应用权限 以前安装未知来源应用的时候一般会弹出一个弹窗让用 ...
- Android应用安装apk版本升级,适配Android 8.0和Android 10.0下载安装,shell命令安装APK
shell命令安装 /*** 安装apk** @param path apk文件路径*/ public void installAPK(String path) {Log.i(TAG, "i ...
- FileProvider N 7.0 升级 安装APK 选择文件 拍照 临时权限 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
最新文章
- Python:urllib2模块Handler处理器 和 自定义Opener
- 北京工商大学计算机考研818真题,2017年北京工商大学计算机与信息工程学院818数据结构考研仿真模拟题...
- activeMQ使用总结
- clone远程代码 在不同电脑上git_用树莓派3搭建私有git代码仓库
- $_FILE函数总结
- TCP流中各种队列:
- JAVA导出excel如何设置表头跨行或者跨列,跪求各位大神了
- 拦截游戏窗口被移动_熊孩子骗家长人脸识别? 腾讯游戏出了个新招
- 苏宁大数据怎么运营_苏宁易购的经营模式
- vue2+vuex+vue-router 快速入门(三) vue 实例介绍
- 计算机专业三年级的学生英语,计算机专业英语 计算机专业英语对照表.doc
- LeetCode 要记得一些小trick
- vagrant 学习
- 重载前自增运算符和后自增运算符
- (25)梯度下降法求解曲面极小值
- php批量修改文件夹名称的功能,php实现批量修改文件名称
- UILabel 首行缩进两个字符
- 武汉财贸学校2020计算机应用,2021年武汉市财贸学校招生简章
- 图解系统(六)——调度算法
- Linux管道到底能有多快?
热门文章
- win11系统右键还原win10菜单和恢复
- android网易七鱼客服系统
- 华信mysql数据恢复_华信安卓手机数据恢复程序3.0
- Ubuntu 16.04下Intel SGX SDK环境搭建(硬件不支持情况)
- c语言软件看门狗程序,X25045看门狗电路硬件连接图及C语言看门狗程序
- 行内元素与块级元素区别1.0
- Weka Explorer(探索者界面) 详解(1)
- TMS320F28335调用官方库进行FFT频谱分析
- python爬虫课设报告_python爬虫小说设计报告 相关实例(示例源码)下载 - 好例子网...
- AI一分钟 | 无人驾驶技术排名:百度居中游,苹果特斯拉垫底;Google在深圳设立办公室