更新Android应用程序(不使用Google Play)
我编写了该应用程序的测试版。它可以通过网络下载(我不会将它发布到游戏市场)。当新版本发布时,是否可以在不使用Play Market的情况下更新此应用程序?绝对可以。不过,你需要建立一种机制,让你的应用程序呼叫服务器,找出是否有更新版本的应用程序,如果有,将其下拉并安装。一旦确定确实需要拉下更新,您可以使用类似于此任务的方法:更新Android应用程序(不使用Google Play),android,Android,我编写了该应用程序的测试版。它可以通过网络下载(我不会将它发布到游戏市场)。当新版本发布时,是否可以在不使用Play Market的情况下更新此应用程序?绝对可以。不过,你需要建立一种机制,让你的应用程序呼叫服务器,找出是否有更新版本的应用程序,如果有,将其下拉并安装。一旦确定确实需要拉下更新,您可以使用类似于此任务的方法: protected String doInBackground(String... sUrl) { String path = "/sdcard/YourApp.a
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;
您可以使用@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代码将您的应用程序设置为允许。该应用程序正在成功下载和安装,但当我再次打开时,它会弹出错误弹出窗口,显示为,解析程序包时出现问题。请帮帮我