应用有时候会需要静默安装一些应用(你们懂得!)。
但是 PackageManager.installPackage方法被隐藏了,需要反射调用。
// 静默安装
public static void staticInstall(File fp, String packageName,IPackageInstallObserver callback,
Context context) {
PackageManager pm = context.getPackageManager();
int flags = 0;
Class<? extends PackageManager> o = pm.getClass();
Field[] fields = o.getFields();
for (Field f : fields) {
if (f.getName().equals("INSTALL_INTERNAL")) {
try {
flags = f.getInt(pm);
} catch (IllegalAccessException e) {
e.printStackTrace();
return;
}
break;
}
}
Method[] methods = o.getMethods();
Uri uri = Uri.fromFile(fp);
for (Method m : methods) {
if (m.getName().equals("installPackage")) {
try {
m.setAccessible(true);
m.invoke(pm, new Object[] { uri, callback, flags, packageName });
} catch (IllegalArgumentException e) {
Log.d("chen", "IllegalArgumentException err=" + e.getMessage());
e.printStackTrace();
return;
} catch (IllegalAccessException e) {
e.printStackTrace();
Log.d("chen", "IllegalAccessException err=" + e.getMessage());
return;
} catch (InvocationTargetException e) {
Log.d("chen", "InvocationTargetException err=" + e.getMessage());
e.printStackTrace();
return;
}
break;
}
}
Log.d("CreateInstall", "OK");
};
安装完成回调需要继承自IPackageInstallObserver.Stub的类来完成。