¿Cómo puedo usar la versión paga de mi aplicación como una “clave” para la versión gratuita?

Digamos, por ejemplo, que tengo alguna aplicación de Android que hace X. La versión gratuita tiene anuncios o funciones básicas. Quiero tener una versión paga que elimine los anuncios y agregue características adicionales.

¿Cómo puedo usar la aplicación de pago como una “clave de licencia” para desbloquear las funciones en la aplicación gratuita?

Entonces el usuario instalaría la aplicación gratuita, luego instalaría la aplicación de pago para obtener las características adicionales, pero aún así ejecutarían la aplicación gratuita (que ahora estaría desbloqueada). ¿Cuál es el mejor enfoque para hacer esto?

Use PackageManager para asegurarse de que su paquete pagado esté instalado. Y asegúrese de que su firma de paquete gratis coincida con la firma del paquete premium instalado. De lo contrario, alguien podría instalar la aplicación sin firmar con el nombre del paquete que coincida con su nombre de paquete pagado y desbloquear la prima de esta manera.

Esta publicación puede ayudarte a encontrar tu firma Detectar si la aplicación se descargó de Android Market

Estoy usando esto:

PackageManager manager = getPackageManager(); if (manager.checkSignatures("core.package.name", "key.package.name") == PackageManager.SIGNATURE_MATCH) { //full version } 

Es bastante simple y funciona.

Aquí hay una función simple que verifica la presencia de la clave Pro y verifica que la firma del paquete coincida con la versión gratuita:

 protected static boolean isProInstalled(Context context) { PackageManager manager = context.getPackageManager(); if (manager.checkSignatures(context.getPackageName(), "com.your.pro.key") == PackageManager.SIGNATURE_MATCH) { //Pro key installed, and signatures match return true; } return false; } 

El código es de esta publicación en el foro , basado en el método descrito en yoki.org .

Como alguien más señaló, sí, puede usar PackageManager para detectar la presencia de la aplicación ‘clave’ de pago, pero eso es problemático si alguien solo instala la versión paga, desinstala la versión gratuita, etc. Los usuarios pueden molestarse por tener que mantener alrededor de dos descargas para que funcione su única aplicación. FWIW, creo que DoubleTwist Air Sync lo hace de esta manera. Estoy bastante seguro de que la aplicación Air Sync no hace nada excepto habilitar la funcionalidad en la aplicación gratuita DoubleTwist.

Una ruta más práctica podría ser tener dos aplicaciones separadas, y luego otorgar la capacidad de importar datos y preferencias de uno a otro utilizando un ContentProvider y / o sharedUserId . A continuación, puede compartir la mayor parte de su código con un proyecto de biblioteca compartida . Sin embargo, esto significa que ambas aplicaciones necesitan usar un URI de contenido diferente, ya que dos aplicaciones no pueden usar la misma autorización, lo cual es un poco molesto, porque el código de su biblioteca compartida no puede tener un campo estático CONTENT_URI o AUTHORITY como el que normalmente encontrar en una implementación ContentProvider.

Estoy empezando a pensar que dos aplicaciones separadas con dos bases de datos más o menos separadas es el camino a seguir, porque copiar el código entre dos proyectos podría ser más fácil que tratar de mantener una biblioteca compartida con todo tipo de conmutadores para habilitar o deshabilitar características entre una versión gratuita y de pago.

En realidad, la recomendación de edgman de usar una sola aplicación y usar licencias es probablemente la mejor manera de administrar una versión gratuita y de pago de una aplicación. Resuelve todos los problemas enumerados anteriormente, aunque para ser justos, aún no he usado licencias.

La licencia de EDITAR parece estar permitida solo para aplicaciones pagas (bummer) por lo que es un no-go si quieres ofrecer una versión gratuita. Sin embargo , la facturación en la aplicación podría ser la forma “correcta” de administrar una versión gratuita / pagada. Tal vez está bien para el OP, pero no tengo ganas de requerir dos aplicaciones para que siempre se instale en el dispositivo de un usuario es ideal. Si un usuario que paga instala la aplicación en un dispositivo nuevo, parece que es posible descargar transacciones anteriores para que no tenga que pagar dos veces.

Siempre que ambas aplicaciones sean del mismo desarrollador y estén firmadas por la misma clave, deberían poder compartir información de forma privada. Probablemente pueda usar un archivo (almacenado con MODE_PRIVATE), pero creo que la ruta más fácil es usar SharedPreferences: establezca un indicador en la aplicación de pago que será leído por el gratuito. Ver http://developer.android.com/guide/topics/data/data-storage.html . No tengo idea de si sería fácil eludirlo, especialmente en dispositivos rooteados …

Otra forma sería verificar si la aplicación paga está instalada, por ejemplo, verificando si acepta un Intento específico. Ver también: http://developer.android.com/resources/articles/can-i-use-this-intent.html ; en ese ejemplo comprueban si el escáner de código de barras de ZXing está disponible de esa manera.

En cualquier caso, otro giro en la idea sería que podría “habilitar” múltiples aplicaciones con solo un pago, si así lo desea. Su aplicación paga sería un simple “soporte para este desarrollador” que eliminaría los anuncios de todas sus aplicaciones. Es un modelo de pago interesante en mi humilde opinión.

¿Qué es lo que hace al distribuir solo una aplicación gratuita / demo e implementarla en la aplicación para que sea profesional? Por lo tanto, solo habrá que instalar un usuario de la aplicación, podrán probar las funciones básicas y habrá un botón como “actualizar a $ 1,99 pro” que incluirá la compra desde la aplicación.

Aquí hay un ejemplo de cómo se puede hacer:

 Intent unlockerAppPresence = null; APP_LITE_VERSION = false; try { unlockerAppPresence = context.getPackageManager().getLaunchIntentForPackage("nameofthepackagethatunlockyoursoftware"); } catch (Exception e1) { APP_LITE_VERSION = true; } if (unlockerAppPresence == null) APP_LITE_VERSION = true; 

Combine esto con la comprobación de la firma del desarrollador de la aplicación (como lo señala @Fedor) y debería estar listo para comenzar.

Aparentemente no puedo comentar sin 50 reputación, así que pondré esto en su propia respuesta.

El método PackageManager citado por otros parece una forma sencilla y agradable de hacerlo, pero como menciona hackbod, tener dos aplicaciones instaladas es molesto (y un poco confuso) para el usuario.

Sin embargo, y no lo he intentado porque aún no publiqué mi aplicación, parece que podría mantener una variable que comienza como falsa y luego se actualiza a verdadera si encuentra la versión Pro instalada. La variable no volvería a ser falsa solo porque la versión Pro no está allí. Luego, puede informar al usuario en ambas versiones que necesitan instalar Pro, luego abrir la Prueba y hacer clic en Desbloquear. Una vez hecho esto, la versión de prueba se convertirá en una versión completa y le informará (si encontró la versión Pro instalada) que ahora puede desinstalar la versión Pro y continuará teniendo acceso completo.

Algo así como esto:

 String msg = ""; boolean sigMatch = isProInstalled(context); if (unlocked) { // If you get here by clicking a button that goes away once the app is unlocked, then you may never see this. Still, better safe than sorry. msg += "Thanks! You already have access to the full game."; } else { if (sigMatch) { unlocked = true; saveData(); // I assume you already know how to store variables. msg += "Unlock successful. You now have access to the full game." } else { msg += "You are using a Trial version of this game. (blah, blah). To unlock the full version, please purchase XYZ Pro. Install the application and then start this application again and go into this screen again. You should get a message letting you know that the app has been successfully unlocked, after which you may uninstall the Pro version. You do not have to keep it on your device after unlocking the game."; } } if (sigMatch) { msg += " If you like, you may now uninstall the Pro application. You will continue to have full access to XYZ."; } 

Ahora bien, esto no le puede decir si el usuario pagó la versión Pro y luego la devolvió en 24 horas, como ha mencionado también hackbod. ** Pero parece que este escenario podría no ocurrir muy a menudo. Si alguien pagó y luego lo devolvió (especialmente si no está cobrando mucho), entonces probablemente decidieron dejar de usar la aplicación … o están intentando robarla, en cuyo caso hay otras maneras de hacerlo de todos modos. Si le preocupa esta posibilidad, la facturación en la aplicación puede ser su mejor opción. Pero si solo está buscando una medida simple para mantener alejado al usuario ocasional, y no quiere forzarlos a mantener dos aplicaciones instaladas para siempre, entonces esta podría ser una opción.

** Supongo que puede mantener una marca de tiempo con otra variable y requerir que el usuario mantenga la versión Pro instalada hasta algunas horas después de esa marca de tiempo, ENTONCES permita que se desinstale …

La ruta que toman la mayoría de los desarrolladores de aplicaciones es tener solo una versión de la aplicación, pero las características están habilitadas (extras) o desactivadas (anuncios) en función de la presencia de la “clave de licencia”.