我们有一个仅在公司内部使用的应用程序。目前,我们使用所示代码执行应用程序更新。这将访问服务器上具有两个逗号分隔数字的文件。第一个是可用的最新版本的当前versionCode
,第二个是允许用户操作的最早的versionCode
。如果他们使用的版本过旧,则必须更新或关闭该应用程序。
public class UpdateApp extends MainActivity {
public void check(final Context c) {
RequestQueue queue = Volley.newRequestQueue(c);
StringRequest stringRequest = new StringRequest(Request.Method.GET, getText(R.string.ver_uri).toString(),
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
String[] v = response.split(",");
if (Integer.parseInt(v[0]) > BuildConfig.VERSION_CODE) {
AlertDialog.Builder builder = new AlertDialog.Builder(c);
builder.setMessage("An update is available").setTitle(R.string.app_name);
builder.setPositiveButton("Update", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// UPDATE button pressed
// url to download APK
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(getText(R.string.apk_uri).toString());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setPackage("com.android.chrome");
try {
c.startActivity(intent);
} catch (ActivityNotFoundException ex) {
// Chrome browser presumably not installed so allow user to choose instead
intent.setPackage(null);
c.startActivity(intent);
}
}
});
if (Integer.parseInt(v[1]) <= BuildConfig.VERSION_CODE) {
builder.setNegativeButton("Not Now", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// NOT NOW button pressed
}
});
}
AlertDialog dialog = builder.create();
dialog.show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(c.getApplicationContext(), "Network error - please try later", Toast.LENGTH_LONG).show();
}
});
stringRequest.setShouldCache(false);
queue.add(stringRequest);
}
}
当应用开始使用new UpdateApp().check(this);
这工作到一定程度,但是用户仍然必须实际安装新的APK。我正在寻找一种在用户选择下载新APK之后自动安装APK的方法。我知道设备需要允许来自未知来源的安装才能完成。