从Android源以编程方式安装应用程序

时间:2013-05-30 12:02:43

标签: android android-intent install apk uninstall

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

0 个答案:

没有答案