我已将我的应用程序放在Google Play商店中.它已被我公司的许多客户安装.我理解应用程序如何升级的机制.
用户应检查playstore应用程序中的自动更新复选框,以查找要自动更新的每个应用程序.但是,有些用户已取消选中或未首先检查它.
我写的应用程序是针对护理行业的,护理人员使用它来提供家庭护理.我们的一些客户有1200名护理员.他们必须打电话给所有护理人员进入办公室以单独更新电话.这显然是不可接受的.
有没有办法以编程方式检查Play商店中是否有我的应用程序的更新版本?
我可以拥有每次用户启动检查Play商店的应用程序时运行的代码吗?如果有更新版本,则可以将用户定向到Playstore.这意味着检查自动更新并不重要.
提前致谢
马特
Tar*_*run 34
在您的应用build.gradle文件中包含JSoup:
dependencies {
compile 'org.jsoup:jsoup:1.8.3'
}
Run Code Online (Sandbox Code Playgroud)
并获得当前版本:
currentVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
Run Code Online (Sandbox Code Playgroud)
并执行以下线程:
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("div[itemprop=softwareVersion]")
.first()
.ownText();
return newVersion;
} catch (Exception e) {
return newVersion;
}
}
@Override
protected void onPostExecute(String onlineVersion) {
super.onPostExecute(onlineVersion);
if (onlineVersion != null && !onlineVersion.isEmpty()) {
if (Float.valueOf(currentVersion) < Float.valueOf(onlineVersion)) {
//show dialog
}
}
Log.d("update", "Current version " + currentVersion + "playstore version " + onlineVersion);
}
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请访问:http://revisitingandroid.blogspot.in/2016/12/programmatically-check-play-store-for.html
Ric*_*out 31
AFAIK,没有支持此功能的官方Google API.
您应该考虑从API获取版本号.
而不是连接到外部API或网页(如Google Play商店).存在API或网页中可能发生变化的风险,因此您应该考虑检查当前应用的版本代码是否低于您从自己的API获得的版本号.
请记住,如果您更新了应用,则需要使用应用版本号更改自己API中的版本.
我建议您使用版本号在自己的网站或API中创建文件.(最终制作一个cronjob并自动更新版本,并在出现问题时发送通知)
您必须从Google Play商店页面获取此值:
<div class="content" itemprop="softwareVersion"> x.x.x </div>
Run Code Online (Sandbox Code Playgroud)
如果移动设备上使用的版本低于您自己的API上显示的版本号,请检入您的应用.
理想情况下,显示她/他需要通知更新的指示.
Sre*_*dhu 22
Firebase远程配置现在可能是一种可行且可靠的解决方案,因为谷歌没有公开任何api.
步骤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);
}
Run Code Online (Sandbox Code Playgroud)
获取当前版本名称和代码
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
}
Run Code Online (Sandbox Code Playgroud)
4.使用您当前的生产版本名称和代码保持firebase"android_latest_version_code"和"android_latest_version_name"最新.
Firebase远程配置适用于Android和iPhone.
Nik*_*unj 16
您可以使用以下某些修改来获取当前的Playstore版本JSoup:
@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);
}
Run Code Online (Sandbox Code Playgroud)
@Tarun的回答不再适用了.
asw*_*ala 11
Google 引入了应用内更新 API
API 目前支持两种流:
来自混合应用程序 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';
Run Code Online (Sandbox Code Playgroud)
可以根据需要随时运行更新可用方法。每次用户导航到主屏幕时都会运行我的。
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);
});
}
}
Run Code Online (Sandbox Code Playgroud)
iOS回调:苹果有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(' ');
// Release Notes
settings.updateReleaseNotes('v' + storeVersion, releaseNotes);
}
}
Run Code Online (Sandbox Code Playgroud)
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(' ');
// Release Notes
settings.updateReleaseNotes('v' + storeVersion, releaseNotes);
}
}
Run Code Online (Sandbox Code Playgroud)
开放式商店逻辑很简单,但为了完整性
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')
}
Run Code Online (Sandbox Code Playgroud)
确保 Play 商店和 App Store 已被列入白名单:
<access origin="https://itunes.apple.com"/>
<access origin="https://play.google.com"/>
Run Code Online (Sandbox Code Playgroud)
有AppUpdater库.如何包括:
Run Code Online (Sandbox Code Playgroud)allprojects { repositories { jcenter() maven { url "https://jitpack.io" } } }
Run Code Online (Sandbox Code Playgroud)dependencies { compile 'com.github.javiersantos:AppUpdater:2.6.4' }
Run Code Online (Sandbox Code Playgroud)<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Run Code Online (Sandbox Code Playgroud)AppUpdater appUpdater = new AppUpdater(this); appUpdater.start();
@Tarun的答案工作得很好.但现在不是,因为Google最近谷歌网站上的变化.
只需从@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);
}
}
Run Code Online (Sandbox Code Playgroud)
并且不要忘记添加JSoup库
dependencies {
compile 'org.jsoup:jsoup:1.8.3'}
Run Code Online (Sandbox Code Playgroud)
并在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();
}
Run Code Online (Sandbox Code Playgroud)
就是这样..感谢这个链接
小智 5
在OnCreate方法里面写下代码..
VersionChecker versionChecker = new VersionChecker();
try {
latestVersion = versionChecker.execute().get();
Toast.makeText(getBaseContext(), latestVersion , Toast.LENGTH_SHORT).show();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
这给你玩商店版的应用..
然后你必须检查应用程序版本如下
PackageManager manager = getPackageManager();
PackageInfo info = null;
try {
info = manager.getPackageInfo(getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
assert info != null;
version = info.versionName;
Run Code Online (Sandbox Code Playgroud)
之后,您可以将其与商店版本进行比较,并设置您自己的更新屏幕
if(version.equals(latestVersion)){
Toast.makeText(getBaseContext(), "No Update" , Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getBaseContext(), "Update" , Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)
并添加VersionChecker.class,如下所示
公共类VersionChecker扩展AsyncTask {
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;
}
}
Run Code Online (Sandbox Code Playgroud)
}
Firebase 远程配置更好。
在 Android 上实现远程配置
添加远程配置依赖
compile 'com.google.firebase:firebase-config:9.6.0'
Run Code Online (Sandbox Code Playgroud)
完成后,我们可以在需要时在整个应用程序中访问 FirebaseRemoteConfig 实例:
FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
Run Code Online (Sandbox Code Playgroud)
检索远程配置值
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");
Run Code Online (Sandbox Code Playgroud)
获取服务器端值
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...
}
}
});
Run Code Online (Sandbox Code Playgroud)
现在一旦将新版本上传到 Playstore,我们必须在 firebase 中更新版本号。现在,如果是新版本,将显示更新对话框
| 归档时间: |
|
| 查看次数: |
85741 次 |
| 最近记录: |