Android 6.x 及以下
Android 6.x 及以下使用Uri.fromFile()获取文件的Uri,只需要配置上Action、DataAndType即可隐式启动系统安装器。
/**
- Android 6.x 及以下安装 APK
Build.VERSION.SDK_INT>=Build.VERSION_CODES.N
@param context 上下文
@param file 要安装的APK文件对象
*/
public void installApk6x(Context context, File file) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_INSTALL_PACKAGE);
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");// APK的MimeType
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 在新栈中启动
context.startActivity(intent);
}
Android 7.x
Android 7.0 起,引入了 FileProvider,APP需要手动配置对外暴露的目录并通过FileProvider.getUriForFile()获取文件的Uri。
/**
Android 7.x 安装APK,需要配置FileProvider
Build.VERSION.SDK_INT>=Build.VERSION_CODES.N
@param context 上下文
@param file 要安装的APK文件
@param authority FileProvider配置的authority
*/
public void installApk7x(Context context, File file, String authority) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_INSTALL_PACKAGE);
Uri uri = FileProvider.getUriForFile(context, authority, file); // 通过FileProvider获取Uri
intent.setDataAndType(uri, "application/vnd.android.package-archive");// APK的MimeType
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 在新栈中启动
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 授权读取URI权限
context.startActivity(intent);
}
Android 8.x 及以上
需要先在清单文件中配置以下权限:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
/**
Android 8.x 及以上安装APK,除配置FileProvider外,
还需要在清单文件中添加REQUEST_INSTALL_PACKAGES权限。
Build.VERSION.SDK_INT>=Build.VERSION_CODES.O
@param context 上下文
@param file 要安装的APK文件
@param authority FileProvider配置的authority
*/
public void installApk7x(Context context, File file, String authority) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_INSTALL_PACKAGE);
Uri uri = FileProvider.getUriForFile(context, authority, file); // 通过FileProvider获取Uri
intent.setDataAndType(uri, "application/vnd.android.package-archive");// APK的MimeType
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 在新栈中启动
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 授权读取URI权限
context.startActivity(intent);
}