pietrorampini / updatechecker Goto Github PK
View Code? Open in Web Editor NEWIncrease your app's updates
License: Apache License 2.0
Increase your app's updates
License: Apache License 2.0
I would like to be able to specify when UpdateChecker should notify the user based on the actual version string fetched from Google Play Store. A typical use case is when I or some beta tester are running a newer version of the app than the one published. The current version of UpdateChecker will notify about "new version", even though the version on Play Store is older.
Here is one way it could be implemented:
Let UpdateChecker.showDialog be overloaded with an extra argument, an instance of VersionComparator. The instance may be stored in the argument bundle using Bundle.putSerializable as it is implementing the Serializable interface.
public interface VersionComparator extends Serializable {
boolean isNewer(String googlePlayVersion, String installedVersion);
}
I could then make my own subclass of VersionComparator, crafted for my version names, and pass it to showDialog:
private class MyVersionComparator implements VersionComparator {
@Override
public boolean isNewer(String googlePlayVersion, String installedVersion) {
// Assumes that version strings are on format 'x.xx', eg '2.12'
String[] split = googlePlayVersion.split("\\.");
int googleMajor = Integer.parseInt(split[0]);
int googleMinor = Integer.parseInt(split[1]);
split = installedVersion.split("\\.");
int installedMajor = Integer.parseInt(split[0]);
int installedMinor = Integer.parseInt(split[1]);
return googleMajor > installedMajor || (googleMajor == installedMajor && googleMinor > installedMinor);
}
}
UpdateChecker.checkForDialog(this, 15, new MyVersionComparator());
Проверьте новое обновление для %1$s!\nДоступное в настоящее время в Google Play.
Найдено новое обновление
Hi,
thanks for writing this great update checker lib! It has been very useful in my apps.
There seems to be an issue that shows up every time there is a new release. For some reason I get these crash reports (from Crashlytics) in the logs (haven't been able to reproduce a crash on my own devices):
Error:
Dialog.java line 82
com.rampo.updatechecker.notice.Dialog.show
Logcat:
android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@43347b38 is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:764) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:278) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) at android.app.Dialog.show(Dialog.java:289) at com.rampo.updatechecker.notice.Dialog.show(Dialog.java:82) at com.rampo.updatechecker.UpdateChecker.showDialog(UpdateChecker.java:289) at com.rampo.updatechecker.UpdateChecker.foundUpdateAndShowIt(UpdateChecker.java:198) at com.rampo.updatechecker.UpdateChecker.versionDownloadableFound(UpdateChecker.java:141) at com.rampo.updatechecker.ASyncCheck.onPostExecute(ASyncCheck.java:137) at com.rampo.updatechecker.ASyncCheck.onPostExecute(ASyncCheck.java:44) at android.os.AsyncTask.finish(AsyncTask.java:632) at android.os.AsyncTask.access$600(AsyncTask.java:177) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5579) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) at dalvik.system.NativeStart.main(NativeStart.java)
Used version:
UpdateChecker 2.1.6
Implementation:
The updater code is placed in a Activity/onCreate like this:
UpdateChecker checker = new UpdateChecker(this);
checker.start();
Hi there,
i know that the Callback returns:
public void returnMultipleApksPublished() {
}
Am i mightless in this situation? Can't find out what my current version is?
We use an old Version of our app "com.autoscout24" for devices 2.x.x and a newer version for devices > 4.0.3. Is there something i dont see?
Link to our app: https://play.google.com/store/apps/details?id=com.autoscout24&hl=de
Best,
Ilias
This link in the README.md is dead: https://github.com/rampo/UpdateChecker/tree/master/example
we have found error logs about NullPointerException in the method containsNumber(String) in the UpdateChecker class in our app the other day.
Our app has been using your library for ages, and it worked fine until Augst 28th 2015.
But suddenly, it starts crashing when we launch the our app, and saw the logs.
As temporary fixing, we just remove the checker process from our app, and now it started to working fine.
Have you ever heard similar issue, or any updates in playstore/google side around Augst 28th?
Can i use the Lib aswell for non-PlayStore applications? (So that its downloading and installing the new apk)
Since the library check from the Desktop Web Page of the app the Current Version, if there are different apks for the app, the Play Store will shown Varies depending on the device, so the Library can't compare it to versionName installed.
Example: Asphalt 7: Heat - Google Play
I am receiving severals crashes , i am using crashlytics for log my crashes , and i have a lot reports like this.
java.lang.StackOverflowError
at com.rampo.updatechecker.UpdateChecker.networkError(UpdateChecker.java:167)
at com.rampo.updatechecker.ASyncCheck.onPostExecute(ASyncCheck.java:139)
at com.rampo.updatechecker.ASyncCheck.onPostExecute(ASyncCheck.java:44)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5052)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(NativeStart.java)
The looks like the Dialog class does not play well with its parent activity's life-cycle. I got following crash when the UpdateChecker tried to open a dialog in an activity that was already closed:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1343)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1361)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:127)
at com.rampo.updatechecker.UpdateChecker.showDialog(UpdateChecker.java:299)
I have received several reports about NullPointerException in the method containsNumber(String) in the UpdateChecker class.
UpdateChecker.checkForUpdates()
instead of UpdateChecker.CheckForUpdates()
etc.
I saw your "coming soon" list. This may violate Google Play Developer Program Policies.
"An app downloaded from Google Play may not modify, replace or update its own APK binary code using any method other than Google Play's update mechanism."
source: http://play.google.com/about/developer-content-policy.html
Make a Little Code Cleanup
There are more. Add them Please there. This tool is good but the code ist not the best.
I have some annoying users who think its funny to remove INTERNET permission, UpdateChecker in this case crashes..
05-25 18:51:27.893 7632-8191/nz.org.winters.android.gnfastcharge E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
Process: nz.org.winters.android.gnfastcharge, PID: 7632
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:304)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
at java.net.InetAddress.lookupHostByName(InetAddress.java:451)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:142)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
at com.rampo.updatechecker.ASyncCheck.doInBackground(ASyncCheck.java:81)
at com.rampo.updatechecker.ASyncCheck.doInBackground(ASyncCheck.java:44)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
at libcore.io.Posix.android_getaddrinfo(Native Method)
at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
at java.net.InetAddress.lookupHostByName(InetAddress.java:438)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:142)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
at com.rampo.updatechecker.ASyncCheck.doInBackground(ASyncCheck.java:81)
at com.rampo.updatechecker.ASyncCheck.doInBackground(ASyncCheck.java:44)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: android.system.ErrnoException: android_getaddrinfo failed: EACCES (Permission denied)
at libcore.io.Posix.android_getaddrinfo(Native Method)
at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
at java.net.InetAddress.lookupHostByName(InetAddress.java:438)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:142)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
at com.rampo.updatechecker.ASyncCheck.doInBackground(ASyncCheck.java:81)
at com.rampo.updatechecker.ASyncCheck.doInBackground(ASyncCheck.java:44)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
It's
<string name="downloadFor">Vérification d'une nouvelle mise à jour pour %1$s!\nDisponible dès maintenant sur %2$s.</string>
while it lacks escaping in d'un
as it should be
<string name="downloadFor">Vérification d\'une nouvelle mise à jour pour %1$s!\nDisponible dès maintenant sur %2$s.</string>
Started getting the following error:
Store page format error
Was a great library, very useful. Would be great if the dev updated it to support Google Play's new html structure. Dev - please consider this :)
Thanks!
The dialog button texts are not visible for devices having Nougat OS.
Is there or will there be a way to manage users who belong to different groups within the play store? Such as letting Alpha vs Beta vs Production users getting the notification for an update?
Caused by: java.lang.NullPointerException
at om.rampo.updatechecker.ASyncCheck.containsNumber(ASyncCheck.java:152) at com.rampo.updatechecker.ASyncCheck.doInBackground(ASyncCheck.java:93) at com.rampo.updatechecker.ASyncCheck.doInBackground(ASyncCheck.java:42)
very simple to use indeed!
However, little info on where to put the code might be helpful for beginners.
UpdateChecker checker = new UpdateChecker(this);
checker.start();
Besides,
dependencies { compile 'com.github.rampo.updatechecker:library:2.1.0' }
gives me an error
`Error:(11, 0) Build script error, unsupported Gradle DSL method found: 'compile()'!
Possible causes could be:
The library suddenly started throwing STORE Error. I have my app onto playstore and no update has been released. Can you please let me know why is STORE Error being throwing.
Hey, anything new depending #41 ? Can i set my own Link now?
Greetz
Is there a way to force the user to upgrade?
Some update is mandatory and user needs to update to use the app. Is there a way to enforce such a scheme?
I have followed githab description and have added permissions and link to gradle, but anyway when I made implementation to my activity it does't work. I checke I figured out that issue is in lib, because in class AssynkCheck
next imports cannot be recognized
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.NullPointerException
at com.rampo.updatechecker.ASyncCheck.containsNumber(ASyncCheck.java:152)
at com.rampo.updatechecker.ASyncCheck.doInBackground(ASyncCheck.java:93)
at com.rampo.updatechecker.ASyncCheck.doInBackground(ASyncCheck.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Does this library check periodically? Or is it just a one off event?
If not, is there a way I can make it check periodically, and update info on the UI?
You keep an Activity in a static reference in UpdateChecker class - are you an Android developer really?
Hi,
with Android Marshmallow the apache http client is no longer supported and only works with a workaround. See Documentation:
https://developer.android.com/preview/behavior-changes.html#behavior-apache-http-client
Can you please change to HttpURLConnection? Or OkHttp?
Thank you :)
The Dialog class does not have a public no-argument-constructor. This causes crashes under certain conditions, I have already received several crash reports for one of my apps where I am using UpdateChecker.
This is a general requirement for all subclasses of Fragment. The Android system will not be able to recreate it later on if there is no such constructor. You may supply constructor arguments using a combination setArgument() and a Bundle.
http://developer.android.com/reference/android/app/Fragment.html#Fragment()
http://stackoverflow.com/a/9245510/1615280
I have received several reports about NullPointerException in the method containsNumber(String) in the UpdateChecker class.
Can we please have a constructor that takes in a Context parameter. Looking through the code Activity is only used to pull package name, and Context can easily be substituted for that purpose.
Great library by the way.
Hi..
UpdateChecker leaks the reference to the activity that is passed in the call to
new UpdateChecker(this);
This was found using square's leakcanary
Got this error trying to test the app on emulator.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="library_name">Update Checker</string>
<string name="downloadFor">Kolla in den senaste uppdateringen av %1$s!\nFinns tillgänglig på %2$s.</string>
<string name="dialogPositiveButton">OK</string>
<string name="dialogNeutralButton">Senare</string>
<string name="dialogNegativeButton">Nej, tack</string>
<string name="newUpdateAvailable">Ny uppdatering finns</string>
<string name="googlePlay">Google Play</string>
<string name="amazonStore">Amazon App Store</string>
</resources>
Error:(32, 17) Failed to resolve: com.github.rampo.updatechecker:library:2.1.8
Show in File
Show in Project Structure dialog
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.