更新Android应用程序(不使用Google Play)

更新Android应用程序(不使用Google Play),android,Android,我编写了该应用程序的测试版。它可以通过网络下载(我不会将它发布到游戏市场)。当新版本发布时,是否可以在不使用Play Market的情况下更新此应用程序?绝对可以。不过,你需要建立一种机制,让你的应用程序呼叫服务器,找出是否有更新版本的应用程序,如果有,将其下拉并安装。一旦确定确实需要拉下更新,您可以使用类似于此任务的方法: protected String doInBackground(String... sUrl) { String path = "/sdcard/YourApp.a

我编写了该应用程序的测试版。它可以通过网络下载(我不会将它发布到游戏市场)。当新版本发布时,是否可以在不使用Play Market的情况下更新此应用程序?

绝对可以。不过,你需要建立一种机制,让你的应用程序呼叫服务器,找出是否有更新版本的应用程序,如果有,将其下拉并安装。一旦确定确实需要拉下更新,您可以使用类似于此任务的方法:

protected String doInBackground(String... sUrl) {
    String path = "/sdcard/YourApp.apk";
    try {
        URL url = new URL(sUrl[0]);
        URLConnection connection = url.openConnection();
        connection.connect();

        int fileLength = connection.getContentLength();

        // download the file
        InputStream input = new BufferedInputStream(url.openStream());
        OutputStream output = new FileOutputStream(path);

        byte data[] = new byte[1024];
        long total = 0;
        int count;
        while ((count = input.read(data)) != -1) {
            total += count;
            publishProgress((int) (total * 100 / fileLength));
            output.write(data, 0, count);
        }

        output.flush();
        output.close();
        input.close();
    } catch (Exception e) {
        Log.e("YourApp", "Well that didn't work out so well...");
        Log.e("YourApp", e.getMessage());
    }
    return path;
}

// begin the installation by opening the resulting file
@Override
protected void onPostExecute(String path) {
    Intent i = new Intent();
    i.setAction(Intent.ACTION_VIEW);
    i.setDataAndType(Uri.fromFile(new File(path)), "application/vnd.android.package-archive" );
    Log.d("Lofting", "About to install new .apk");
    this.context.startActivity(i);
}

是的,这是可能的,以下是您大致可以做的:

  • 获取当前应用程序版本代码

    PackageInfo-PackageInfo=getPackageManager().getPackageInfo(context.getPackageName(),0);
    int curVersionCode=packageInfo.versionCode;
    
  • 拥有一个服务器,您可以在其中托管apk文件,并创建一个仅包含一个整数的简单普通文件,该整数表示最新的应用程序版本代码

  • 当应用程序启动时(或当您希望检查更新时),从服务器检索最新版本代码(即通过HTTP请求),并将其与当前应用程序版本进行比较

  • 如果有新版本,请下载并安装apk(将为用户提示一个对话框)

  • 编辑:
    您可以使用@Blumer代码来完成此操作。

    仅供参考,我刚刚在

    Evolve是Android开发人员的一个库,允许他们部署新的 无需通过Google Play或询问用户的应用程序版本 下载更新。它通过使用反射和动态 字节码生成“欺骗”Android运行新代码


    虽然这是阿尔法,但通过很多环似乎是可能的。除了恶意软件之外,我怀疑它是否值得。

    这是可能的,但是请记住,用户必须在其设置中启用“允许安装非市场应用程序/未知源”。

    是的,这是可能的。除此之外,你还试过什么?你希望它有多深?自动更新下载和安装?还是打开浏览器下载并安装?谢谢你的回答,但是Blumer已经给了我一个代码示例的答案。我想对我来说已经足够了。再次感谢)@IQW你能告诉代码你尝试了什么吗?因为我有同样的问题,我需要从一个域中检查我的apk,并检查是否有新版本?问题:publishProgress((int)(total*100/fileLength))?这个方法将在哪里调用,它在做什么?谢谢。Apk将被自动删除吗?如果你使用这个解决方案,需要考虑几个问题:1)是的,它必须是外部存储-内部不在应用程序之间共享,并且对于“安装应用程序”2是不可见的。你不能使用内容提供者,因为这不被“安装应用程序”所支持(需要)。file://...)3)您可能希望使用
    Environment.getExternalStorageDirectory()
    而不是硬编码路径。否则此解决方案有效,谢谢!如果没有额外的权限,我可以抑制用户提示吗?对于Android N,我必须添加文件提供程序或严格模式:你知道如果在上传应用时禁用上述设置会发生什么吗。上传到哪里?市场?这是设备上的设置,而不是二进制文件或市场上的设置。这就是我的意思:对不起。拼写错误。我想说的是“更新”而不是“上传”。因此,当应用程序更新时,上述设置的状态为“禁用”,将会发生什么情况。它是否自动允许更新,或者用户明确需要再次设置上述设置“启用”。据我所知:您可以下载apk,但无法安装它。但值得检查一下目前的情况。我认为谷歌想要完全禁止那些自我启动的更新。在Oreo(可能也是旧版本)上,如果你没有权限设置,操作系统会告诉你这是必需的,并将你带到适当的设置。您可以从那里配置可以从未知来源安装的应用程序列表-用户需要使用我的应用程序中的Blumer代码将您的应用程序设置为允许。该应用程序正在成功下载和安装,但当我再次打开时,它会弹出错误弹出窗口,显示为
    ,解析程序包时出现问题。请帮帮我