以编程方式安装APK-返回值

问题描述

|| 在我的应用中,我正在通过活动调用JavaScript接口。在与此界面相关联的网络视图中,我要求用户下载并安装APK。我正在使用\“ startActivityForResult \”开始安装过程(下载文件后)。这是代码
Intent promptInstall = new Intent(Intent.ACTION_VIEW);
        promptInstall.setDataAndType(Uri.fromFile(new File(PATH + \"app.apk\")),\"application/vnd.android.package-archive\");
        startActivityForResult(promptInstall,ACCEPT_INSTALL);
我在主要活动类中使用\“ onActivityResult \”来捕获上述活动的返回值。这是代码
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data) {
    super.onActivityResult(requestCode,resultCode,data);
    Log.d(\"requestCode,resultCode from Install APK: \",Integer.toString(requestCode) + \",\" + Integer.toString(resultCode));   
}
我面临的问题是\“ resultCode \”始终返回0,与用户是否选择安装应用程序无关。我真的需要知道用户是否安装了该应用程序。关于为什么返回值始终为0的任何想法? 我的最后一招是使用packagemanager在onActivityResult函数中检查应用程序是否存在,以确定是否已安装该应用程序,但我想知道为什么返回值始终为0。 非常感谢...     

解决方法

        我们开发了一个应用程序市场,并遇到了同样的问题。我们的解决方案是按照您的建议使用数据包管理器。 我研究了一些意图过滤器,因为在安装过程中似乎有一些意图。但是我们无法使其运行。数据包管理器解决方案可以正常工作,因为您可以检查对应用程序更新很重要的应用程序版本。     ,        您可以检查firstInstallTime / lastUpdateTime并与您向PackageInstaller的请求时间进行比较以安装软件包,请参见以下示例:
try {

    PackageInfo installedPackageInfo = getPackageManager()
            .getPackageInfo(installedPackageName,PackageManager.GET_ACTIVITIES);
    long firstInstallTime = installedPackageInfo.firstInstallTime;
    long lastUpdateTime = installedPackageInfo.lastUpdateTime;

    // installationRequestTime is the time which you request for the PackageInstaller to install your package. This time should be got from System.currentTimeMillis()
    return firstInstallTime > installationRequestTime || lastUpdateTime > installationRequestTime;
} catch (PackageManager.NameNotFoundException e) {
    // First time installation and user choose to not install the app
    return false;
}
该解决方案并不理想,但是很遗憾,PackageInstaller无法为我们提供清晰的resultCode。