PDA

Ver la Versión Completa : [ CONSULTA ] comprobar licencia al iniciar


Guixe94
13/08/14, 14:11:02
Hola,

en mi app tengo una "version pro" que se desbloquea al comprar un producto dentro de la misma app (utilizo InAppBilling). La compra del producto se realiza en un fragment cuando este se compra en el mismo fragment aparece las funciones pro (son dos LinearLayout, al comprar el primero cambia su visibilidad a "gone" y el segundo a "visible"). Como podria hacer para que al iniciar la app directamente se cambiasen las visibilidades si las el producto esta comprado? o si eso es muy complicado (ya que esta en un fragment y eso) pues que se cambiase al iniciar el fragment. el codigo de compra es este:


private void startBuyProcess(){
String clave = "MIIBIjANBgkqhkiG90uX2SMTlh50JXLVKabCPODOiH1AW00lEn BkYSCF5be1jQIDAQAB";

billingHelper = new IabHelper(this, clave);
billingHelper.startSetup(this);
}



@Override
public void onIabSetupFinished(IabResult result) {

if (result.isSuccess()) {

try{
if(billingHelper.queryInventory(true, null).hasPurchase(MainActivity.SKU)){
Toast.makeText(this, "Licencia Correcta", Toast.LENGTH_SHORT).show();
getSupportFragmentManager().findFragmentById(R.id. content_frame);

scrollpro1 = (ScrollView)findViewById(R.id.scrollpro1);
scrollpro2 = (ScrollView)findViewById(R.id.scrollpro2);
scrollpro1.setVisibility(View.GONE);
scrollpro2.setVisibility(View.VISIBLE);
// startActivity(new Intent(MainActivity.this,Pro.class));

compraCorrecta();





} else {
compraElemento();
}

} catch(IabException e){
e.printStackTrace();
}

} else {

errorAlIniciar();
}

}









protected void errorAlIniciar() {
Toast.makeText(MainActivity.this, "Error al intentar iniciar la compra", Toast.LENGTH_SHORT).show();
}


protected void compraElemento() {
purchaseItem(MainActivity.SKU);
}


protected void purchaseItem(String sku) {
billingHelper.launchPurchaseFlow(this, sku, 123, this);
}


@Override
public void onIabPurchaseFinished(IabResult result, Purchase info) {


if (result.isFailure()) {
compraFallida();
} else if (MainActivity.SKU.equals(info.getSku())) {
compraCorrecta();


// Consumimos los elementos a fin de poder probar varias compras
billingHelper.consumeAsync(info, null);

}

}



/*
* COSAS QUE QUERAMOS HACER CUANDO SE HAYA
* ADQUIRIDO EL PRODUCTO CON EXITO
*/
protected void compraCorrecta() {


getSupportFragmentManager().findFragmentById(R.id. content_frame);

scrollpro1 = (ScrollView)findViewById(R.id.scrollpro1);
scrollpro2 = (ScrollView)findViewById(R.id.scrollpro2);
scrollpro1.setVisibility(View.GONE);
scrollpro2.setVisibility(View.VISIBLE);





}

/*
* COSAS QUE QUERAMOS HACER CUANDO EL PRODUCTO
* NO HAYA SIDO ADQUIRIDO
*/

protected void compraFallida(){

}




//LIMPIAMOS
@Override
protected void onDestroy() {
disposeBillingHelper();
super.onDestroy();
}

private void disposeBillingHelper() {
if (billingHelper != null) {
billingHelper.dispose();
}
billingHelper = null;
}





private Boolean isUpgrade(Context context)
{
SharedPreferences prefs = context.getSharedPreferences("prefs", Context.MODE_PRIVATE);
return prefs.getBoolean("upgrade", false);
}

private void setUpgrade(Context context, Boolean value)
{
SharedPreferences prefs = context.getSharedPreferences("prefs", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = prefs.edit();
edit.putBoolean("upgrade", value);
edit.commit();
}




///// Fin compras



Y el fragment lo llamo des de el NavigationDrawer lateral con el siguiente codigo:

private void MostrarFragment(int position) {
// update the main content by replacing fragments
Fragment fragment = null;


switch (position) {
case 1:
fragment = new HomeFragment();
break;
case 2:
fragment = new ProfileFragment();
break;
case 3:
fragment = new Redstone();
break;
case 4:
fragment = new ComandosIDS();

break;
case 5:
fragment = new Tutoriales();

break;
case 6:
fragment = new Trucos();

break;
case 7:
fragment = new Youtubers();

break;

case 8:
fragment = new PurchaseActivity();



break;
case 9:
fragment = new AcercaDe();

break;






GRACIAS!

Dexafree
14/08/14, 02:16:57
Un par de cosillas....

1.- QUITA TU CLAVE PRIVADA, POR EL AMOR DE DIOS

2.- Guardar el SKU de un item en MainActivity... :pensando:

3.- Veo que seguiste cierto tutorial que cierta persona hizo en cierta web (http://www.dexa-dev.com/android-in-app-billing-empezamos-con-el-codigo-iv/)

Ahí tienes explicado en detalle todo el proceso de compra, para que se pueda entender qué hace cada paso y cada llamada.

En el apartado Iniciando la comunicación se nombra el uso del método
billingHelper.queryInventory(true, null).hasPurchase("SKU");
el cual devuelve un booleano según el usuario haya adquirido o no el producto:

true si lo ha adquirido
false si no lo ha adquirido


En caso de que no quieras hacer esa query cada vez que inicias la aplicación, puedes guardarlo de alguna forma "secreta", como por ejemplo guardando alguna cadena de texto propia de cada dispositivo, añadiéndole algun identificador propio y cifrandolo con alguna clave secreta.

Un ejemplo puede ser

IMEI+"PREMIUM"

Lo cifras con una clave secreta (ahi ya entra tu labor de esconder la clave en el código y crearte el cifrado/descifrado), y lo guardas en un archivo.
Al iniciar la app, lo lees, si existe lo descifras y comparas el resultado con el que deberia ser
Si son iguales, tiene la version premium, y si no, no

Echale imaginación :ok:

También recuerda que tienes que hacer la restauracion de compras, por si el usuario desinstala la aplicacion o cambia de dispositivo :ok:

Guixe94
17/08/14, 13:24:35
Muchas gracias! Si use ese tutorial jaja. No te preocupes no es mi clave no te has fijado que es muy corta? Jaja empece a dar cabezazos para que no quedase vacio..
Voy a ponerme a mirarmelo.