我使用以下代码从我在android源代码中放置的应用程序安装应用程序。
我编译并构建了一个模拟器,我可以看到我的应用程序在从Android源构建的模拟器中完美运行。
在我的应用程序中的某个特定点,我尝试从我的应用程序中安装另一个应用程序。我尝试安装的应用程序的APK路径是:
/data/data/com.games.golf/cache/MyGames/Golf.apk
以下是我用于在我的应用程序的上述路径中安装应用程序的代码:
private void InstallApplicaiton(String url)
{
PackageParser.Package mPackage = PackageUtil.getPackageInfo(Uri.parse(url));
installingList.addView(getProgressView(mPackage,url));
int installFlags = 0;
PackageManager pm = getPackageManager();
try {
PackageInfo pi = pm.getPackageInfo(mPackage.packageName,
PackageManager.GET_UNINSTALLED_PACKAGES);
if(pi != null) {
System.out.println("Inside pi if not null");
installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
String installerPackageName = getIntent().getStringExtra(
Intent.EXTRA_INSTALLER_PACKAGE_NAME);
System.out.println("installerPackageName:"+installerPackageName);
PackageInstallObserver observer = new PackageInstallObserver();
pm.installPackage(Uri.parse(url), observer, installFlags, installerPackageName);
}
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case INSTALL_COMPLETE:
System.out.println("package installed");
break;
}
}
};
class PackageInstallObserver extends IPackageInstallObserver.Stub {
public void packageInstalled(String packageName, int returnCode) {
Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
msg.arg1 = returnCode;
mHandler.sendMessage(msg);
}
}
我从安装程序包的PackageInstallObserver
处理器中获取SOP消息。但我无法在启动器中看到已安装的应用程序。
我知道第三方应用程序无法以编程方式安装/卸载APK。出于这个原因,我通过包含我的应用程序编译和构建了一个模拟器,以便我可以从我的应用程序安装另一个应用程序。但是,当我对上面的代码感到难过时,我也不知道原因。
我使用了android用于安装软件包的相同代码,但是为什么上面的代码不起作用而软件包没有安装是我无法理解的。
我在这里注意到的唯一问题是String installerPackageName
始终为空。
这方面的任何帮助都可以帮助我解决这个问题,以便从我的应用程序安装软件包,我们将不胜感激。
修改
以下是日志。是因为那个,我尝试从模拟器安装它,也是从缓存文件夹 - /data/data/com.games.golf/cache
安装。它是否与访问此文件夹的权限有关?
05-29 19:31:57.237: W/asset(7490): Asset path /data/data/com.games.golf/cache/MyGames/Golf.apk is neither a directory nor file (type=0).
05-29 19:31:57.237: W/DefContainer(7490): Failed to parse package
05-29 19:31:57.237: W/ActivityManager(79): No content provider found for permission revoke: /data/data/com.games.golf/cache/MyGames/Golf.apk
05-29 19:31:57.297: I/ActivityManager(79): Displayed com.games.golf/.screens.PackageInstaller: +448ms
05-29 19:31:57.607: D/dalvikvm(79): GC_EXPLICIT freed 71K, 11% free 8410K/9415K, paused 4ms+7ms