【问题标题】:Programmatically check Play Store for app updates以编程方式检查 Play 商店的应用更新
【发布时间】:2014-10-01 19:21:28
【问题描述】:

我已将我的应用放到 Google Play 商店中。我公司的很多客户都安装了它。我了解应用程序的升级机制。

用户应为他们想要自动更新的每个应用选中 P​​laystore 应用中的自动更新复选框。但是,有些用户一开始就没有选中它或没有选中它。

我编写的应用程序适用于护理行业,护理人员使用它来提供家庭护理。我们的一些客户有 1200 名护理人员。他们必须把所有的照顾者都叫到办公室来单独更新电话。这显然是不可接受的。

有没有办法以编程方式检查 Play 商店中是否有我的应用的更新版本?

我可以在每次用户启动检查 Play 商店的应用程序时运行代码吗? 如果有更新版本,则可以将用户定向到 Playstore。这意味着不必检查自动更新。

【问题讨论】:

  • 如果应用有可用更新,Play 商店是否已经向用户推送通知?
  • 您的应用程序是否通过您编写的 API 连接到云/互联网 - 因为您可以简单地拥有一个可以手动更新的“版本”变量 - 打开应用程序时,检查本地与云版本的版本 - 如果它们不同,建议更新
  • 我以前用jsoup来做这个,现在用正则表达式来extract the Current Version field

标签: android


【解决方案1】:

没有官方的 GooglePlay API 可以做到这一点。

但您可以使用this unofficial library 获取应用版本数据。

而且,如果上述方法不适合您,您可以随时 http 连接到您的应用页面(例如 https://play.google.com/store/apps/details?id=com.shots.android&hl=en)并解析“当前版本”字段。

【讨论】:

  • 这个库是 2011 年的,很久以前就坏了
【解决方案2】:

设置一个服务器,该服务器公开一个报告最新版本的 HTTP url,然后使用 AlarmManager 调用该 URL 并查看设备上的版本是否与最新版本相同。如果没有弹出消息或通知并将其发送到市场进行升级。

有一些代码示例:How to allow users to check for the latest app version from inside the app?

【讨论】:

    【解决方案3】:

    2019 年 10 月 17 日更新

    https://developer.android.com/guide/app-bundle/in-app-updates

    2019 年 4 月 24 日更新:

    Android 宣布了一项可能会解决此问题的功能。使用应用内更新 API: https://android-developers.googleblog.com/2018/11/unfolding-right-now-at-androiddevsummit.html

    原文:

    据我所知,没有支持此功能的官方 Google API。

    您应该考虑从 API 获取版本号。

    而不是连接到外部 API 或网页(如 Google Play 商店)。 API 或网页可能会发生变化,因此您应该考虑检查当前应用的版本代码是否低于您从自己的 API 获得的版本号。

    请记住,如果您更新应用程序,则需要使用应用程序版本号更改您自己的 API 中的版本。

    我建议您在自己的网站或 API 中制作一个带有版本号的文件。 (最终做一个 cronjob 并自动更新版本,并在出现问题时发送通知)

    您必须从您的 Google Play 商店页面获取此值(同时已更改,不再工作):

    <div class="content" itemprop="softwareVersion"> x.x.x  </div>
    

    如果在移动设备上使用的版本低于您自己的 API 上显示的版本号,请检查您的应用。

    最好通过通知显示她/他需要更新的指示。

    你可以做的事情

    使用您自己的 API 的版本号

    优点:

    • 无需加载 Google Play 商店的全部代码(节省数据/带宽)

    缺点:

    • 用户可以离线,由于无法访问 API,因此检查无用

    Google Play 商店网页上的版本号

    优点:

    • 您不需要 API

    缺点:

    • 用户可以离线,这使得检查无用,因为API无法访问
      • 使用此方法可能会花费您的用户更多带宽/移动数据
      • Play 商店网页可能会发生变化,这会导致您的“开膛手”版本不再工作。

    【讨论】:

    • Google Play 商店网页上的版本号现在将Current Version 列为Varies with device 知道如何解决此问题或是否有其他替代方案可用??
    • 确实如此。来到这个问题,因为我们在进行网络请求时不再可以访问我们自己的谷歌播放页面的 html 源。我们收到一个 FileNotFoundException。
    • 会尝试寻找包含文本的 div。当前版本/Huidige versie 在接下来的 div 中查找第一个数字和点位。
      惠迪格版本
      1.0
    • 类名可能会在他们网站的每次更新中更改。
    【解决方案4】:

    在您的应用程序 build.gradle 文件中包含 JSoup:

    dependencies {
        compile 'org.jsoup:jsoup:1.8.3'
    }
    

    并获取当前版本,例如:

    currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
    

    并执行以下线程:

    private class GetVersionCode extends AsyncTask<Void, String, String> {
        @Override
        protected String doInBackground(Void... voids) {
    
        String newVersion = null;
        try {
            newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + MainActivity.this.getPackageName() + "&hl=it")
                    .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(".hAyfc .htlgb")
                    .get(7)
                    .ownText();
            return newVersion;
        } catch (Exception e) {
            return newVersion;
        }
        }
    
        @Override
        protected void onPostExecute(String onlineVersion) {
            super.onPostExecute(onlineVersion);
            Log.d("update", "Current version " + currentVersion + "playstore version " + onlineVersion);
            if (onlineVersion != null && !onlineVersion.isEmpty()) {
                if (Float.valueOf(currentVersion) < Float.valueOf(onlineVersion)) {
                    //show dialog
                }
            }
        }
    

    更多详情请访问:http://revisitingandroid.blogspot.in/2016/12/programmatically-check-play-store-for.html

    【讨论】:

    • in @Override protected void onPostExecute(String onlineVersion) { } 如果检查版本的条件不应该是浮点值。因为它可能会抛出这样的错误 Invalid java.lang.NumberFormatException: Invalid float: "1.0.6" 。所以用这个。 if (!currentVersion.equalsIgnoreCase(onlineVersion)) { ....}
    • 知道如何在没有 Jsoup 的情况下做到这一点吗?
    • 亲爱的@HiteshSahu,您必须点击Playstore URL“play.google.com/store/apps/details?id=com.whatsapp&hl=en”。此打开页面 URL。右键单击页面,然后单击“查看页面源代码”选项。在页面的 html 中,您可以看到一个属性:“
      1.2
      ”。您必须手动解析 html 并获取此标志。
    • getPackageManager().getPackageInfo(getPackageName(), 0).versionName 你可以使用BuildConfig.VERSION_NAME :)
    • 这显然是一个生成的类名,可以随时更改。你不应该这样做。
    【解决方案5】:

    来自混合应用程序 POV。 这是一个 javascript 示例,我的主菜单上有一个可用更新页脚。如果有可用更新(即我在配置文件中的版本号小于检索到的版本,则显示页脚)这会将用户定向到应用程序/播放商店,然后用户可以在其中单击更新按钮。

    如果是第一次使用此版本,我还会获取最新数据(即发行说明)并在登录时以模式显示这些数据。

    在设备上准备好,设置您的商店 URL

            if (device.platform == 'iOS')
               storeURL = 'https://itunes.apple.com/lookup?bundleId=BUNDLEID';
            else
               storeURL = 'https://play.google.com/store/apps/details?id=BUNDLEID';
    

    Update Available 方法可以按您喜欢的频率运行。每次用户导航到主屏幕时都会运行我的。

    function isUpdateAvailable() {
        if (device.platform == 'iOS') {
            $.ajax(storeURL, {
                type: "GET",
                cache: false,
                dataType: 'json'
            }).done(function (data) {
                isUpdateAvailable_iOS(data.results[0]);
            }).fail(function (jqXHR, textStatus, errorThrown) {
                commsErrorHandler(jqXHR, textStatus, false);
            });
        } else {
            $.ajax(storeURL, {
                type: "GET",
                cache: false
            }).done(function (data) {
                isUpdateAvailable_Android(data);
            }).fail(function (jqXHR, textStatus, errorThrown) {
                commsErrorHandler(jqXHR, textStatus, false);
            });
        }
    }
    

    iOS 回调:Apple 有一个 API,所以很容易获得

    function isUpdateAvailable_iOS (data) {
        var storeVersion = data.version;
        var releaseNotes = data.releaseNotes;
        // Check store Version Against My App Version ('1.14.3' -> 1143)
        var _storeV = parseInt(storeVersion.replace(/\./g, ''));
        var _appV = parseInt(appVersion.substring(1).replace(/\./g, ''));
        $('#ft-main-menu-btn').off();
        if (_storeV > _appV) {
            // Update Available
            $('#ft-main-menu-btn').text('Update Available');
            $('#ft-main-menu-btn').click(function () {
                openStore();
            });
    
        } else {
            $('#ft-main-menu-btn').html('&nbsp;');
            // Release Notes
            settings.updateReleaseNotes('v' + storeVersion, releaseNotes);
        }
    }
    

    Android 回调:您必须抓取 PlayStore,因为您可以看到该版本相对容易抓取,并且我使用 html 而不是文本,因为这样我可以使用它们的格式(即换行等)

    function isUpdateAvailable_Android(data) {
        var html = $(data);
        var storeVersion = html.find('div[itemprop=softwareVersion]').text().trim();
        var releaseNotes = html.find('.whatsnew')[0].innerHTML;
        // Check store Version Against My App Version ('1.14.3' -> 1143)
        var _storeV = parseInt(storeVersion.replace(/\./g, ''));
        var _appV = parseInt(appVersion.substring(1).replace(/\./g, ''));
        $('#ft-main-menu-btn').off();
        if (_storeV > _appV) {
            // Update Available
            $('#ft-main-menu-btn').text('Update Available');
            $('#ft-main-menu-btn').click(function () {
                openStore();
            });
    
        } else {
            $('#ft-main-menu-btn').html('&nbsp;');
            // Release Notes
            settings.updateReleaseNotes('v' + storeVersion, releaseNotes);
        }
    }
    

    打开商店的逻辑很简单,但为了完整性

    function openStore() {
        var url = 'https://itunes.apple.com/us/app/appname/idUniqueID';
        if (device.platform != 'iOS')
           url = 'https://play.google.com/store/apps/details?id=appid'
       window.open(url, '_system')
    }
    

    确保 Play Store 和 App Store 已被列入白名单:

      <access origin="https://itunes.apple.com"/>
      <access origin="https://play.google.com"/>
    

    【讨论】:

    • 我收到错误“解析 ajax 响应时出错:SyntaxError: Unexpected token
    • ios 还是安卓?你的网址正确吗?带您更正浏览器上的页面?
    【解决方案6】:

    AppUpdater 库。 如何包含:

    1. 将存储库添加到您的项目 build.gradle
    allprojects {
        repositories {
            jcenter()
            maven {
                url "https://jitpack.io"
            }
        }
    }
    
    1. 将库添加到您的模块 build.gradle
    dependencies {
        compile 'com.github.javiersantos:AppUpdater:2.6.4'
    }
    
    1. 将 INTERNET 和 ACCESS_NETWORK_STATE 权限添加到您应用的 Manifest:
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    
    1. 将此添加到您的活动中:
    AppUpdater appUpdater = new AppUpdater(this); 
    appUpdater.start();
    

    【讨论】:

    【解决方案7】:

    Firebase 远程配置目前可能是一种可行且可靠的解决方案,因为 google 并未向其公开任何 api。

    查看Firebase Remote Config Docs

    步骤 1.创建一个firebase项目并将google_play_service.json添加到您的项目中

    2.在firebase控制台中创建“android_latest_version_code”和“android_latest_version_name”等键->远程配置

    3.Android 代码

        public void initializeFirebase() {
            if (FirebaseApp.getApps(mContext).isEmpty()) {
                FirebaseApp.initializeApp(mContext, FirebaseOptions.fromResource(mContext));
            }
            final FirebaseRemoteConfig config = FirebaseRemoteConfig.getInstance();
            FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
                                                                  .setDeveloperModeEnabled(BuildConfig.DEBUG)
                                                                  .build();
            config.setConfigSettings(configSettings);
    }
    

    获取当前版本名称和代码

    int playStoreVersionCode = FirebaseRemoteConfig.getInstance().getString(
                    "android_latest_version_code");
    PackageInfo pInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
    int currentAppVersionCode = pInfo.versionCode; 
    if(playStoreVersionCode>currentAppVersionCode){
    //Show update popup or whatever best for you
    }
    

    4。并使用您当前的生产版本名称和代码使 firebase“android_latest_version_code”和“android_latest_version_name”保持最新。

    Firebase 远程配置适用于 Android 和 iPhone。

    【讨论】:

    • 请参阅firebasetutorials.com/… 在 Firebase 中创建参数。
    • 我认为,这个解决方案会导致编译错误:Caused by: com.android.tools.r8.utils.AbortException: Error: null, Cannot fit requested classes in a single dex file (# methods: 68703 &gt; 65536)。在这种情况下,您应该将 MultiDex 添加到您的应用程序中。
    【解决方案8】:

    您可以使用JSoup 获取当前的Playstore 版本,并进行如下修改:

    @Override
    protected String doInBackground(Void... voids) {
    
        String newVersion = null;
        try {
            newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + MainActivity.this.getPackageName() + "&hl=it")
                    .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(".hAyfc .htlgb")
                    .get(7)
                    .ownText();
            return newVersion;
        } catch (Exception e) {
            return newVersion;
        }
    }
    
    @Override
    protected void onPostExecute(String onlineVersion) {
        super.onPostExecute(onlineVersion);
    
        Log.d("update", "playstore version " + onlineVersion);
    }
    

    @Tarun 的回答不再起作用了。

    【讨论】:

    • 这是工作伙伴,但我可以永远依赖它还是在不久的将来会改变??
    • 不建议依赖这个,因为它不是官方的解决方案。
    • @Nikunj 我创建了一个扩展 AsyncTask 的类 GetVersionCode,当我在该类中编写代码时,getPackageName() 显示错误。我试过了,GetVersionCode.this 但没有任何效果。
    • 使用 .select(".hAyfc .htlgb").get(7) 对更改并不健壮。我看到了另一个使用索引 5 的解决方案。要选择正确的,我使用扩展查询 .select(".hAyfc .BgcNfc:containsOwn(Current Version) + .htlgb.htlgb").first ().text ()
    【解决方案9】:

    现在只确认该方法有效:

    newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + AcMainPage.this.getPackageName() + "&hl=it")
                            .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(".hAyfc .htlgb")
                            .get(5)
                            .ownText();
    

    【讨论】:

      【解决方案10】:

      您可以使用 Jsoup 尝试以下代码

      String latestVersion = doc.getElementsContainingOwnText("Current Version").parents().first().getAllElements().last().text();
      

      【讨论】:

        【解决方案11】:

        @Tarun 的答案工作得很好。但现在不是,由于谷歌最近在谷歌播放网站上的变化。

        只需从@Tarun 答案中更改这些。

        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=" + MainActivity.this.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 (Float.valueOf(currentVersion) < Float.valueOf(onlineVersion)) {
                        //show anything
                    }
        
                }
        
                Log.d("update", "Current version " + currentVersion + "playstore version " + onlineVersion);
        
            }
        }
        

        别忘了添加 JSoup 库

        dependencies {
        compile 'org.jsoup:jsoup:1.8.3'}
        

        在 Oncreate() 上

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        
        
            String currentVersion;
            try {
                currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        
            new GetVersionCode().execute();
        
        }
        

        就是这样。。 感谢this link

        【讨论】:

          【解决方案12】:

          除了使用 JSoup,我们还可以通过模式匹配从 playStore 获取应用版本。

          要匹配来自 google playstore 的最新模式,即 &lt;div class="BgcNfc"&gt;Current Version&lt;/div&gt;&lt;span class="htlgb"&gt;&lt;div&gt;&lt;span class="htlgb"&gt;X.X.X&lt;/span&gt;&lt;/div&gt; 我们首先必须匹配上面的节点序列,然后从上面的序列中获取版本值。以下是相同的代码sn-p:

              private String getAppVersion(String patternString, String inputString) {
                  try{
                      //Create a pattern
                      Pattern pattern = Pattern.compile(patternString);
                      if (null == pattern) {
                          return null;
                      }
          
                      //Match the pattern string in provided string
                      Matcher matcher = pattern.matcher(inputString);
                      if (null != matcher && matcher.find()) {
                          return matcher.group(1);
                      }
          
                  }catch (PatternSyntaxException ex) {
          
                      ex.printStackTrace();
                  }
          
                  return null;
              }
          
          
              private String getPlayStoreAppVersion(String appUrlString) {
                  final String currentVersion_PatternSeq = "<div[^>]*?>Current\\sVersion</div><span[^>]*?>(.*?)><div[^>]*?>(.*?)><span[^>]*?>(.*?)</span>";
                  final String appVersion_PatternSeq = "htlgb\">([^<]*)</s";
                  String playStoreAppVersion = null;
          
                  BufferedReader inReader = null;
                  URLConnection uc = null;
                  StringBuilder urlData = new StringBuilder();
          
                  final URL url = new URL(appUrlString);
                  uc = url.openConnection();
                  if(uc == null) {
                     return null;
                  }
                  uc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
                  inReader = new BufferedReader(new InputStreamReader(uc.getInputStream()));
                  if (null != inReader) {
                      String str = "";
                      while ((str = inReader.readLine()) != null) {
                                     urlData.append(str);
                      }
                  }
          
                  // Get the current version pattern sequence 
                  String versionString = getAppVersion (currentVersion_PatternSeq, urlData.toString());
                  if(null == versionString){ 
                      return null;
                  }else{
                      // get version from "htlgb">X.X.X</span>
                      playStoreAppVersion = getAppVersion (appVersion_PatternSeq, versionString);
                  }
          
                  return playStoreAppVersion;
              }
          

          我通过这个解决了这个问题,因为这也适用于最新的 Google Playstore 更改。希望对您有所帮助。

          【讨论】:

            【解决方案13】:

            在 OnCreate 方法里面写下面的代码..

            VersionChecker versionChecker = new VersionChecker();
                try {
                    latestVersion = versionChecker.execute().get();
                    Toast.makeText(getBaseContext(), latestVersion , Toast.LENGTH_SHORT).show();
            
                } catch (InterruptedException | ExecutionException e) {
                    e.printStackTrace();
                }
            

            这为您提供了应用商店版本..

            那么你必须检查应用程序版本如下

            PackageManager manager = getPackageManager();
                PackageInfo info = null;
                try {
                    info = manager.getPackageInfo(getPackageName(), 0);
                } catch (PackageManager.NameNotFoundException e) {
                    e.printStackTrace();
                }
                assert info != null;
                version = info.versionName;
            

            之后您可以将其与商店版本进行比较并设置您自己的更新屏幕

            if(version.equals(latestVersion)){
                    Toast.makeText(getBaseContext(), "No Update" , Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(getBaseContext(), "Update" , Toast.LENGTH_SHORT).show();
            
                }
            

            并添加 VersionChecker.class 如下

            public class VersionChecker extends AsyncTask<String, String, String> {
            
                private String newVersion;
            
                @Override
                protected String doInBackground(String... params) {
            
                    try {
                        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(".hAyfc .htlgb")
                                .get(7)
                                .ownText();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            
                    return newVersion;
                }
            }
            

            【讨论】:

              【解决方案14】:

              Firebase 远程配置更好。

              • 快速轻松地更新我们的应用程序,无需向应用程序发布新版本

              在 Android 上实现远程配置

              添加远程配置依赖

              compile 'com.google.firebase:firebase-config:9.6.0'
              

              完成后,我们可以在需要时在整个应用程序中访问 FirebaseRemoteConfig 实例:

              FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
              

              检索远程配置值

              boolean someBoolean = firebaseRemoteConfig.getBoolean("some_boolean");
              byte[] someArray = firebaseRemoteConfig.getByteArray("some_array");
              double someDouble = firebaseRemoteConfig.getDouble("some_double");
              long someLong = firebaseRemoteConfig.getLong("some_long");
              String appVersion = firebaseRemoteConfig.getString("appVersion");
              

              获取服务器端值

              firebaseRemoteConfig.fetch(cacheExpiration)
                          .addOnCompleteListener(new OnCompleteListener<Void>() {
                              @Override
                              public void onComplete(@NonNull Task<Void> task) {
                                  if (task.isSuccessful()) {
                                      mFirebaseRemoteConfig.activateFetched();
                                      // We got our config, let's do something with it!
                                      if(appVersion < CurrentVersion){
                                         //show update dialog
                                      }
                                  } else {
                                      // Looks like there was a problem getting the config...
                                  }
                              }
                          });
              

              现在一旦将新版本上传到 Playstore,我们必须在 Firebase 中更新版本号。现在如果是新版本,将显示更新对话框

              【讨论】:

                【解决方案15】:
                private void CheckUPdate() {
                    VersionChecker versionChecker = new VersionChecker();
                    try
                    {   String appVersionName = BuildConfig.VERSION_NAME;
                        String mLatestVersionName = versionChecker.execute().get();
                        if(!appVersionName.equals(mLatestVersionName)){
                            AlertDialog.Builder alertDialog = new AlertDialog.Builder(Activity.this);
                            alertDialog.setTitle("Please update your app");
                            alertDialog.setMessage("This app version is no longer supported. Please update your app from the Play Store.");
                            alertDialog.setPositiveButton("UPDATE NOW", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    final String appPackageName = getPackageName();
                                    try {
                                        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
                                    } catch (android.content.ActivityNotFoundException anfe) {
                                        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
                                    }
                                }
                            });
                            alertDialog.show();
                        }
                
                    } catch (InterruptedException | ExecutionException e) {
                        e.printStackTrace();
                    }
                }
                
                @SuppressLint("StaticFieldLeak")
                public class VersionChecker extends AsyncTask<String, String, String> {
                    private String newVersion;
                    @Override
                    protected String doInBackground(String... params) {
                
                        try {
                            newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id="+getPackageName())
                                    .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(".hAyfc .htlgb")
                                    .get(7)
                                    .ownText();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        return newVersion;
                    }
                }
                

                【讨论】:

                • 请提供有关此代码的工作方式和内容的一些信息
                【解决方案16】:

                Google 引入了应用内更新 api。使用它,我们可以要求用户更新应用程序内的应用程序。如果用户接受,我们可以直接下载最新的应用程序并安装,而无需重定向到 Playstore。更多详情请参考以下链接

                link1link2

                【讨论】:

                • 我喜欢你制作的 GIF :)
                【解决方案17】:

                谷歌已经介绍了in-app updates API

                API 目前支持两种流程:

                • “即时”流程是一种全屏用户体验,引导用户从下载到更新,然后才能使用您的应用。
                • “灵活的流程”允许用户在继续使用您的应用的同时下载更新。

                【讨论】:

                  【解决方案18】:

                  Google 引入了应用内更新功能,(https://developer.android.com/guide/app-bundle/in-app-updates) 它适用于 Lollipop+,让您能够通过漂亮的对话框 (FLEXIBLE) 或强制完整的对话框询问用户更新-屏幕消息(立即)。

                  灵活更新如下所示:

                  这是立即更新流程:

                  您可以在这里查看我的答案https://stackoverflow.com/a/56808529/5502121,以获取实现灵活即时更新流程的完整示例代码。 希望对您有所帮助!

                  【讨论】:

                    【解决方案19】:

                    虽然我不确定 JAVA 编程,但你可以通过最新的更改

                    1. 请求https://play.google.com/store/apps/details?id=&lt;package.name&gt; url。
                    2. 将数据解析为文本。
                    3. 将正则表达式 /key: 'ds:4',\n[\ ]*hash: '[0-9]*',\n[\ ]*data:\ ([\S".,\[\]\ ]*),/ 与响应匹配。
                    4. 这有一个组,它将给组值["size", "version", "supported android version"]。例如["16M", "1.0.0", "5.0 and up"]
                    5. 将组解析为数组,您将获得最新版本的数组[1]。

                    实现不依赖于任何语言。

                    【讨论】:

                      【解决方案20】:

                      如果您的应用在 Google Play 商店中,那么只需使用此功能,它会自动检查应用更新并向用户显示消息以进行更新

                      public void checkUpdate()
                      {
                          if (isInternetOn())
                          {
                              AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(getApplicationContext());
                              Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
                              appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
                                  if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE))
                                  {
                                      try {
                                          appUpdateManager.startUpdateFlowForResult(appUpdateInfo, AppUpdateType.FLEXIBLE, this, "Your Request Code");
                                      } catch (IntentSender.SendIntentException e) {
                                          e.printStackTrace();
                                      }
                                  }
                              });
                          }
                      }
                      

                      此外,您可以在使用此功能检查更新之前检查互联网连接`

                      public boolean isInternetOn() 
                          {
                              
                              ConnectivityManager connec = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                      
                              if (connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTED ||
                                      connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTING ||
                                      connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTING ||
                                      connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTED) 
                              {
                                  
                                  return true;
                      
                              } else if (connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.DISCONNECTED ||
                                      connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.DISCONNECTED) 
                              {
                                  return false;
                              }
                              return false;
                          }`
                      

                      【讨论】:

                        猜你喜欢
                        相关资源
                        最近更新 更多
                        热门标签