如何更新Play商店应用程序,即在用户使用旧版应用程序的情况下,如何从Google Play商店获取应用程序版本信息以提示用户强制/建议更新应用程序。我已经完成了andorid-market-api,这不是官方方式,也需要谷歌的oauth login身份验证。我也经历了android query 它提供应用内版本检查,但它不适用于我的情况。 我发现了以下两种选择:
还有其他方法可以轻松完成吗?
答案 0 :(得分:36)
我建议不要使用库只创建一个新类
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;
}
在您的活动中:
VersionChecker versionChecker = new VersionChecker();
String latestVersion = versionChecker.execute().get();
一切都是
答案 1 :(得分:9)
如果有其他人需要,可以使用jQuery版本获取版本号。
$.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());
});
答案 2 :(得分:6)
使用此代码可以完美地正常工作。
/etc/kubernetes/pki
答案 3 :(得分:5)
Firebase远程配置在这里可以提供最佳帮助,
答案 4 :(得分:4)
除了使用JSoup之外,我们还可以进行模式匹配,以便从playStore获取应用版本。
匹配google playstore的最新模式,即
<div class="BgcNfc">Current Version</div><span class="htlgb"><div><span class="htlgb">X.X.X</span></div>
我们首先必须匹配上面的节点序列,然后从上面的序列中获取版本值。以下是相同的代码段:
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中所做的最新更改。希望有所帮助。
答案 5 :(得分:1)
使用将存储版本信息的服务器API
就像你说的那样。这是一种检测更新的简便方法。每次API调用都会传递您的版本信息。更新Playstore时更改服务器中的版本。一旦服务器版本高于已安装的应用程序版本,您就可以在API响应中返回状态代码/消息,可以处理并显示更新消息。 如果您使用此方法,也可以阻止用户使用像WhatsApp这样的旧应用。
或者您可以使用推送通知,这很容易做到......另外
答案 6 :(得分:1)
此解决方案的完整源代码:https://stackoverflow.com/a/50479184/5740468
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof DataListener) {
mDataListener = (DataListener) context;
}
}
用法:
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;
}
}
答案 7 :(得分:0)
我会建议使用ex。推送通知以通知您的应用程序有新的更新,或使用您自己的服务器从那里启用您的应用程序读取版本。
是每次更新应用程序时的额外工作,但在这种情况下,您不会依赖某些“非官方”或第三方可能用完的服务。
万一你错过了什么 - 以前对你话题的讨论 query the google play store for the version of an app?
答案 8 :(得分:0)
您可以调用以下WebService: http://carreto.pt/tools/android-store-version/?package=[YOUR_APP_PACKAGE_NAME]
使用Volley的例子:
String packageName = "com.google.android.apps.plus";
String url = "http://carreto.pt/tools/android-store-version/?package=";
JsonObjectRequest jsObjRequest = new JsonObjectRequest
(Request.Method.GET, url+packageName, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
/*
here you have access to:
package_name, - the app package name
status - success (true) of the request or not (false)
author - the app author
app_name - the app name on the store
locale - the locale defined by default for the app
publish_date - the date when the update was published
version - the version on the store
last_version_description - the update text description
*/
try{
if(response != null && response.has("status") && response.getBoolean("status") && response.has("version")){
Toast.makeText(getApplicationContext(), response.getString("version").toString(), Toast.LENGTH_LONG).show();
}
else{
//TODO handling error
}
}
catch (Exception e){
//TODO handling error
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//TODO handling error
}
});
答案 9 :(得分:0)
最简单的方法是使用google的firebase软件包,并使用新版本的远程通知或实时配置,并将id发送给低于版本号的用户 查看更多https://firebase.google.com/
答案 10 :(得分:0)
这里的好处是,您将能够检查版本号而不是名称,这应该更方便:)另一方面-在发行后,您应该注意每次在api / firebase中更新版本。
从Google Play网页上获取版本。我已经实现了这种方式,并且可以工作超过1年,但是在此期间,我必须将“匹配器”更改3-4次,因为网页上的内容已更改。另外,不时检查它有些头痛,因为您不知道可以在哪里更改。
但是如果您仍然想使用这种方式,这是我基于okHttp
的kotlin代码:
private fun getVersion(onChecked: OnChecked, packageName: String) {
Thread {
try {
val httpGet = HttpGet("https://play.google.com/store/apps/details?id="
+ packageName + "&hl=it")
val response: HttpResponse
val httpParameters = BasicHttpParams()
HttpConnectionParams.setConnectionTimeout(httpParameters, 10000)
HttpConnectionParams.setSoTimeout(httpParameters, 10000)
val httpclient = DefaultHttpClient(httpParameters)
response = httpclient.execute(httpGet)
val entity = response.entity
val `is`: InputStream
`is` = entity.content
val reader: BufferedReader
reader = BufferedReader(InputStreamReader(`is`, "iso-8859-1"), 8)
val sb = StringBuilder()
var line: String? = null
while ({ line = reader.readLine(); line }() != null) {
sb.append(line).append("\n")
}
val resString = sb.toString()
var index = resString.indexOf(MATCHER)
index += MATCHER.length
val ver = resString.substring(index, index + 6) //6 is version length
`is`.close()
onChecked.versionUpdated(ver)
return@Thread
} catch (ignore: Error) {
} catch (ignore: Exception) {
}
onChecked.versionUpdated(null)
}.start()
}
答案 11 :(得分:0)
我怀疑请求应用程序版本的主要原因是提示用户进行更新。我不赞成取消响应,因为这可能会破坏将来版本中的功能。
如果应用的最低版本为5.0,则可以根据文档https://developer.android.com/guide/app-bundle/in-app-updates
进行应用内更新。如果请求应用程序版本的原因不同,您仍然可以使用appUpdateManager来检索版本并执行所需的任何操作(例如,将其存储在首选项中)。
例如,我们可以将文档的片段修改为类似的内容:
// Creates instance of the manager.
val appUpdateManager = AppUpdateManagerFactory.create(context)
// Returns an intent object that you use to check for an update.
val appUpdateInfoTask = appUpdateManager.appUpdateInfo
// Checks that the platform will allow the specified type of update.
appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
val version = appUpdateInfo.availableVersionCode()
//do something with version. If there is not a newer version it returns an arbitary int
}
答案 12 :(得分:0)
我的解决方法是解析Google Play网站并提取版本号。 如果您遇到CORS问题或想节省用户设备上的带宽,请考虑从Web服务器上运行它。
let ss = [html];
for (let p of ['div', 'span', '>', '<']) {
let acc = [];
ss.forEach(s => s.split(p).forEach(s => acc.push(s)));
ss = acc;
}
ss = ss
.map(s => s.trim())
.filter(s => {
return parseFloat(s) == +s;
});
console.log(ss); // print something like [ '1.10' ]
您可以通过获取https://play.google.com/store/apps/details?id=your.package.name
来获取html文本。为了实现可比性,您可以使用https://www.npmjs.com/package/cross-fetch,它可以在浏览器和node.js上使用。
其他人提到使用某些CSS类或模式(例如“当前版本”)从Google Play网站解析html,但是这些方法可能不那么可靠。因为Google可以随时更改班级名称。根据用户的语言环境偏好,它还可能以不同的语言返回文本,因此您可能不会得到“当前版本”一词。
答案 13 :(得分:0)
服务器端的用户版本Api:
这是目前获取市场版本的最佳方法。当您上传新的APK时,请更新api中的版本。因此,您将在您的应用程序中获得最新版本。 -最好,因为没有Google API可以获取应用版本。
使用Jsoup库:
这基本上是网页抓取。这不是一种方便的方法,因为如果Google更改了他们的代码,则此过程将无法进行。虽然可能性较小。无论如何,要使用Jsop库获取版本。
将此库添加到您的build.gradle
实现'org.jsoup:jsoup:1.11.1'
创建一个用于版本检查的类:
导入android.os.AsyncTask导入org.jsoup.Jsoup导入 java.io.IOException
class PlayStoreVersionChecker(priv val packageName:String): AsyncTask(){
private var playStoreVersion: String = "" override fun doInBackground(vararg params: String?): String { try { playStoreVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=$packageName&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 (e: IOException) { } return playStoreVersion } }
现在按如下方式使用该类:
val playStoreVersion = PlayStoreVersionChecker(“ com.example”)。execute()。get()
答案 14 :(得分:0)
对于PHP
$package='com.whatsapp';
$html = file_get_contents('https://play.google.com/store/apps/details?id='.$package.'&hl=en');
preg_match_all('/<span class="htlgb"><div class="IQ1z0d"><span class="htlgb">(.*?)<\/span><\/div><\/span>/s', $html, $output);
print_r($output[1][3]);
答案 15 :(得分:-2)
使用Jquery
{{1}}