当新版本可用时,Android以编程方式更新应用程序

时间:2014-03-28 09:58:43

标签: android

在我的应用程序中,我想检查应用程序商店中是否有任何更新版本的应用程序。如果有,则必须通过警报消息通知用户,如果他/她选择升级我想更新新版本。我想通过我的应用程序完成所有这些。这可能吗?

10 个答案:

答案 0 :(得分:13)

我遇到了同样的问题但是由JSOUP库解决了。 这是图书馆下载链接:http://jsoup.org/download

String newVersion = Jsoup
                        .connect(
                                "https://play.google.com/store/apps/details?id="
                                        + "Package Name" + "&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();

                Log.e("new Version", newVersion);

答案 1 :(得分:6)

Google没有为此提供任何API。

尽管如此,您可以在Playstore的网络版上发出http请求(https://play.google.com/store/apps/details?id=your.namespace

要发出请求,您可以使用DefaultHttpClient

获得页面内容后,您应该对其进行解析(jsoup是一个很好的解决方案)并搜索:

<div class="content" itemprop="softwareVersion"> 2.2.0  </div>

找到页面的这一部分后,您可以提取版本号并将其与应用中可用的版本号进行比较:

try
{
    String version = this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName;
    if( ! version.equals(versionFromHTML))
    {
        Toast.makeText(this, "New version available on play store", Toast.LENGTH_SHORT);
    }

}
catch (NameNotFoundException e)
{
    //No version do something
}

对于HTML解析部分,请查看here

请记住,每个人都不会在同一时间看到新版本。传播可能需要一些时间(可能是因为缓存)。

答案 2 :(得分:2)

修改

他们最近更改了Google Play网站,现在此代码已损坏。每当Google Play网页发生变化时,请避免使用此解决方案或准备好修补应用。

到目前为止,{p> Ahmad Arlan's answer是最好的答案。但是如果你到了这里并试图剪切并粘贴他的代码,你将会遇到我刚才遇到的同样的问题,所以我不妨在这里发布它来帮助像我这样的人。

  1. 确保您对INTERNET文件拥有AndroidManifest.xml权限。

    <uses-permission android:name="android.permission.INTERNET"/>
    
  2. JSOUP依赖项添加到您的模块build.gradle

    dependencies {
        compile 'org.jsoup:jsoup:1.10.2'
    }
    
  3. 使用try and catch围绕代码段并且不在主线程上运行它。

    public class MainActivity extends AppCompatActivity {
    
        String newVersion;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            new FetchAppVersionFromGooglePlayStore().execute();
        }
    
        class FetchAppVersionFromGooglePlayStore extends AsyncTask<String, Void, String> {
    
            protected String doInBackground(String... urls) {
                try {
                    return
                            Jsoup.connect("https://play.google.com/store/apps/details?id=" + "com.directed.android.smartstart" + "&hl=en")
                            .timeout(10000)
                            .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 (Exception e) {
                    return "";
                }
            }
    
            protected void onPostExecute(String string) {
                newVersion = string;
                Log.d("new Version", newVersion);
            }
        }
    }
    
  4. 我在github上发布了该项目的副本。

答案 3 :(得分:1)

Google Play已经这样做了。当您上传新版应用时,它会直接向您的用户发送提醒。如果用户在Google Play应用中启用了此选项,则会自动下载设备。

答案 4 :(得分:0)

我还有另一种解决方法,这就是我的做法。

HttpPost httppostUserName = new HttpPost("https://androidquery.appspot.com/api/market?app=com.supercell.clashofclans"); //your package name
HttpClient httpclient = new DefaultHttpClient();

HttpResponse responseUser = httpclient.execute(httppostUserName);
String responseStringUser = EntityUtils.toString(responseUser.getEntity(), HTTP.UTF_8);

Log.d(Constants.TAG, "Response: " + responseStringUser);
try {
    JSONObject Json = new JSONObject(responseStringUser);
    newVersion = Json.getString("version");
} catch (Exception e) {
    e.printStackTrace();
}

如果您在浏览器中粘贴网址以查看结果,您将获得更清晰的视图。

答案 5 :(得分:0)

 private void checkForUpdate() {
        PackageInfo packageInfo = null;
        try {      packageInfo=getPackageManager().getPackageInfo(DashboardActivity.this.getPackageName(), 0);
            int curVersionCode = packageInfo.versionCode
            if (curVersionCode > 1) {  // instead of one use value get from server for the new update.
                showUpdateDialog();
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }

答案 6 :(得分:0)

这对我有用。 添加此依赖项。

    implementation 'org.jsoup:jsoup:1.8.3'

在onCreate()方法中,使用以下代码:

try {
       String currentVersion="";
        currentVersion = getApplicationContext().getPackageManager().getPackageInfo(getPackageName(), 0).versionName;

        Log.e("Current Version","::"+currentVersion);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

    new GetVersionCode().execute();

创建类GetVersionCode:

private class GetVersionCode extends AsyncTask<Void, String, String> {

    @Override

    protected String doInBackground(Void... voids) {

        String newVersion = null;

        try {
            Document document = 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();
            if (document != null) {
                Elements element = document.getElementsContainingOwnText("Current Version");
                for (Element ele : element) {
                    if (ele.siblingElements() != null) {
                        Elements sibElemets = ele.siblingElements();
                        for (Element sibElemet : sibElemets) {
                            newVersion = sibElemet.text();
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return newVersion;

    }


    @Override

    protected void onPostExecute(String onlineVersion) {

        super.onPostExecute(onlineVersion);

        if (onlineVersion != null && !onlineVersion.isEmpty()) {

            if (onlineVersion.equals(currentVersion)) {

            } else {
                AlertDialog alertDialog = new AlertDialog.Builder(context).create();
                alertDialog.setTitle("Update");
                alertDialog.setIcon(R.mipmap.ic_launcher);
                alertDialog.setMessage("New Update is available");

                alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "Update", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        try {
                            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + context.getPackageName())));
                        } catch (android.content.ActivityNotFoundException anfe) {
                            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + context.getPackageName())));
                        }
                    }
                });

                alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });

                alertDialog.show();
            }

        }

        Log.d("update", "Current version " + currentVersion + "playstore version " + onlineVersion);

    }
}

答案 7 :(得分:0)

您可以使用Play Core Library应用内更新来解决此问题。您可以check for update availabilityinstall them(如果可用的话)。

请注意,应用内更新仅适用于运行Android 5.0(API级别21)或更高版本的设备,并且要求您使用Play Core library 1.5.0或更高版本。

应用内更新与使用APK扩展文件(.obb文件)的应用不兼容。您可以选择flexible downloadsimmediate updates,而Google Play会负责为您下载和安装更新。

dependencies {
    implementation 'com.google.android.play:core:1.5.0'
    ...
}

答案 8 :(得分:0)

当心违反政策的情况,如果我最近发生了任何用于应用程序更新的第三方框架,Google将会暂停您的应用程序。

enter image description here

答案 9 :(得分:0)

更新2019 Android Dev Summit

Google推出了In-app updates lib。它可以在Lollipop +上运行,并且使您能够通过漂亮的对话框(FLEXIBLE)或强制性全屏消息(IMMEDIATE)要求用户进行更新。

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