studio samsung que puedo pueden programacion por pasar otro móviles lista fabrica desarrollo curso como celular borrar aplicaciones android google-play

samsung - Cómo implementar la función Rate It en la aplicación de Android



programacion android pdf 2018 (9)

Estoy desarrollando una aplicación para Android. En el que todo funciona bien. Mi aplicación está lista para lanzar. Pero ahí necesito implementar una característica más. Necesito mostrar una ventana emergente que contiene

Rate It y Remind me later

Aquí, si algún usuario califica la aplicación en el mercado, la ventana emergente no desaparecerá. He buscado en Google y he encontrado un link . Con esto entiendo que no es posible saberlo. Así que necesito una sugerencia para esto.

¿Alguien ha enfrentado esta situación antes? Si es así, ¿hay alguna solución o alternativa para esto?


Como se ve en la otra publicación que ha vinculado, no hay una manera de que la aplicación sepa si el usuario ha dejado una revisión o no. Y por una buena razón.

Piénselo, si una aplicación pudiera decir si el usuario ha dejado una revisión o no, el desarrollador podría restringir ciertas funciones que solo se desbloquearían si el usuario deja una calificación de 5/5. Esto llevaría a los otros usuarios de Google Play a no confiar en las revisiones y socavaría el sistema de calificación.

Las soluciones alternativas que he visto es que la aplicación le recuerda al usuario que envíe una calificación cada vez que la aplicación se abra un número específico de veces, o un intervalo establecido. Por ejemplo, cada 10 veces que se abre la aplicación, pídale al usuario que deje una calificación y proporcione un botón "ya hecho" y "recordarme más tarde". Siga mostrando este mensaje si el usuario ha elegido recordárselo más tarde. Algunos otros desarrolladores de aplicaciones muestran este mensaje con un intervalo cada vez mayor (como 5, 10, 15ª vez que se abre la aplicación), porque si un usuario no ha dejado una revisión en, por ejemplo, la 100ª vez que se abrió la aplicación, es Probablemente él / ella no dejará uno.

Esta solución no es perfecta, pero creo que es lo mejor que tienes por ahora. Lo lleva a confiar en el usuario, pero se da cuenta de que la alternativa significaría una experiencia potencialmente peor para todos en el mercado de aplicaciones.


Creo que lo que estás tratando de hacer es probablemente contraproducente.

Facilitar a las personas la calificación de aplicaciones es generalmente una buena idea, ya que la mayoría de las personas que se molestan lo hacen porque les gusta la aplicación. Se rumorea que la cantidad de calificaciones afecta su calificación de mercado (aunque veo poca evidencia de esto). Acostar a los usuarios a la calificación, a través de pantallas molestas, es probable que haga que las personas la despejen y dejen una mala calificación.

Añadir la capacidad para calificar directamente una aplicación ha provocado una ligera disminución en las calificaciones numéricas para mi versión gratuita y un ligero aumento en mi aplicación de pago. Para la aplicación gratuita, mis calificaciones de 4 estrellas aumentaron más que mis calificaciones de 5 estrellas, ya que las personas que pensaron que mi aplicación era buena pero no excelente comenzaron a calificarla también. El cambio fue de alrededor de -0.2. Para los pagados, el cambio fue de +0.1. Debería eliminarlo de la versión gratuita, excepto que me gusta recibir muchos comentarios.

Pongo mi botón de calificación en una pantalla de configuración (preferencia), donde no afecta el funcionamiento normal. Todavía aumentó mi índice de calificación en un factor de 4 o 5. No tengo ninguna duda de que si intentara convencer a mis usuarios para que realicen una calificación, obtendría muchos usuarios que me daban malas calificaciones como protesta.


Esta solución es muy similar a las presentadas anteriormente. La única diferencia es que podrá retrasar el aviso del cuadro de diálogo de clasificación por lanzamientos y días. Si se presiona el botón Recordar más tarde, retrasaré la ventana emergente durante 3 días y 10 inicios. Lo mismo se hace para aquellos que lo seleccionaron para calificarlo, sin embargo, los retrasos son más largos (no molesta al usuario tan pronto en caso de que haya calificado la aplicación. Esto se puede cambiar para que no se muestre nuevamente, entonces tendrá que alterar el código a su gusto). Espero que ayude a alguien!

public class AppRater { private final static String APP_TITLE = "your_app_name"; private static String PACKAGE_NAME = "your_package_name"; private static int DAYS_UNTIL_PROMPT = 5; private static int LAUNCHES_UNTIL_PROMPT = 10; private static long EXTRA_DAYS; private static long EXTRA_LAUCHES; private static SharedPreferences prefs; private static SharedPreferences.Editor editor; private static Activity activity; public static void app_launched(Activity activity1) { activity = activity1; Configs.sendScreenView("Avaliando App", activity); PACKAGE_NAME = activity.getPackageName(); prefs = activity.getSharedPreferences("apprater", Context.MODE_PRIVATE); if (prefs.getBoolean("dontshowagain", false)) return; editor = prefs.edit(); EXTRA_DAYS = prefs.getLong("extra_days", 0); EXTRA_LAUCHES = prefs.getLong("extra_launches", 0); // 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 + EXTRA_LAUCHES)) if (System.currentTimeMillis() >= date_firstLaunch + (DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000) + EXTRA_DAYS) showRateDialog(); editor.commit(); } public static void showRateDialog() { final Dialog dialog = new Dialog(activity); dialog.setTitle("Deseja avaliar o aplicativo " + APP_TITLE + "?"); LinearLayout ll = new LinearLayout(activity); ll.setOrientation(LinearLayout.VERTICAL); ll.setPadding(5, 5, 5, 5); TextView tv = new TextView(activity); tv.setTextColor(activity.getResources().getColor(R.color.default_text)); tv.setText("Ajude-nos a melhorar o aplicativo com sua avaliação no Google Play!"); tv.setWidth(240); tv.setGravity(Gravity.CENTER); tv.setPadding(5, 5, 5, 5); ll.addView(tv); Button b1 = new Button(activity); b1.setTextColor(activity.getResources().getColor(R.color.default_text)); b1.setBackground(activity.getResources().getDrawable(R.drawable.rounded_blue_box)); b1.setTextColor(Color.WHITE); b1.setText("Avaliar aplicativo " + APP_TITLE + "!"); b1.setOnClickListener(new OnClickListener() { public void onClick(View v) { Configs.sendHitEvents(Configs.APP_RATER, Configs.CATEGORIA_ANALYTICS, "Clique", "Avaliar", activity); activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + PACKAGE_NAME))); delayDays(60); delayLaunches(30); dialog.dismiss(); } }); ll.addView(b1); LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) b1.getLayoutParams(); params.setMargins(5, 3, 5, 3); b1.setLayoutParams(params); Button b2 = new Button(activity); b2.setTextColor(activity.getResources().getColor(R.color.default_text)); b2.setBackground(activity.getResources().getDrawable(R.drawable.rounded_blue_box)); b2.setTextColor(Color.WHITE); b2.setText("Lembre-me mais tarde!"); b2.setOnClickListener(new OnClickListener() { public void onClick(View v) { Configs.sendHitEvents(Configs.APP_RATER, Configs.CATEGORIA_ANALYTICS, "Clique", "Avaliar Mais Tarde", activity); delayDays(3); delayLaunches(10); dialog.dismiss(); } }); ll.addView(b2); params = (LinearLayout.LayoutParams) b2.getLayoutParams(); params.setMargins(5, 3, 5, 3); b2.setLayoutParams(params); Button b3 = new Button(activity); b3.setTextColor(activity.getResources().getColor(R.color.default_text)); b3.setBackground(activity.getResources().getDrawable(R.drawable.rounded_blue_box)); b3.setTextColor(Color.WHITE); b3.setText("Não, obrigado!"); b3.setOnClickListener(new OnClickListener() { public void onClick(View v) { Configs.sendHitEvents(Configs.APP_RATER, Configs.CATEGORIA_ANALYTICS, "Clique", "Não Avaliar", activity); if (editor != null) { editor.putBoolean("dontshowagain", true); editor.commit(); } dialog.dismiss(); } }); ll.addView(b3); params = (LinearLayout.LayoutParams) b3.getLayoutParams(); params.setMargins(5, 3, 5, 0); b3.setLayoutParams(params); dialog.setContentView(ll); dialog.show(); } private static void delayLaunches(int numberOfLaunches) { long extra_launches = prefs.getLong("extra_launches", 0) + numberOfLaunches; editor.putLong("extra_launches", extra_launches); editor.commit(); } private static void delayDays(int numberOfDays) { Long extra_days = prefs.getLong("extra_days", 0) + (numberOfDays * 1000 * 60 * 60 * 24); editor.putLong("extra_days", extra_days); editor.commit(); } }

Los botones tienen un color y un fondo específicos. El fondo es como se muestra en este archivo xml:

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:padding="10dp" android:shape="rectangle" > <solid android:color="#2E78B9" /> <corners android:bottomLeftRadius="6dp" android:bottomRightRadius="6dp" android:topLeftRadius="6dp" android:topRightRadius="6dp" /> </shape>

Fuente: enfoque de Android para "Calificar mi aplicación"



Implementé esto hace un tiempo, hasta cierto punto. Es imposible saber si un usuario ha calificado o no una aplicación, para evitar que las calificaciones se conviertan en una moneda (algunos desarrolladores pueden agregar una opción como "Calificar esta aplicación y obtener tal cosa en la aplicación de forma gratuita").

La clase que escribí proporciona tres botones y configura el cuadro de diálogo para que solo se muestre después de que la aplicación se haya lanzado n veces (los usuarios tienen una mayor posibilidad de calificar la aplicación si la han usado un poco antes. La mayoría de ellos lo son. Es poco probable que sepan lo que hace en la primera ejecución):

public class AppRater { private final static String APP_TITLE = "App Name";// App Name private final static String APP_PNAME = "com.example.name";// Package Name private final static int DAYS_UNTIL_PROMPT = 3;//Min number of days private final static int LAUNCHES_UNTIL_PROMPT = 3;//Min number of launches 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(); } 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(); } }

Integrar la clase es tan simple como agregar:

AppRater.app_launched(this);

A tu actividad. Solo se debe agregar a una actividad en toda la aplicación.


Mi uno usando DialogFragment:

public class RateItDialogFragment extends DialogFragment { private static final int LAUNCHES_UNTIL_PROMPT = 10; private static final int DAYS_UNTIL_PROMPT = 3; private static final int MILLIS_UNTIL_PROMPT = DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000; private static final String PREF_NAME = "APP_RATER"; private static final String LAST_PROMPT = "LAST_PROMPT"; private static final String LAUNCHES = "LAUNCHES"; private static final String DISABLED = "DISABLED"; public static void show(Context context, FragmentManager fragmentManager) { boolean shouldShow = false; SharedPreferences sharedPreferences = getSharedPreferences(context); SharedPreferences.Editor editor = sharedPreferences.edit(); long currentTime = System.currentTimeMillis(); long lastPromptTime = sharedPreferences.getLong(LAST_PROMPT, 0); if (lastPromptTime == 0) { lastPromptTime = currentTime; editor.putLong(LAST_PROMPT, lastPromptTime); } if (!sharedPreferences.getBoolean(DISABLED, false)) { int launches = sharedPreferences.getInt(LAUNCHES, 0) + 1; if (launches > LAUNCHES_UNTIL_PROMPT) { if (currentTime > lastPromptTime + MILLIS_UNTIL_PROMPT) { shouldShow = true; } } editor.putInt(LAUNCHES, launches); } if (shouldShow) { editor.putInt(LAUNCHES, 0).putLong(LAST_PROMPT, System.currentTimeMillis()).commit(); new RateItDialogFragment().show(fragmentManager, null); } else { editor.commit(); } } private static SharedPreferences getSharedPreferences(Context context) { return context.getSharedPreferences(PREF_NAME, 0); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setTitle(R.string.rate_title) .setMessage(R.string.rate_message) .setPositiveButton(R.string.rate_positive, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + getActivity().getPackageName()))); getSharedPreferences(getActivity()).edit().putBoolean(DISABLED, true).commit(); dismiss(); } }) .setNeutralButton(R.string.rate_remind_later, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dismiss(); } }) .setNegativeButton(R.string.rate_never, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { getSharedPreferences(getActivity()).edit().putBoolean(DISABLED, true).commit(); dismiss(); } }).create(); } }

Luego onCreate() en onCreate() de su FragmentActivity principal:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... RateItDialogFragment.show(this, getFragmentManager()); }




github.com/Vorlonsoft/AndroidRate es una biblioteca que lo ayuda a promocionar su aplicación de Android al pedirles a los usuarios que califiquen la aplicación después de usarla por unos días.

Módulo Gradle:

dependencies { implementation ''com.vorlonsoft:androidrate:1.0.8'' }

MainActivity.java:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AppRate.with(this) .setStoreType(StoreType.GOOGLEPLAY) //default is GOOGLEPLAY (Google Play), other options are // AMAZON (Amazon Appstore) and // SAMSUNG (Samsung Galaxy Apps) .setInstallDays((byte) 0) // default 10, 0 means install day .setLaunchTimes((byte) 3) // default 10 .setRemindInterval((byte) 2) // default 1 .setRemindLaunchTimes((byte) 2) // default 1 (each launch) .setShowLaterButton(true) // default true .setDebug(false) // default false //Java 8+: .setOnClickButtonListener(which -> Log.d(MainActivity.class.getName(), Byte.toString(which))) .setOnClickButtonListener(new OnClickButtonListener() { // callback listener. @Override public void onClickButton(byte which) { Log.d(MainActivity.class.getName(), Byte.toString(which)); } }) .monitor(); if (AppRate.with(this).getStoreType() == StoreType.GOOGLEPLAY) { //Check that Google Play is available if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) != ConnectionResult.SERVICE_MISSING) { // Show a dialog if meets conditions AppRate.showRateDialogIfMeetsConditions(this); } } else { // Show a dialog if meets conditions AppRate.showRateDialogIfMeetsConditions(this); } }

Las condiciones predeterminadas para mostrar el cuadro de diálogo de velocidad son las siguientes:

  1. La aplicación se lanza más de 10 días después de la instalación. Cambie a través de AppRate#setInstallDays(byte) .
  2. La aplicación se lanza más de 10 veces. Cambiar a través de AppRate#setLaunchTimes(byte) .
  3. La aplicación se inicia más de 1 días después de hacer clic en el botón neutral. Cambie a través de AppRate#setRemindInterval(byte) .
  4. La aplicación se inicia X veces y X% 1 = 0. Cambie a través de AppRate#setRemindLaunchTimes(byte) .
  5. La aplicación muestra un diálogo neutral (Recordármelo más tarde) de forma predeterminada. Cambiar a través de setShowLaterButton(boolean) .
  6. Para especificar la devolución de llamada cuando se presiona el botón. El mismo valor que el segundo argumento de DialogInterface.OnClickListener#onClick pasará en el argumento de onClickButton .
  7. La configuración de AppRate#setDebug(boolean) asegurará que la solicitud de calificación se muestre cada vez que se inicie la aplicación. ¡Esta característica es solo para desarrollo! .

Requisitos de eventos personalizados opcionales para mostrar el diálogo

Puede agregar requisitos opcionales adicionales para mostrar el diálogo. Cada requisito se puede agregar / referenciar como una cadena única. Puede establecer un conteo mínimo para cada evento (por ejemplo, "action_performed" 3 veces, "button_clicked" 5 veces, etc.)

AppRate.with(this).setMinimumEventCount(String, short); AppRate.with(this).incrementEventCount(String); AppRate.with(this).setEventCountValue(String, short);

Borrar marca de diálogo de mostrar

Cuando desee volver a mostrar el cuadro de diálogo, llame a AppRate#clearAgreeShowDialog() .

AppRate.with(this).clearAgreeShowDialog();

Cuando el botón presiona

llame a AppRate#showRateDialog(Activity) .

AppRate.with(this).showRateDialog(this);

Establecer vista personalizada

llame a AppRate#setView(View) .

LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.custom_dialog, (ViewGroup)findViewById(R.id.layout_root)); AppRate.with(this).setView(view).monitor();

Tema especifico

Puedes usar un tema específico para inflar el diálogo.

AppRate.with(this).setThemeResId(int);

Diálogo personalizado

Si desea usar sus propias etiquetas de diálogo, anule los recursos de cadena XML en su aplicación.

<resources> <string name="rate_dialog_title">Rate this app</string> <string name="rate_dialog_message">If you enjoy playing this app, would you mind taking a moment to rate it? It won/'t take more than a minute. Thanks for your support!</string> <string name="rate_dialog_ok">Rate It Now</string> <string name="rate_dialog_cancel">Remind Me Later</string> <string name="rate_dialog_no">No, Thanks</string> </resources>

Comprueba que Google Play está disponible

if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) != ConnectionResult.SERVICE_MISSING) { }