Android 通过代码安装通过代码安装 APK的方法详解的方法详解
主要介绍了Android 通过代码安装 APK的方法详解,本文通过实例代码给大家介绍的非常详细,对大家的学习火
锅工作具有一定的参考借鉴价值,需要的朋友可以参考下
在在 APK 开发中,通过开发中,通过 Java 代码来打开系统的安装程序以安装代码来打开系统的安装程序以安装 APK 并不是什么难事,一般的并不是什么难事,一般的 Android 系统都有开放这一功系统都有开放这一功
能。能。
但随着 Android系统版本的迭代,其对于权限的把控越来越严格,或者说是变得越来越注重安全性。这就导致了以前可
以通过很简单的几行代码就能实现的功能,现在要复杂很多。
对于通过代码打开系统安装程序这一功能的限制,其分水岭在 Android7.0,即 Android N 上。通常在 Android N以上的
系统使用一种做法,以下则使用另一种做法。
传统的通过代码安装APK的方式
File apk = new File(...);
Uri uri = Uri.fromFile(apk);
Intent intent = new Intent();
intent.setClassName("com.android.packageinstaller", "com.android.packageinstaller.PackageInstallerActivity");
intent.setData(uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
这种方法简单粗暴且实用,只要知晓要安装的 APK 的位置,并拥有访问权限即可。
但现在市面上主流的 Android 手机系统版本都已经要高于 7.0 了,这一方法几乎已经没有用了
高版本系统上的通过代码安装高版本系统上的通过代码安装APK的方式的方式
File apk = new File(...);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri uri = FileProvider.getUriForFile(this, "com.apk.demo.fileprovider", apk);
intent.setDataAndType(uri, "application/vnd.android.package-archive");
startActivity(intent);
说到权限问题,在说到权限问题,在Android版本不断提高的趋势下,系统得安全性也越来越高,很多权限不只是在清单文件里面注册那么简版本不断提高的趋势下,系统得安全性也越来越高,很多权限不只是在清单文件里面注册那么简
单,内存卡得读写权限属于危险权限,需要我们使用代码动态添加,这里我使用了单,内存卡得读写权限属于危险权限,需要我们使用代码动态添加,这里我使用了RxPermiision框架框架,遇到遇到9.0或者更高版本的或者更高版本的
系统时获取权限的方法可能会不同。系统时获取权限的方法可能会不同。
private void rxPermission() {
RxPermissions rxPermissions = new RxPermissions(this);
rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean granted) throws Exception {
if (granted) {
//权限允许
//在这里可以添加自己的操作
} else {
// 权限被拒绝
}
}
});
}
Android更多权限得查询:https://www.jianshu.com/p/24f79a70025b
上面这段代码安装代码看起来似乎和传统的方式并没有太大的区别是吗?
确实是,但它真正的区别并没有在 Java 代码上体现出来。
在高版本系统中,APK 已经不能直接访问其它 APK 的私有数据了。
什么是什么是APK的私有数据?的私有数据?
APK在安装过程中于 data 目录下创建的专属目录自然是其私有数据无疑。另外,只要是在应用程序中封装的 File 对象,不管
这个文件本身是不是由该程序创建的,那这个文件都属于该程序的“私有数据”。举个例子来说,假设我们将手机连接到电脑,
通过 adb push 的方式往 sdcard 目录下推了一个 APK 文件进去。然后我们自行编写了一段代码,将这个 sdcard 中的安装包
传到系统的 PackageInstaller 中去安装,都会报安全错误,因为这个位于 sdcard 目录下文件对我们这段代码来说是“私有数
据”,不允许直接暴露给 PackageInstaller。
下面就来看看在高版本系统中暴露下面就来看看在高版本系统中暴露“私有数据私有数据”给其它程序的方法。给其它程序的方法。
在高版本中,Android7.0 及以上,开放(暴露)私有数据的唯一方式是通过 ContentProvider 来实现。
评论0