如何在Android应用中强制更新,如果有新版本可用?

3
我正在开发一个应用程序,如果在应用商店上有新版本可用,我希望能够给应用程序用户强制更新。应用程序应该向用户显示一个对话框消息。

2
当您打开应用程序时,请调用服务器上的Web服务并检查应用程序是否已更新。如果应用程序已更新,则在Google Play商店中打开您的应用程序并更新您的应用程序。 - Kush Patel
1
你不能这样做。如果你真的想这么做,那就把版本名称存储在你的服务器上,每当用户打开应用程序时,在启动画面中检查存储在你的服务器上的版本,并检查应用程序安装的版本,根据此进行操作。 - Mohd Asif Ahmed
1
您可以使用外部API来检查已安装应用程序的版本和最新版本API。请参考https://dev59.com/JF8e5IYBdhLWcg3w7-Jz - Praveen
你想要控制服务器还是它应该自动弹出消息? - Pradeep Deshmukh
6个回答

14
public class ForceUpdateAsync extends AsyncTask<String, String, JSONObject>{

    private String latestVersion;
    private String currentVersion;
    private Context context;
    public ForceUpdateAsync(String currentVersion, Context context){
        this.currentVersion = currentVersion;
        this.context = context;
    }

    @Override
    protected JSONObject doInBackground(String... params) {

        try {
             latestVersion = Jsoup.connect("https://play.google.com/store/apps/details?id="+context.getPackageName()+"&hl=en")
                    .timeout(30000)
                    .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6")
                    .referrer("http://www.google.com")
                    .get()
                    .select("div[itemprop=softwareVersion]")
                    .first()
                     .ownText();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return new JSONObject();
    }

    @Override
    protected void onPostExecute(JSONObject jsonObject) {
        if(latestVersion!=null){
            if(!currentVersion.equalsIgnoreCase(latestVersion)){
               // Toast.makeText(context,"update is available.",Toast.LENGTH_LONG).show();
                if(!(context instanceof SplashActivity)) {
                    if(!((Activity)context).isFinishing()){
                        showForceUpdateDialog();
                    }
                }
            }
        }
        super.onPostExecute(jsonObject);
    }

    public void showForceUpdateDialog(){
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(new ContextThemeWrapper(context,
                R.style.DialogDark));

        alertDialogBuilder.setTitle(context.getString(R.string.youAreNotUpdatedTitle));
        alertDialogBuilder.setMessage(context.getString(R.string.youAreNotUpdatedMessage) + " " + latestVersion + context.getString(R.string.youAreNotUpdatedMessage1));
        alertDialogBuilder.setCancelable(false);
        alertDialogBuilder.setPositiveButton(R.string.update, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + context.getPackageName())));
                dialog.cancel();
            }
        });
        alertDialogBuilder.show();
    }
}

在 string.xml 文件中,您可以像这样添加任何消息。

<string name="youAreNotUpdatedTitle">Update Available</string>
    <string name="youAreNotUpdatedMessage">A new version of YOUR_APP_NAME is available. Please update to version\s</string>
    <string name="youAreNotUpdatedMessage1">\s now</string>
    <string name="update">Update</string>

记得在对话框代码中定义对话框的样式。

现在只需要在您的基本Activity中编写forceUpdate()函数,并在onResume()方法内调用它,然后您就完成了!

// check version on play store and force update
    public void forceUpdate(){
        PackageManager packageManager = this.getPackageManager();
        PackageInfo packageInfo = null;
        try {
            packageInfo =  packageManager.getPackageInfo(getPackageName(),0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        String currentVersion = packageInfo.versionName;
        new ForceUpdateAsync(currentVersion,BaseActivity.this).execute();
    }

嘿,这段代码在我的电脑上可以运行,但在实际程序中不起作用,请启用并帮忙解决。 - Aanal Shah
当我们将代码从.select("div[itemprop=softwareVersion]")更改为.select("div.hAyfc:nth-child(4) > span:nth-child(2) > div:nth-child(1) > span:nth-child(1)")时,它可以正常工作。 - Velayutham M
它无法获取精确的版本号? - Qaiser Hussain

4

2019年Android开发者峰会更新

Google在2019年的Android开发者峰会上宣布,支持应用内更新,包括立即灵活的应用程序更新类型。

*应用内更新仅适用于运行Android 5.0(API级别21)或更高版本的设备。


4

在服务器端存储您发布到Play商店的应用程序版本号(versionCode)。每次用户打开应用程序时,调用API获取versionCode。比较用户当前使用的应用程序的versionCode和您在服务器上存储的versionCode。以下是获取应用程序versionCode的代码:

PackageManager manager = this.getPackageManager();
PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
String versionCode = info.versionCode;

如果versionCode不匹配(即来自服务器的versionCode>应用程序的versionCode),则提示用户更新。
附言:如果您想使用此方法,每次在playstore上更新应用程序时都必须更新服务器上的versionCode。

1
在你的第一个活动中,你可以调用API以返回应用程序的最新版本。将其与当前应用程序版本进行比较,如果当前版本较低,则显示一个对话框询问是否更新。更新按钮可以打开您的应用程序在Play商店中。

0

你可以做以下事情。

  1. 你应该在你的应用程序中实现这个功能,它可以检查你的应用程序在Play商店的当前版本。如果用户使用旧版本,则提示他们更新的对话框。
  2. 你的应用程序应该集成任何分析(Facebook,Firebase,Localytics等)SDK,支持应用内消息。借助此功能,您可以广播推送通知或应用内消息以更新应用程序。

借助这些技术,您可以要求您的用户更新应用程序。


0

最近,谷歌宣布了使用谷歌提供的Play Core库来完成此事的官方方式。

有两种可用的更新类型 - 立即更新和灵活更新。 开发人员需要遵循某些步骤将强制更新集成到他/她的项目中。

  1. 检查更新是否可用。
  2. 开始更新
  3. 获取更新状态的回调
  4. 处理灵活更新
  5. 安装灵活更新
  6. 处理立即更新

在更新期间用户关闭应用程序的情况下,开发人员还需要处理这种情况,这些情况在第4步和第6步中提到。

以下是简要文档和指南的链接,以将其集成到您的项目中。 谷歌提供的强制更新。

愉快的编码..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接