Identify the User rated the app or not - android

I am working on an Android application. I want to open a apprater dialog for particular number of launches. So I used the following code.
public static void app_launched(Context mContext) {
SharedPreferences prefs = mContext.getSharedPreferences("apprater", 0);
if (prefs.getBoolean("dontshowagain", false)) { return ; }
SharedPreferences.Editor editor = prefs.edit();
// Increment launch counter
long launch_count = prefs.getLong("launch_count", 0) + 1;
editor.putLong("launch_count", launch_count);
// Get date of first launch
Long date_firstLaunch = prefs.getLong("date_firstlaunch", 0);
if (date_firstLaunch == 0) {
date_firstLaunch = System.currentTimeMillis();
editor.putLong("date_firstlaunch", date_firstLaunch);
}
// Wait at least n days before opening
if (launch_count >= LAUNCHES_UNTIL_PROMPT) {
if (System.currentTimeMillis() >= date_firstLaunch +
(DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000)) {
showRateDialog(mContext, editor);
}
}
editor.commit();
}
It is working fine.But my problem is if I give LAUNCHES_UNTIL_PROMPT is 3 then the dialog will appear on 4th launch and user gave his rating, then 5 time again dialog launches..every time the dialog launches. So it is disgusting for users. If the user rated the app then no need to 'rate the app' again until the next version relese
PS: It is helpful to do something to launch apprater whenever a new version of app is released.

Include options in the dialog to "rate now" "rate later" and "no thanks". If the use clicks "rate now" update preferences to not show the dialog again. If they click "rate later" simply reset your counts and prompt them again after another three launches. And if "no thanks" then simply update preferences to indicate the dialog should not be shown again.

There is no way to check if a user has rated your app on Google Play, as developers may use it to incentivise certain things.

I found this answer some time ago and used it on one of my apps and had the same problem as yours.
I would suggest modifying your showRateDialog function to the following:
Button b1 = new Button(mContext);
b1.setText("Rate " + APP_TITLE);
b1.setOnClickListener(new OnClickListener() {
// If Rate <your app> is selected, set dontshowagain field to true
// and you will never see it again
public void onClick(View v) {
mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + APP_PNAME)));
if (editor != null) {
editor.putBoolean("dontshowagain", true);
editor.commit();
}
dialog.dismiss();
}
});
ll.addView(b1);
Button b2 = new Button(mContext);
b2.setText("Remind me later");
b2.setOnClickListener(new OnClickListener() {
// If "Remind me later" is clicked, reset everything until requisite
// number of launches or days since first launch
public void onClick(View v) {
if (editor != null) {
editor.putLong("lLaunchCount", 0);
editor.putLong("lDateFirstLaunch", 0);
editor.commit();
}
dialog.dismiss();
}
});
ll.addView(b2);
Button b3 = new Button(mContext);
b3.setText("No, thanks");
b3.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (editor != null) {
editor.putBoolean("dontshowagain", true);
editor.commit();
}
dialog.dismiss();
}
});
ll.addView(b3);
dialog.setContentView(ll);
dialog.show();

Related

how to add counter in android studio to quit an application

I am getting an error when I set the counter to subtract and close the application. I get an error "cannot assign value to final variable counter". If the user logins in 3 times with no success quit the application.
final int counter = 3;
//Set the OKButton to accept onClick
OKButton.setOnClickListener(new View.OnClickListener() {
#Override
//once onClick is initalized it takes user to page menu
public void onClick(View v) {
//display text that was inputed for userText and passText
user = userText.getText().toString();
pass = passText.getText().toString();
//create if loop which checks if user and pass equals the credentials
if (user.equals("pshivam") && pass.equals("Bway.857661")) {
//display toast access welcome
String welcome = "Access Granted.";
//Create a Toast to display the welcome string in the MainActivity.
Toast.makeText(MainActivity.this, welcome, Toast.LENGTH_SHORT).show();
setContentView(R.layout.account_main);
}
//create else if loop which checks if user or pass does not equals the credentials
else if (!user.equals("pshivam") || !pass.equals("Bway.857661")){
//displays previous entry
userText.setText(user);
passText.setText(pass);
//allows user to re-enter credentials.
user = userText.getText().toString();
pass = passText.getText().toString();
//display toast access fail
String fail = "Access Denied! Please Try again.";
//Create a Toast to display the fail string in the MainActivity.
Toast.makeText(MainActivity.this, fail, Toast.LENGTH_SHORT).show();
counter--;
if(counter == 0){
finish();
}
}
}
});
}
}
Do something like this :
OKButton.setOnClickListener(new View.OnClickListener() {
int counter = 3;
#Override
//once onClick is initalized it takes user to page menu
public void onClick(View v) {
You can also call a function from inside onClick which will decrement the variable, or use a static field declared in your class
This How to increment a Counter inside an OnClick View Event and How do I use onClickListener to count the number of times a button is pressed? might help.
Edit:
What you are doing in else part doesn't make sense. You are setting text for userText and passText that you just got using getText() from these. Then you are storing these same values to user and pass. But you aren't using these variables anywhere and they get new values when onClick is called again. Why not keep it simple :
else {
//display toast access fail
String fail = "Access Denied! Please Try again.";
//Create a Toast to display the fail string in the MainActivity.
Toast.makeText(MainActivity.this, fail, Toast.LENGTH_SHORT).show();
counter--;
if(counter == 0){
finish();
}
}

How do i get android to wait for text input?

checkbutton.setOnClickListener(
new Button.OnClickListener(){
public void onClick(View v){
questionbox.setText("What is 2 + 2");
if(answerbox.getText().equals("4")){
questionbox.setText("good job");
}
else {
questionbox.setText("nope");
}
}
);
*Every time I run the program it automatically checks without waiting on user input, how would I be able to make it wait/allow the user to input some text before testing the user input *
Move questionbox.setText("What is 2 + 2"); to outside of checkbox setOnClickListener
questionbox.setText("What is 2 + 2");
checkbutton.setOnClickListener(
new Button.OnClickListener(){
public void onClick(View v){
if(answerbox.getText().equals("4")){
questionbox.setText("good job");
}
else {
questionbox.setText("nope");
}
}
);
Then when you run the app first user can see the question content
After that, user can enter the answer
Then user tap on check button and you will test the result

Add a value to a list everytime the user answers correctly

I have a code written where a user has to answer a question true or false. What I want to do is everytime when a user answers correctly I add +1 to my arraylist. And then at the end of the game I display the number of answered questions. I tried to do it my way, however I get an error.
Here is how I create my list:
final ArrayList<Integer> points = new ArrayList<Integer>();
This is the button if the user presses True(For better understanding: When a user presses true a pop up window opens with the answer correct or false and the correct answer of the question. When the user clicks on the closepopup button an if method runs and checks if he pressed the right button and if its not the last question. If not, it shows the next question and adds the +1 to the list):
mYes.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
initiatePopupWindow();
if(type.get(count[0])){
((TextView)pwindo.getContentView().findViewById(R.id.popupTekstasTiesaArNe)).setText("Correct!");
} else {
((TextView)pwindo.getContentView().findViewById(R.id.popupTekstasTiesaArNe)).setText("False!");
}
//Show the first answer on first button click.
((TextView)pwindo.getContentView().findViewById(R.id.popupTekstas)).setText(questions.get((count[0]) % questions.size()).answer);
// When PopUp button closes open the next question with the if/else conditions.
btnClosePopup.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
//if the question is true show next question/ else close app
if (type.get(count[0])) {
points.add(1); // if the answer is correct add +1 to the list.
if(questions.size()-1 == count[0]) // if you count[0] is init to 0
{
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("WInner");
builder.setMessage("You won, play again?");
builder.setCancelable(false);
builder.setPositiveButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// just close dialog
dialog.cancel();
}
});
builder.setNegativeButton(android.R.string.no,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
mResult.setText(points.size());// here I try to print the number of answered questions.
}
});
// Create dialog from builder
AlertDialog alert = builder.create();
// Show dialog
alert.show();
count[0]=0;
}
else if(questions.size()-1 < count[0])
try {
throw new Exception("Invalid ");
} catch (Exception e) {
e.printStackTrace();
}
else
count[0]++;
mQuestion.setText(questions.get(count[0]).question); // you dont need calculate the module anymore
pwindo.dismiss();
} else {
count[0]++;
mQuestion.setText(questions.get(count[0]).question); // you dont need calculate the module anymore
pwindo.dismiss();
}
}
});
}
});
EDITED!!!
I figured out why SetText shows a blank textview. I want to show the answered question count in activity before the questions. I have a menuActivity>LevelselectActivity>GameActivity. In game activity I add to the list values. How to post them in LevelselectActivity? Should I use shared preferences? I have no idea now..

Show DialogBox in loop in android

I am trying to show dialog boxes with contents from the database .The fetched data from the database may contain more than 1 data.So I have to show dialog in for loop.But the dialog shows only for the first row in the database.Here is the code
cursor = sqldb.query(Database_Handler.dbdectab, null,"((" + Database_Handler.gendtime + "<='" + after_1hr + "' and " + Database_Handler.gendtime + ">='" + before_1hr + "') and ("
+ Database_Handler.calused + "='Gregorian' or " + Database_Handler.calused + "='both')) ", null, null, null, null);
notif_count = cursor.getCount();
//dec_name_ctr_builder = new StringBuilder("");
if(notif_count>0)
{
dialog1 = new Dialog(this);
cursor.moveToFirst();
do
{
dec_name =cursor.getString(cursor.getColumnIndex(Database_Handler.decname));
dialog1.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog1.setContentView(R.layout.custom_dialog_alert);
TextView tv_alert = (TextView)dialog1.findViewById(R.id.txt_alert);
tv_alert.setText( dec_name );
Button yes = (Button) dialog1.findViewById(R.id.btn_yes);
Button no = (Button) dialog1.findViewById(R.id.btn_no);
yes.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(donateurl));
startActivity(intent);
dialog1.dismiss();
cursor.close();
sqldb.close();
finish();
}
});
no.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
dialog1.dismiss();
cursor.close();
sqldb.close();
finish();
}
});
dialog1.show();
}while(cursor.moveToNext());
Android dialog boxes are not modal (which is to say, they don't block the background processes).Hence your work is done asycnhronuosly and according to :
Romain guy
We've designed Android to prevent developers from writing synchronous dialogs so you don't really have much of a choice.
SO you can not block the while loop execution in between using Dialog.
Karan_Rana is right. The simplest solution for your answer would be storing the results somewhere else and displaying a new dialog each time some data is left and user clicks on a previous dialogs button.
I know this is a bit late, but I had a similar problem once. I used recursion to loop a dialog box. My situation was unique as I needed to detect an internet connection during app startup. So, this approach may not work for you. But I was able to implement the solution without for loops and blocking the main UI thread. Because I was on a splash screen, there was no other UI I needed to contend so I would simple call the dialog box again until the user chooses to "Quit".
I had a splash screen that would only continue to the landing activity of the app if a network connection was detected.
Sample code below to demonstrate the concept. Note that there are custom methods, but you should get the idea to call the prompt again from within onClick method.
protected void onCreate(Bundle savedInstanceState) {
if (isNetworkAvailable()) {
launchApp();
} else {
retryPrompt();
}
}
private void retryPrompt() {
if (isNetworkAvailable()) {
launchApp();
} else {
final ConfirmDialog dialog = new ConfirmDialog.CustomAlertBuilder(this,
"Internet Connection",
"Internet Connection not detected. Please check your connection.",
"Retry").
setNegBtnLabel("Quit").
setCustomCallback(new CustomDialogCallback() {
#Override
public void onClickPositiveBtn(DialogInterface dialogInterface, int which) {
// go around again.
retryPrompt(); // <<== Call method recursively
}
#Override
public void onClickNegativeBtn(DialogInterface dialogInterface, int which) {
// abort app.
finish();
}
}).build();
dialog.show();
}
}

Android approach for "Rate my application" [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 7 years ago.
Improve this question
Is there a best practice approach to prompt Android users to rate your application? Considering they could acquire it from Amazon.com or Google Marketplace what is the best route to handle this in a way that allows users to vote?
For Google Marketplace, take a look at this neat code snippet. I'm sure you can modify it to launch the Amazon Appstore instead or in addition to.
EDIT: Looks like the site changed their URL structure so I've updated the link above so it works now. Here is an old copy at the Wayback Machine in case their site goes down again. I will paste the main contents of the post below as an additional backup but you still might want to visit the link to read the comments and get any updates.
This code prompts engaged users to rate your app in the Android market (inspired by iOS Appirater). It requires a certain number of launches of the app and days since the installation before the rating dialog appears.
Adjust APP_TITLE and APP_PNAME to your needs. You should also tweak DAYS_UNTIL_PROMPT and LAUNCHES_UNTIL_PROMPT.
To test it and to tweak the dialog appearance, you can call AppRater.showRateDialog(this, null) from your Activity. Normal use is to invoke AppRater.app_launched(this) each time your activity is invoked (eg. from within the onCreate method). If all conditions are met, the dialog appears.
public class AppRater {
private final static String APP_TITLE = "YOUR-APP-NAME";
private final static String APP_PNAME = "YOUR-PACKAGE-NAME";
private final static int DAYS_UNTIL_PROMPT = 3;
private final static int LAUNCHES_UNTIL_PROMPT = 7;
public static void app_launched(Context mContext) {
SharedPreferences prefs = mContext.getSharedPreferences("apprater", 0);
if (prefs.getBoolean("dontshowagain", false)) { return ; }
SharedPreferences.Editor editor = prefs.edit();
// Increment launch counter
long launch_count = prefs.getLong("launch_count", 0) + 1;
editor.putLong("launch_count", launch_count);
// Get date of first launch
Long date_firstLaunch = prefs.getLong("date_firstlaunch", 0);
if (date_firstLaunch == 0) {
date_firstLaunch = System.currentTimeMillis();
editor.putLong("date_firstlaunch", date_firstLaunch);
}
// Wait at least n days before opening dialog
if (launch_count >= LAUNCHES_UNTIL_PROMPT) {
if (System.currentTimeMillis() >= date_firstLaunch +
(DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000)) {
showRateDialog(mContext, editor);
}
}
editor.commit();
}
public static void showRateDialog(final Context mContext, final SharedPreferences.Editor editor) {
final Dialog dialog = new Dialog(mContext);
dialog.setTitle("Rate " + APP_TITLE);
LinearLayout ll = new LinearLayout(mContext);
ll.setOrientation(LinearLayout.VERTICAL);
TextView tv = new TextView(mContext);
tv.setText("If you enjoy using " + APP_TITLE + ", please take a moment to rate it. Thanks for your support!");
tv.setWidth(240);
tv.setPadding(4, 0, 4, 10);
ll.addView(tv);
Button b1 = new Button(mContext);
b1.setText("Rate " + APP_TITLE);
b1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + APP_PNAME)));
dialog.dismiss();
}
});
ll.addView(b1);
Button b2 = new Button(mContext);
b2.setText("Remind me later");
b2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
ll.addView(b2);
Button b3 = new Button(mContext);
b3.setText("No, thanks");
b3.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (editor != null) {
editor.putBoolean("dontshowagain", true);
editor.commit();
}
dialog.dismiss();
}
});
ll.addView(b3);
dialog.setContentView(ll);
dialog.show();
}
}
Uri uri = Uri.parse("market://details?id=" + context.getPackageName());
Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
try {
context.startActivity(goToMarket);
} catch (ActivityNotFoundException e) {
UtilityClass.showAlertDialog(context, ERROR, "Couldn't launch the Google Playstore app", null, 0);
}
You could also use RateMeMaybe: https://github.com/Kopfgeldjaeger/RateMeMaybe
It gives you quite some options to configure (minimum of days/launches until first prompt, minimum of days/launches until each next prompt if user chooses "not now", dialog title, message etc.). It is also easy to use.
Example usage from README:
RateMeMaybe rmm = new RateMeMaybe(this);
rmm.setPromptMinimums(10, 14, 10, 30);
rmm.setDialogMessage("You really seem to like this app, "
+"since you have already used it %totalLaunchCount% times! "
+"It would be great if you took a moment to rate it.");
rmm.setDialogTitle("Rate this app");
rmm.setPositiveBtn("Yeeha!");
rmm.run();
Edit: If you want to only show the prompt manually, you can also just use the RateMeMaybeFragment
if (mActivity.getSupportFragmentManager().findFragmentByTag(
"rmmFragment") != null) {
// the dialog is already shown to the user
return;
}
RateMeMaybeFragment frag = new RateMeMaybeFragment();
frag.setData(getIcon(), getDialogTitle(), getDialogMessage(),
getPositiveBtn(), getNeutralBtn(), getNegativeBtn(), this);
frag.show(mActivity.getSupportFragmentManager(), "rmmFragment");
getIcon() can be replaced with 0 if you don't want to use one; the rest of the getX calls can be replaced with Strings
Changing the code to open the Amazon Marketplace should be easy
Maybe set up a Facebook link to a fan page with "like" options and so forth? An icon with a small label on the main menu would nicely sufficient and not as annoying, if at all, as a pop up reminder.
Just write these two lines of code under your "Rank this Apps" button and it will take you to the Google store where you have uploaded your app.
String myUrl ="https://play.google.com/store/apps/details?id=smartsilencer";
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(myUrl)));
I think, redirecting users to your app's web page is the only solution here.
Play store policy says that if we notify users to perform some action in our app, then we must also let users cancel the operation if the user doesn’t want to perform that action. So if we ask users to update the app or rate the app on the Play store with Yes(Now), then we must also give an option for No(Later, Not Now), etc.
rateButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
r.showDefaultDialog();
}
});
where r is a class which contain showDefaultDialog method
public void showDefaultDialog() {
//Log.d(TAG, "Create default dialog.");
String title = "Enjoying Live Share Tips?";
String loveit = "Love it";
String likeit = "Like it";
String hateit = "Hate it";
new AlertDialog.Builder(hostActivity)
.setTitle(title)
.setIcon(R.drawable.ic_launcher)
//.setMessage(message)
.setPositiveButton(hateit, this)
.setNegativeButton(loveit, this)
.setNeutralButton(likeit, this)
.setOnCancelListener(this)
.setCancelable(true)
.create().show();
}
To download a full example[androidAone]:http://androidaone.com/11-2014/notify-users-rate-app-playstore/
for simple solution try this library
https://github.com/kobakei/Android-RateThisApp
you can also change its configuration like criteria to show dialog , title , message
In any event :eg button
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData
(Uri.parse("market://details?id="+context.getPackageName()));
startActivity(intent);

Categories

Resources