一、所需权限
<!--请求安装APK的权限-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!--写如外部存储的权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--读取外部存储的权限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--网络权限-->
<uses-permission android:name="android.permission.INTERNET"/>
(1)读写外部存储的权限需要动态申请,详见:Android动态获取权限
(2)安装apk的权限从Android8.0开始需要每个应用独立开启
//跳转到开启apk安装权限开启的界面,让用户手动打开
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,Uri.parse("package:" +getPackageName()));
intentActivityResultLauncher.launch(intent);
二、代码实现
(1)注册provider
在AndroidManifest.xml中声明provider
(2)xml 文件
(3)执行代码
#使用pm install 命令安装apk,需要系统给予应用特殊权限
public static boolean installApp(String packageName, String apkPath) {
Process process = null;
BufferedReader successResult = null;
BufferedReader errorResult = null;
StringBuilder successMsg = new StringBuilder();
StringBuilder errorMsg = new StringBuilder();
try {
process = new ProcessBuilder("pm", "install", "-i", packageName, "-r", apkPath).start();
successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String s;
while ((s = successResult.readLine()) != null) {
successMsg.append(s);
}
while ((s = errorResult.readLine()) != null) {
errorMsg.append(s);
}
} catch (Exception e) {
LogUtils.e(TAG,"安装异常" + e.getMessage());
e.printStackTrace();
} finally {
try {
if (successResult != null) {
successResult.close();
}
if (errorResult != null) {
errorResult.close();
}
} catch (Exception e) {
}
if (process != null) {
process.destroy();
}
}
String re = successMsg.toString();
LogUtils.e(TAG,"result-----" + re+"---apkPath: "+apkPath);
//如果含有“success”认为安装成功
return successMsg.toString().equalsIgnoreCase("success");
}