4

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

0 回答 0