One month restiction for application free use - android

Requirement:
In my application I want to allow user to free use all features for one month from the day of application's first run. For this I have store first run date in application database and compare first run date with current date every time when application launch.
Implementation:
For getting current date we have several function like Calendar.getInstance(); Date date=new Date(); these function will return the date\datetime of the standard "wall" clock (time and date). According to document Which can be set by the user or the phone network.
The Problem:
Every thing seems to be work fine but what if user change date from Setting and set it to past date. For example user have first run application on 7 June 2013 so after 6 July 2013 application must show that he have to purchase subscription, but if user change date of device back to 30 June etc. then the restriction will not work.
So is there any why to implement it correctly?
Is there any why to get actual time of device that is not be editable by user?
Edit:
Application can work offline, so user can turn off internet connectivity.

How about storing two dates - the date the app was first used and the date it was last used. 30 minus the difference between the two dates will give you the number of days remaining and if the current date is earlier than the last used date you know that they have changed the date back.
Just an idea - not tried it but in theory it should work.

Store the first day it was used and the last day it was used, and listen to the ACTION_TIME_CHANGED intent. Also, try using an AlarmManager.
Or if you have network, store it in a database off the phone.
But you probably need to ask yourself if someone really would change the date of their phone just to use your app. It would seriously mess up a lot of things for them: alarms, calenders, syncing to other services and so on. I don't think it is a problem in reality.

If it's a possibility, you could use a one-shot GPS request to get a time value. The user can't change the GPS time that it receives. Adding the permission is a pain if you don't need it, but this would prevent bad behavior caused by the user mucking with the date/time.

Event(APP_INSTALL) -> storeOnServer(INSTALL_TIME_KEY,getTimeFromServer());
Event(APP_LAUNCH) -> IF(getTimeFromServer -getStoredTime(INSTALL_TIME_KEY) >30)
-> showTrialPeriodEndedAlert()
-> quitApp();

Related

How to protect android game with points award by time interval from date changing cheating?

I'm developing an android game that has points. There are some ways to get points and the one of them is to open the game every day. I thought of two ways to implement this but the both have security problems.
The first way: system date
The app's service gets current system date and checks if bonus was awarded for this date; if it wasn't then award and write this date to the database (suppose this database is encrypted and there is no way to change the data inside it).
The problem: cheater can change system date and get points again and again.
Possible ways of protection:
Fix installation date. If current system date is less that installation date it's a cheater, don't award points. Weakness: cheater can change date to the future not to the past.
The same as first but additionally we can check that installation date is greater that app release date (hardcoded, yes). Weakness: first not but growing every day.
Check date using the internet. If current system date is less or greater than internet date by more than 24 hours it's a cheater, don't award points. Weakness: cheater can disable the internet.
The second way: timer
Suppose that we want to make bonus every day at 00:00. When user starts the game first time (suppose at 20:00) calculate how many time left before the bonus time (4 hours). Set timer for this time (4 hours). When the timer goes off award points and start the new one for 24 hours and then similarly.
The problem: device can be rebooted and the timer will be destroyed. So after reboot we need to repeat algorithm as the first time: calculate how many time left before the bonus time and start the timer. Cheater can change time to 23:55 and reboot the device and get points; and than do it again and again.
The third way: timer and database
The same as the second way but additionally timer writes time left to database every minute (for example) and after reboot restore this value.
The problem: I see no weakness but it awards points every 24 hours but not every day.
That's all...
By the way: I've tested the first way of cheating with some games and it works. But some others are protected from this.
I would be happy to hear any ideas or advice. And thanks for your time.

Android: Actual Date and Device Date

This is my first time to ask here on Stackoverflow and I am apparently having a hard time on this one. How could I identify if the user changed the device's date in order to activate a date-based code actions?
I really need to compare the actual date and device date without internet connection.
For example:
When I click this button, it would only open in August 29. Changing the date would allow me to access the function of the button.
You can use a Network Time Protocol. Which provides the network time and date so it can't be tricked by the user changing the phone date.
Google has one open source at: This link
EDIT
Which provides this code as sample:
SntpClient client = new SntpClient();
if (client.requestTime("time.foo.com")) {
long now = client.getNtpTime() + SystemClock.elapsedRealtime() - client.getNtpTimeReference();
}
where it puts time.foo.com you should put time.google.com. You might need a timeout in milliseconds to add to the requestTime(host,timeout_millis) method.
And for NTP server you can use
time.google.com
Provided Here
If you can make sure that when your app is installed it has correct time then, you may implement a listener to know manual clock change and then do what you want to do. Reference: Is there a way to detect when the user has changed the clock time on their device?.
There are 2 more options, one to get time using GPS and other is to get time from Network. Not too sure about the network, it is something NTP related stuff will explore when I get a chance. Let me know about your implementation.

How does Automatic date and time work in Android?

For some date-based calculation I needed today's correct date, for which I enabled Automatic date and time option in Date and Time Settings and this gives me the correct time and date.
I want to know how Android gets the correct date and time, even though I have not enabled any internet accessibility (WiFi, SIM Data).
Also look at this: There is no response from requestLocationUpdates
Please give me some reference on this.
It capture date and time from the network provider. not only android lots of other phone can do the same.
Autometic date time is provided be the network provide (exmp: vodafone,airtel etc etc ).

Time Tracker in Android Independent of the System time

I've tried to google around but I still can't find the best answer.
All I want is very simple, I am new to Android and I am developing a Game which will give some daily Bonuses to the user, if he plays Everyday.
My Code is:
date = new Date();
dateFormate = new SimpleDateFormat("yyyy/MM/dd");
dateString = dateFormate.format(date);
if(!sharedPreferences.getString("date").equals(dateString))
{
sharedPreferences.putString("date", dateString).commit();
... Here I give Bonus to user
}
BUT the Problem is, This code is dependent on the System Date. User can Easily change the date and can get its daily Reward.
I want to track 24 hours time once he starts playing The game.
Can Anyone Help me Please.
This would be much Appreciated.
If your app has internet access you could get time from your own server, rather than user time.
You could listen to Intent.ACTION_TIME_CHANGED and sync with server time only if you have recieved this intent. You wont be syncing with server unless user changes time manually.
instead of comparing that date has changed you can check if
date is bigger than previos one: asssign bonus and remeber date
date is smaller than previos one: user is cheating-remove all bonuses and do not update old date
this solution is of course not bullet proof but more secure than you previos one

Set default time zone to use for an android application

I'm developing an application for android that has to list activities with its date and time. I would like to ignore the time zone of the device and show always the time in timezone +02:00.
The application is for Spain, but If someone from UK that is in another time zone use the application I want that the time for activities appear in local spanish time.
The date is in UTC format, using Calendar.getTime().toLocaleString(), the time appers in local time zone of device.
I would like to know if the is a way to set a default time zone that has to use my application, and when I invoke Calendar.getTime().toLocaleString() method get the time always in local time zone +2 despite of the device timezone
TimeZone.setDefault(TimeZone.getTimeZone("GMT+3"));
This sets the default timezone. Subsequent calls to Calendar.getInstance() always return as if the device was in that timezone.
You need to set the time zone of your calendar.
This can be done like this :
Calendar.setTimeZone(TimeZone timezone);
And then your calendar will work with a different time zone.
If you want to change the system time zone this can be done by using setTimeZone() of AlarmManager.
When doing that the manifest has to contain the right permission, which is
android.permission.SET_TIME
Link to Documentation
And there is some other solution i found Here, check it out.

Categories

Resources