项目中有一个应用商店的功能,需要App支持下载并静默安装,App是系统签名。
之前封装的工具类,也测试过没有问题(机顶盒安卓系统是4.4.2版本),就直接拿过来用了,代码如下:
public void installSilent(Uri apkUri) throws Exception {
if (apkUri != null) {
try {
Class<?> activityTherad = Class.forName("android.app.ActivityThread");
Class<?>[] paramTypes = this.getParamTypes(activityTherad,
"getPackageManager");
Method method = activityTherad.getMethod("getPackageManager", paramTypes);
Object PackageManagerService = method.invoke(activityTherad, new
Object[0]);
Class<?> pmService = PackageManagerService.getClass();
Class<?>[] paramTypes1 = this.getParamTypes(pmService, "installPackage");
method = pmService.getDeclaredMethod("installPackage", paramTypes1);
method.invoke(PackageManagerService, new Object[]{apkUri, null,
Integer.valueOf(0), null});
} catch (Exception e) {
Log.i("sml", "installSilent: .........." + e.toString());
}
}
}
结果在安卓版本7.0的机顶盒就出现了异常:
java.lang.NoSuchMethodException: installPackage []
解决方案:
public static boolean silentInstall(PackageManager packageManager, String apkPath) {
Class<?> pmClz = packageManager.getClass();
try {
if (Build.VERSION.SDK_INT >= 21) {
Class<?> aClass = Class.forName("android.app.PackageInstallObserver");
Constructor<?> constructor = aClass.getDeclaredConstructor();
constructor.setAccessible(true);
Object installObserver = constructor.newInstance();
Method method = pmClz.getDeclaredMethod("installPackage", Uri.class,
aClass, int.class, String.class);
method.setAccessible(true);
method.invoke(packageManager, Uri.fromFile(new File(apkPath)),
installObserver, 2, null);
} else {
Method method = pmClz.getDeclaredMethod("installPackage", Uri.class,
Class.forName("android.content.pm.IPackageInstallObserver"), int.class,
String.class);
method.setAccessible(true);
method.invoke(packageManager, Uri.fromFile(new File(apkPath)), null, 2,
null);
}
return true;
} catch (Exception e) {
Log.i("sml", "silentInstall: ............"+e.toString());
}
return false;
}