java - tengo - ¿Cómo puedo implementar las licencias de Google Play para una aplicación de Android?
in app billing android studio (1)
Vi las instructions biblioteca de licencias de Android-Developer, pero el resumen parece omitir varios pasos clave en el proceso y no explica completamente cómo hacer que algo funcione.
¿Alguien puede proporcionar un conjunto explícito de operaciones que funcionaron para configurar la biblioteca de licencias en una aplicación de Android para que se asegure de que un usuario haya pagado una aplicación en Google Play antes de permitir su uso?
He estado trabajando en la implementación de licencias en mi aplicación desde hace algún tiempo y, finalmente, la tengo funcionando. Quería compartir algunas de las cosas que encontré útiles para comenzar y algunos problemas y soluciones que encontré con todos. El tutorial de desarrollo de Android que he vinculado a continuación está bien, pero no fue tan útil para mí, así que decidí hacer un tutorial. Disfrútalo, y espero que te ayude!
Enlace a la página del desarrollador here .
1. Empezando
Cosas que necesitarás.
1.1 Su clave de aplicación única Base64
Cómo conseguirlo:
a. Ve a tu consola de desarrolladores. Link.
segundo. Si aún no ha creado un borrador de aplicación para su aplicación, hágalo ahora.
do. Una vez que haya creado el borrador, es una buena idea cargar su .apk
como Alpha o Beta. Déjalo sin publicar.
re. Haga clic en Services & APIs
mi. Desplácese hacia abajo y encuentre YOUR LICENSE KEY FOR THIS APPLICATION
F. Copia la clave en tu aplicación de esta manera:
private static final String BASE64_PUBLIC_KEY = "YOUR LICENSE KEY FOR THIS APPLICATION";
Asegúrate de que no haya espacios.
1.2 una sal
a. ¿Qué es una sal?
Una salt es un dato aleatorio que es una entrada adicional al hashear una contraseña. Se utilizan para defenderse contra ataques de diccionario y ataques de mesa arco iris .
segundo. ¿Cómo consigo uno?
This es un buen enlace para generar una sal aleatoria. Debe haber exactamente 20 enteros aleatorios, por lo tanto, agregue 20
para la cantidad de cadenas aleatorias que se generarán, cada cadena debe tener 2
caracteres de longitud (para este ejemplo, no tiene que serlo). Verifique los dígitos numéricos y verifique que se permitan cadenas idénticas. También pueden ser números negativos. Intente eliminar cualquier redundancia, por ejemplo, 00 -> 0
, por coherencia.
do. ¿Dónde pongo la sal?
Cuando declare variables, simplemente introduzca este código, excepto con su sal aleatoria.
private static final byte[] SALT = new byte[] {YOUR RANDOM SALT, COMMA SEPARATED, 20 INTEGERS};
2. Importar la biblioteca LVL (Licencias) en Eclipse y el código que necesita
2.1 Importando la biblioteca
a. Abre Android SDK Manager
segundo. Ir a Extras
do. Instalar la Google Play Licensing Library
re. Encuentre la ruta de instalación de su SDK
que aparece en la parte superior del administrador de SDK.
mi. Una vez que esté allí, navegue hasta: <sdk>/extras/google/play_licensing
F. En eclipse, haga clic en el file
luego import
, luego en el Existing Android Code Into Workspace
y cuando le pregunte por la ruta del archivo, vaya a la carpeta play_licensing
y haga clic en library
.
sol. Una vez que el proyecto llamado library
se haya importado, haga clic derecho en él y luego en properties
. Haga clic en Android
a la izquierda y navegue hasta la parte inferior y marque la Is Library
, luego presione aplicar. Esto le permite al eclipse saber que puede usar este código de proyecto como una biblioteca.
h. Haga clic derecho en la aplicación a la que está agregando licencias y haga clic en Propiedades, luego presione Android
. Vaya a la parte inferior y haga clic en la library
y agréguela a la ruta de compilación. Esto debería importar la biblioteca a la carpeta de Android Dependencies
.
yo. Su proyecto está configurado para ir al siguiente paso.
2.2 Variables a declarar junto con su SALT
y KEY
private Handler mHandler;
private LicenseChecker mChecker;
private LicenseCheckerCallback mLicenseCheckerCallback;
boolean licensed;
boolean checkingLicense;
boolean didCheck;
2.3 el codigo
Pega este código cerca de la parte inferior de tu aplicación. Esta implementación notificará al usuario si la licencia no es válida y le pedirá que compre la aplicación o la cierre.
private void doCheck() {
didCheck = false;
checkingLicense = true;
setProgressBarIndeterminateVisibility(true);
mChecker.checkAccess(mLicenseCheckerCallback);
}
private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
@Override
public void allow(int reason) {
// TODO Auto-generated method stub
if (isFinishing()) {
// Don''t update UI if Activity is finishing.
return;
}
Log.i("License","Accepted!");
//You can do other things here, like saving the licensed status to a
//SharedPreference so the app only has to check the license once.
licensed = true;
checkingLicense = false;
didCheck = true;
}
@SuppressWarnings("deprecation")
@Override
public void dontAllow(int reason) {
// TODO Auto-generated method stub
if (isFinishing()) {
// Don''t update UI if Activity is finishing.
return;
}
Log.i("License","Denied!");
Log.i("License","Reason for denial: "+reason);
//You can do other things here, like saving the licensed status to a
//SharedPreference so the app only has to check the license once.
licensed = false;
checkingLicense = false;
didCheck = true;
showDialog(0);
}
@SuppressWarnings("deprecation")
@Override
public void applicationError(int reason) {
// TODO Auto-generated method stub
Log.i("License", "Error: " + reason);
if (isFinishing()) {
// Don''t update UI if Activity is finishing.
return;
}
licensed = true;
checkingLicense = false;
didCheck = false;
showDialog(0);
}
}
protected Dialog onCreateDialog(int id) {
// We have only one dialog.
return new AlertDialog.Builder(this)
.setTitle("UNLICENSED APPLICATION DIALOG TITLE")
.setMessage("This application is not licensed, please buy it from the play store.")
.setPositiveButton("Buy", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(
"http://market.android.com/details?id=" + getPackageName()));
startActivity(marketIntent);
finish();
}
})
.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setNeutralButton("Re-Check", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
doCheck();
}
})
.setCancelable(false)
.setOnKeyListener(new DialogInterface.OnKeyListener(){
public boolean onKey(DialogInterface dialogInterface, int i, KeyEvent keyEvent) {
Log.i("License", "Key Listener");
finish();
return true;
}
})
.create();
}
2.4 Obteniendo la identificación de tu dispositivo
Ha habido cierto debate sobre esto en el pasado acerca de si usar o no el sim serial o TelephonyManager.getDeviceId();
pero generalmente se recomienda que use el siguiente código para obtener el ANDROID_ID
de su dispositivo para una máxima compatibilidad.
String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
Log.i("Device Id", deviceId); //AN EXAMPLE OF LOGGING THAT YOU SHOULD BE DOING :)
2.5 Creación del comprobador de licencias.
a. Antes de llamar a doCheck();
debes poner este código en tu aplicación para asegurarte de que todo se crea correctamente.
mHandler = new Handler();
mLicenseCheckerCallback = new MyLicenseCheckerCallback();
mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, new AESObfuscator(SALT, getPackageName(), deviceId)), BASE64_PUBLIC_KEY);
Cuando estaba haciendo mi implementación de LVL, leí que si tienes problemas con las licencias, puedes cambiar el primero en mChecker = new LicenseChecker(this...
para getApplicationContext()
, el mío parecía funcionar sin él, pero por si acaso.
2.6 Añadiendo permisos
a. Hay dos permisos que debe agregar a su archivo de manifest
aplicaciones.
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.vending.CHECK_LICENSE"/>
2.7 ¡Asegúrese de tener las importaciones adecuadas!
Probablemente ya hayas hecho esto, pero pensé que sería un buen lugar para que lo revisaras.
2.8 Como llamar a la licencia para ser verificada.
a. Simplemente llame a doCheck();
Siempre que quiera comprobar la licencia. Por ejemplo, si la aplicación está en su primera ejecución, haga la comprobación.
3. ¿Cómo pruebo la licencia para asegurarme de que funcione antes de publicarla?
3.1 Configurando el dispositivo de prueba
a. Tengo mi teléfono personal que también uso para las pruebas. Se recomienda que solo haya una cuenta de Google registrada en el teléfono, históricamente hace las cosas un poco más fáciles. Puede verificar las cuentas yendo a Settings -> Accounts
.
3.2 Configurando la consola de desarrollador
a. Abre tu consola de desarrollador y ve a Settings
en el lado izquierdo.
segundo. Encontrar la License Testing
do. Asegúrese de que su dirección de correo electrónico aparezca en la lista de Gmail accounts with testing access
re. Ahora, puede cambiar la respuesta de la prueba a lo que quiera con fines de prueba. La aplicación debe responder en consecuencia. Recuerde que si está guardando los datos a través de SharedPrefs, tendrá que borrar los datos de su aplicación cada vez que la pruebe. ¡Asegúrese de hacer clic en guardar después de cambiar la respuesta de la prueba o no sucederá nada! Me olvidé de esto varias veces y terminé con una migraña, luego vi el apestoso botón de guardar. Jajaja
4. Cosas para probar
4.1 Verificación condicional de licencias.
a. Puede probar este código si está guardando los datos de SharedPreferences
en SharedPreferences
.
if(didCheck==false){
Toast.makeText(this, "Checking application license...", Toast.LENGTH_SHORT).show();
doCheck();
Log.i("Checking!", "Checking license!");
}
4.2 Encriptando sus SharedPreferences
usando SecurePreferences
a. Ve a este link .
segundo. Copie y pegue el código de SecurePreferences.java
en una clase con el mismo nombre exacto en su proyecto.
do. Lea el ReadMe.md
para obtener información sobre ReadMe.md
implementar esto.
5. Solución de problemas
La licencia puede ser un dolor de cabeza para solucionar, simplemente porque hay muchas más cosas que pueden salir mal. Por ejemplo, podría haber problemas en la red o problemas con el servidor que hacen que desees arrancarte el pelo. El uso de un registro adecuado ayudará con esto, también puede obtener los códigos de respuesta del servidor si hay un problema y puede rastrearlo hasta el servidor o su aplicación. He tenido que hacer esto en múltiples ocasiones.
5.1 No puedo hacer que mi aplicación devuelva nada del servidor
Posibles arreglos:
a. Asegúrate de que tu aplicación tenga la KEY
correcta.
segundo. Asegúrate de estar registrando cada paso del progreso
do. Revise su registro para cualquier cosa del servicio de licencias. Puede ser útil para averiguar dónde algo salió mal.
re. Asegúrese de que allow()
y dontAllow()
y applicationError()
tengan etiquetas @Override
.
5.2 Mi aplicación siempre dice LICENSED
o NOT_LICENSED
sin importar lo que establezca en la respuesta de la prueba
a. La mejor cura que tengo para esto es solo esperar. Parece que si realiza muchas pruebas en un corto período de tiempo, siempre le enviará el código de servidor 291
que es el código de reintento. Esperé toda la noche y todo funcionó bien a la mañana siguiente.
segundo. Puede borrar los datos (no solo el caché) de la aplicación Google Play y la aplicación Google Play Services. Luego, abra el juego y acepte todas las licencias e intente nuevamente.
do. Borra los datos de tu aplicación.
5.3 Lista de códigos de respuesta del servidor para depuración
Debería obtener estos valores decimales por una int reason
si los registra. Utilice esta tabla para hacer referencia a lo que el servidor realmente está enviando a su aplicación.
LICENSED = Hex: 0x0100, Decimal: 256
NOT_LICENSED = Hex: 0x0231, Decimal: 561
RETRY = Hex: 0x0123, Decimal: 291
LICENSED_OLD_KEY = Hex: 0x2, Decimal: 2
ERROR_NOT_MARKET_MANAGED = Hex: 0x3, Decimal: 3
ERROR_SERVER_FAILURE = Hex: 0x4, Decimal: 4
ERROR_OVER_QUOTA = Hex: 0x5, Decimal: 5
ERROR_CONTACTING_SERVER = Hex: 0x101, Decimal: 257
ERROR_INVALID_PACKAGE_NAME = Hex: 0x102, Decimal: 258
ERROR_NON_MATCHING_UID = Hex: 0x103, Decimal: 259
5.4 Habitación para más! ¡Ellos vendrán!
Espero que esto les ayude chicos! Traté de compartir mis dolores de cabeza y soluciones con ustedes lo mejor que pueda y espero que esto ayude.
¡Si cometí algún error, asegúrese de informarme sobre ellos para que pueda solucionarlos lo antes posible!