一、从Android的源码中获取aidl文件
从frameworks/base/core/java/android/content/pm目录中获取两个aidl文件IPackageDeleteObserver.aidl和IPackageInstallObserver.aidl,并添加到Eclipse的工程中。
二、利用反射调用PackageManager的installPackage方法。
public boolean installPackage() {
boolean ret = true;
PackageManager pm = mContext.getPackageManager();
try {
//get class
Debug.info("MyPackageInstaller", "========================installPackage======================");
Debug.info("MyPackageInstaller", "Apk path = " + mApkPath);
Debug.info("MyPackageInstaller", "Package name = " + mPackageName);
Debug.info("MyPackageInstaller", "========================installPackage======================");
Class<?> pmClass = Class.forName("android.content.pm.PackageManager");
Class<?> getType[] = new Class[4];
getType[0] = Uri.class;
getType[1] = IPackageInstallObserver.class;
getType[2] = int.class;
getType[3] = String.class;
Method method = pmClass.getMethod("installPackage", getType);
Object arglist[] = new Object[4];
arglist[0] = Uri.fromFile(new File(mApkPath));
arglist[1] = myPIO;
arglist[2] = 0x000000010;
arglist[3] = mPackageName;
Object receiver = new Object();
Object returnvalue = method.invoke(pm, arglist);
if (receiver != null)
{
String value = (String) returnvalue;
Debug.info("MyPackageInstaller", "Call installPackage value: " + value);
}
} catch (Exception e) {
e.printStackTrace();
ret = false;
}
return ret;
}
public IPackageInstallObserver myPIO = new IPackageInstallObserver() {
@Override
public IBinder asBinder()
{
// TODO Auto-generated method stub
return null;
}
@Override
public void packageInstalled(String packageName, int returnCode)
throws RemoteException
{
int code = EVENT_INSTALL_FAILED;
if (returnCode == 1) {
code = EVENT_INSTALL_SUCCESSED;
}
Debug.info("MyPackageInstaller", "Install package @@@" + packageName + "@@@ returnCode=" + returnCode);
if(mListener != null) {
mListener.onInstallEvent(packageName, mApkPath, code);
}
}
};
三、在AndroidManifest.xml上设置权限
首先,应用需要获取system权限。
android:sharedUserId="android.uid.system"
其次,声明权限。
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />