我使用以下代码从我放置在 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