Comment puis-je obtenir les informations sur la version de l'application sur Google Play Store pour demander à l'utilisateur de forcer/recommander une mise à jour de l'application lorsque l'application Play Store est mise à jour, c'est-à-dire si l'utilisateur utilise une ancienne version? J'ai déjà parcouru andorid-market-api qui n'est pas la méthode officielle et qui requiert également oauth login authentication de Google. J'ai également consulté la requête Android Qui fournit une vérification de la version dans l'application, mais cela ne fonctionne pas dans mon cas . J'ai trouvé les deux alternatives suivantes:
Y a-t-il d'autres moyens de le faire facilement?
Je recommande de ne pas utiliser une bibliothèque mais de créer une nouvelle classe
1.
public class VersionChecker extends AsyncTask<String, String, String>{
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("div.hAyfc:nth-child(4) > span:nth-child(2) > div:nth-child(1) > span:nth-child(1)")
.first()
.ownText();
} catch (IOException e) {
e.printStackTrace();
}
return newVersion;
}
QUE IS TOUT
VersionChecker versionChecker = new VersionChecker();
String latestVersion = versionChecker.execute().get();
THAT IS ALL
Voici la version de jQuery pour obtenir le numéro de version si quelqu'un d'autre en a besoin.
$.get("https://play.google.com/store/apps/details?id=" + packageName + "&hl=en", function(data){
console.log($('<div/>').html(data).contents().find('div[itemprop="softwareVersion"]').text().trim());
});
Utilisez ce code pour que cela fonctionne parfaitement.
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,TodayWork.this).execute();
}
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.hAyfc:nth-child(3) > span:nth-child(2) > div:nth-child(1) > span:nth-child(1)")
.first()
.ownText();
Log.e("latestversion","---"+latestVersion);
} 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(){
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + context.getPackageName())));
}
}
Outre l'utilisation de JSoup, nous pouvons également effectuer une recherche de motif pour obtenir la version de l'application à partir de playStore.
Pour faire correspondre le dernier modèle de Google PlayStore, à savoir <div class="BgcNfc">Current Version</div><span class="htlgb"><div><span class="htlgb">X.X.X</span></div>
nous devons d'abord faire correspondre la séquence de nœud ci-dessus, puis à partir de la séquence ci-dessus, obtenir la valeur de la version. Ci-dessous l'extrait de code pour la même chose:
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;
}
J'ai résolu ceci à travers cela. Cela résout également les dernières modifications apportées par Google sur PlayStore. J'espère que cela pourra aider.
La configuration distante de Firebase peut aider au mieux ici,
Veuillez vous référer à cette réponse https://stackoverflow.com/a/45750132/2049384
Utiliser l'API du serveur qui stockera les informations de version
Comme vous l'avez dit. C'est un moyen facile de détecter une mise à jour. Transmettez vos informations de version avec chaque appel d'API. Lorsque le Playstore est mis à jour, changez la version sur le serveur. Une fois que la version du serveur est supérieure à la version de l'application installée, vous pouvez renvoyer un code d'état/message dans la réponse de l'API pouvant être traité et un message de mise à jour affiché. Vous pouvez également empêcher les utilisateurs d'utiliser une très vieille application telle que WhatsApp si vous utilisez cette méthode.
Ou vous pouvez utiliser la notification Push, ce qui est facile à faire ... Aussi
Code source complet pour cette solution: https://stackoverflow.com/a/50479184/5740468
import Android.os.AsyncTask;
import Android.support.annotation.Nullable;
import Java.io.BufferedReader;
import Java.io.IOException;
import Java.io.InputStreamReader;
import Java.net.URL;
import Java.net.URLConnection;
import Java.util.regex.Matcher;
import Java.util.regex.Pattern;
import Java.util.regex.PatternSyntaxException;
public class GooglePlayAppVersion extends AsyncTask<String, Void, String> {
private final String packageName;
private final Listener listener;
public interface Listener {
void result(String version);
}
public GooglePlayAppVersion(String packageName, Listener listener) {
this.packageName = packageName;
this.listener = listener;
}
@Override
protected String doInBackground(String... params) {
return getPlayStoreAppVersion(String.format("https://play.google.com/store/apps/details?id=%s", packageName));
}
@Override
protected void onPostExecute(String version) {
listener.result(version);
}
@Nullable
private static String getPlayStoreAppVersion(String appUrlString) {
String
currentVersion_PatternSeq = "<div[^>]*?>Current\\sVersion</div><span[^>]*?>(.*?)><div[^>]*?>(.*?)><span[^>]*?>(.*?)</span>",
appVersion_PatternSeq = "htlgb\">([^<]*)</s";
try {
URLConnection connection = new URL(appUrlString).openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
StringBuilder sourceCode = new StringBuilder();
String line;
while ((line = br.readLine()) != null) sourceCode.append(line);
// Get the current version pattern sequence
String versionString = getAppVersion(currentVersion_PatternSeq, sourceCode.toString());
if (versionString == null) return null;
// get version from "htlgb">X.X.X</span>
return getAppVersion(appVersion_PatternSeq, versionString);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Nullable
private static String getAppVersion(String patternString, String input) {
try {
Pattern pattern = Pattern.compile(patternString);
if (pattern == null) return null;
Matcher matcher = pattern.matcher(input);
if (matcher.find()) return matcher.group(1);
} catch (PatternSyntaxException e) {
e.printStackTrace();
}
return null;
}
}
Usage:
new GooglePlayAppVersion(getPackageName(), version ->
Log.d("TAG", String.format("App version: %s", version)
).execute();
Je vais recommander d'utiliser ex. Envoyer une notification pour signaler à votre application qu'une nouvelle mise à jour est disponible. OR utilisez votre propre serveur pour activer la version de lecture de votre application à partir de là.
Oui, cela représente un travail supplémentaire chaque fois que vous mettez à jour votre application, mais dans ce cas, vous ne dépendez pas de choses "non officielles" ou de tierces parties susceptibles de manquer de service.
Juste au cas où vous auriez manqué quelque chose - discussion précédente de votre sujet interroger le Google Play Store pour obtenir la version d'une application?
le moyen le plus simple consiste à utiliser le paquet firebase de Google et à utiliser des notifications à distance ou une configuration en temps réel avec la nouvelle version et un identifiant envoyé aux utilisateurs sous le numéro de version voir plus https://firebase.google.com/