Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 05/10/14, 23:08:01
Array

[xs_avatar]
Guixe94 Guixe94 no está en línea
Desarrollador
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Tu operador: Orange
Alguien puede ayudarme con este error?

Hola,
Estoy implementando una libreria que me genera codigos para que los usuarios puedan probar la versión pro durante un tiempo.. es esta: https://github.com/FutureHax/UberVerificationSystem me la puso un compañero en otro tema que abri.

Pues bien en mi Note 3 con android 4.4 me funciona todo perfecto pero en mi Xperia Arc S con android 4.1 al abrir la PurchaseActivity (donde tengo implementado lo de los codigos y eso..) se me cierra la app y en el log me pone que no puede haber un valor "null" pero no me indica cual ni nada.. (os dejo captura).

Estoy muy fastidiado por que me funciona bien pero he ido a probar en el otro por si acaso y nada.. y en un jiayu g2 tampoco me va..

os dejo el codigo de mi actividad y tambien la captura del log.

Creo que es por algo del GetPrimaryEmail.. pero no estoy seguro..

La libreria utiliza parse para guardar los codigos, email etc.

PurchaseActivity.Java:

[PHP]public class PurchaseActivity extends Activity implements IabHelper.OnIabSetupFinishedListener, IabHelper.OnIabPurchaseFinishedListener{
TextView message;

EditText txemail;
private IabHelper billingHelper;
private Button boton;
public ScrollView scrollpro1;
public ScrollView scrollpro2;
private String[] titulos;
private DrawerLayout NavDrawerLayout;
private ListView NavList;
private ArrayList<Item_objct> NavItms;
private TypedArray NavIcons;
private ActionBarDrawerToggle mDrawerToggle;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
private LinearLayout LayoutAnuncio;
NavigationAdapter NavAdapter;


public PurchaseActivity(){


}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_purchase);
message = (TextView) findViewById(R.id.message);
txemail = (EditText) findViewById(R.id.txemail);
setupInstall();

//Purchase

boton = (Button) findViewById(R.id.boton);

boton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startBuyProcess();
}
});

//fin Purchase

}

public void setMessage() {
StringBuilder sb = new StringBuilder();
sb.append("Hello ");
String pEmail = Verifier.getInstallObject(this).getPrimaryEmail();
if (pEmail != null) {
sb.append(pEmail);
sb.append(".\n");
}

if (Verifier.getHasVerifiedCode(this)) {
sb.append("You have authenticated your code!");

scrollpro1 = (ScrollView) findViewById(R.id.scrollpro1);
scrollpro2 = (ScrollView) findViewById(R.id.scrollpro2);
scrollpro1.setVisibility(View.GONE);
scrollpro2.setVisibility(View.VISIBLE);
} else {
if (Verifier.getIsAppNuked(this)) {
sb.append(Verifier.getAppNukedMessage(this));
} else {
sb.append("Your demo is still valid.");
}
}

message.setText(sb.toString());
}

private void setupInstall() {
ParseInstallObject.createInstall(this,
new ParseInstallObject.IParseInstallFinished() {
@Override
public void finished(ParseInstallObject obj) {
setMessage();
}
}
);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
MenuItem upgrade = menu.findItem(R.id.action_upgrade);
MenuItem reset = menu.findItem(R.id.action_reset);
if (Verifier.getHasVerifiedCode(this)) {
menu.removeItem(upgrade.getItemId());
} else {
menu.removeItem(reset.getItemId());
}

return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_upgrade) {
launchRedeemFlow();
return true;
} else if (id == R.id.action_reset) {
Verifier.reset(this);
invalidateOptionsMenu();
setMessage();
return true;
}
return super.onOptionsItemSelected(item);
}


// codigos pro/






protected void launchRedeemFlow() {
final ViewFlipper flippy = new ViewFlipper(this);
final EditText input = new EditText(this);
final ProgressBar pBar = new ProgressBar(this);
flippy.addView(input);
flippy.addView(pBar);

AlertDialog.Builder b = new AlertDialog.Builder(this);
b.setTitle("Redeem Code");
if (Verifier.getIsAppNuked(this)) {
b.setMessage(Verifier.getAppNukedMessage(this));
} else {
b.setMessage("Your demo is still valid");
}
b.setView(flippy);
b.setPositiveButton("Redeem", null);
final AlertDialog d = b.create();
d.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
Button b = d.getButton(AlertDialog.BUTTON_POSITIVE);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
launchRedeemCode(input.getText().toString(), d);
flippy.setDisplayedChild(1);
}
});
}
});
d.show();
}

protected void launchRedeemCode(String code, final AlertDialog d) {
VerificationCode.validateCode(this, code,
new VerificationCode.CodeValidationListener() {
@Override
public void onValidation(boolean success, boolean isValid, VerificationCode code) {
d.dismiss();
if (success) {
Log.d("THE CODE", code.toString());
if (isValid) {
AlertDialog.Builder b = new AlertDialog.Builder(
PurchaseActivity.this);
b.setTitle("Valid Code");
b.setMessage("Thank you! You have now removed the demo restrictions. Please restart the app.");
b.setPositiveButton("Restart",
new DialogInterface.OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
setupInstall();
invalidateOptionsMenu();
// compraCorrecta();
}
}
);
b.create().show();
} else {
AlertDialog.Builder b = new AlertDialog.Builder(
PurchaseActivity.this);
b.setTitle("Invalid Code");
ParseInstallObject.InstallObject obj = Verifier.getInstallObject(PurchaseActivity.this);

if (code.attachedUser == null) {
b.setMessage("Please try again.");
} else {
if (!code.attachedUser.equalsIgnoreCase(obj
.getPrimaryEmail())) {
b.setMessage("This code has already been redeemed by another account.");
} else {
b.setMessage("Please try again.");
}
}
b.setPositiveButton("Dismiss",
new DialogInterface.OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
dialog.dismiss();
}
}
);
b.create().show();
}
}
}
}
);
}

// fin codigos pro//[/PHP]


Log:

Responder Con Cita


  #2  
Viejo 06/10/14, 08:32:12
Array

[xs_avatar]
Dexafree Dexafree no está en línea
Mr. FAQMan
· Votos compra/venta: (1)
 
Fecha de registro: dic 2008
Mensajes: 8,021
Modelo de smartphone: Samsung Galaxy S i9000 + Galaxy Tab 10.1 WiFi
Tu operador: Movistar
En setupInstall() pon un Log.d de algo al inicio y otro al final, para ver si peta en esa zona

Es algo de Parse, al parecer le estás pasando algo nulo, sólo queda ir probando nulos hasta encontrar un valor que lo sea

Estoy desde Tapatalk, por ahora no puedo hacer mucho más
Responder Con Cita
  #3  
Viejo 06/10/14, 13:55:35
Array

[xs_avatar]
Guixe94 Guixe94 no está en línea
Desarrollador
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Tu operador: Orange
 Cita: Originalmente Escrito por Dexafree Ver Mensaje
En setupInstall() pon un Log.d de algo al inicio y otro al final, para ver si peta en esa zona

Es algo de Parse, al parecer le estás pasando algo nulo, sólo queda ir probando nulos hasta encontrar un valor que lo sea

Estoy desde Tapatalk, por ahora no puedo hacer mucho más

Hola, gracias @Dexafree por contestar como siempre, la verdad es que no se muy bien como hacer eso del log.d. Pero he cogido el proyecto de ejmplo de la libreria (que utiliza exactamente el mismo codigo) y me sale el mismo error per si te fijas me salen 4 lineas en azul que son las que causan el null creo:



Estas lineas hacen referencia a los siguientes codigos del archivo de parse (respectivamente) son las que salen en amarillo:









Como ves se encuentra en el archivo de la libreria de parse, y creo que el problema viene que no puede coger el primary email o algo no? En teoria tiene que ser el correo de gmail creo y en todos tengo puesto un correo (son todos diferentes). No se la verdad por que en uno si funciona y en otro no..

Gracias.
Responder Con Cita
  #4  
Viejo 06/10/14, 14:18:23
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

Sí, tiene pinta de que installObject.primaryEmail es null, tendrías que ver dónde y cómo consigue ese valor y ver si efectivamente ese fragmento de código el que da null en un dispositivo sí y en otro no.

Otra opción es mejorar la biblioteca para que funcione sin email en base a un identificador aleatorio creado en la app. Es menos "intrusivo" con la privacidad y sirve el mismo propósito, salvo si el usuario desinstala la app en cuyo caso el identificador aleatorio se pierde.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #5  
Viejo 06/10/14, 14:19:50
Array

[xs_avatar]
Guixe94 Guixe94 no está en línea
Desarrollador
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Tu operador: Orange
 Cita: Originalmente Escrito por mocelet Ver Mensaje
Sí, tiene pinta de que installObject.primaryEmail es null, tendrías que ver dónde y cómo consigue ese valor y ver si efectivamente ese fragmento de código el que da null en un dispositivo sí y en otro no.

Otra opción es mejorar la biblioteca para que funcione sin email en base a un identificador aleatorio creado en la app. Es menos "intrusivo" con la privacidad y sirve el mismo propósito, salvo si el usuario desinstala la app en cuyo caso el identificador aleatorio se pierde.
Como podria hacer para que se crease un codigo automatico?
Responder Con Cita
  #6  
Viejo 06/10/14, 14:38:35
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

No sé cómo está hecha la biblioteca, ¿usa el email para algo o da igual que sea cualquier ristra de letras? ¿Cómo sabe que el código promocional es válido o no y si ya ha sido usado por otro usuario?

P.D: El identificador aleatorio se podría hacer con UUID.randomUUID().toString() mismamente. Eso es una String aleatoria que la guardas en las preferencias y ya tienes algo que identifica esa instalación de la app. Lo que no sé es si con esa biblioteca vale para algo o no...
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #7  
Viejo 06/10/14, 14:41:25
Array

[xs_avatar]
Guixe94 Guixe94 no está en línea
Desarrollador
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Tu operador: Orange
 Cita: Originalmente Escrito por mocelet Ver Mensaje
No sé cómo está hecha la biblioteca, ¿usa el email para algo o da igual que sea cualquier ristra de letras? ¿Cómo sabe que el código promocional es válido o no y si ya ha sido usado por otro usuario?

P.D: El identificador aleatorio se podría hacer con UUID.randomUUID().toString() mismamente. Eso es una String aleatoria que la guardas en las preferencias y ya tienes algo que identifica esa instalación de la app. Lo que no sé es si con esa biblioteca vale para algo o no...
Utiliza parse. Creo qur fuiste tu quien me paso la url. El email creo que lo utiliza para identificar si ya usaste un codigo. Pero puede ser cualquier otra cosa.. siempre que se anyada a la licencia. Con un scrip creo los codigos y los añade a parse una vez alguien utiliza el codigo en parse hay un parametro email y se anyade su email. Por eso si creo codigos tendrian que guardarse en parse
Responder Con Cita
  #8  
Viejo 06/10/14, 15:11:01
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

Fui yo, sí, pero no la he usado. Vale, entonces no necesitas saber el email para generar el código, simplemente el primero que introduzca un código válido ya se queda guardado. Y el email lo guarda para que tú sepas quién ha sido, ¿no? O por si el usuario desinstala la app y la vuelve a instalar.

Si en vez del email guardas el identificador al azar, sabes que alguien ha usado el código pero no quién. Y si desinstala la app ya no le vale el código.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #9  
Viejo 06/10/14, 15:12:48
Array

[xs_avatar]
Guixe94 Guixe94 no está en línea
Desarrollador
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Tu operador: Orange
 Cita: Originalmente Escrito por mocelet Ver Mensaje
Fui yo, sí, pero no la he usado. Vale, entonces no necesitas saber el email para generar el código, simplemente el primero que introduzca un código válido ya se queda guardado. Y el email lo guarda para que tú sepas quién ha sido, ¿no? O por si el usuario desinstala la app y la vuelve a instalar.

Si en vez del email guardas el identificador al azar, sabes que alguien ha usado el código pero no quién. Y si desinstala la app ya no le vale el código.
Ya.. pero no entiendo por que en uno me coge el email bien y en otro no..
Responder Con Cita
  #10  
Viejo 06/10/14, 15:33:29
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

Ya, lo del email es lo que te decía antes de ver qué código coge la dirección y la guarda en la variable primaryEmail del objeto.

Pero si eso no te funciona, sigue siendo más apropiado lo de generar un código único, además que almacenar la dirección de email ya implica almacenar datos personales y tener que cumplir la legislación y la LOPD.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
  #11  
Viejo 06/10/14, 15:44:21
Array

[xs_avatar]
Guixe94 Guixe94 no está en línea
Desarrollador
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Tu operador: Orange
 Cita: Originalmente Escrito por mocelet Ver Mensaje
Ya, lo del email es lo que te decía antes de ver qué código coge la dirección y la guarda en la variable primaryEmail del objeto.

Pero si eso no te funciona, sigue siendo más apropiado lo de generar un código único, además que almacenar la dirección de email ya implica almacenar datos personales y tener que cumplir la legislación y la LOPD.
Una pregunta, he substituido lo del email por el codigo que me decias antes para que genere un codigo aleatorio pero aqui:

[PHP] if (!code.attachedUser.equalsIgnoreCase(obj
.getPrimaryEmail())) {
b.setMessage("This code has already been redeemed by another account.");
} else {
b.setMessage("Please try again.");
}
}[/PHP]

Como aria para que en getPrimaryEmail me mirase el codigo?
Responder Con Cita
  #12  
Viejo 06/10/14, 15:58:54
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

Supuesto que a parse le dé igual que el string sea una dirección de correo real o no, no tienes que tocar nada. Simplemente en vez de guardar fulanito@host estarás guardando una cadena de caracteres aleatoria.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #13  
Viejo 06/10/14, 16:04:39
Array

[xs_avatar]
Guixe94 Guixe94 no está en línea
Desarrollador
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Tu operador: Orange
 Cita: Originalmente Escrito por mocelet Ver Mensaje
Supuesto que a parse le dé igual que el string sea una dirección de correo real o no, no tienes que tocar nada. Simplemente en vez de guardar fulanito@host estarás guardando una cadena de caracteres aleatoria.
No se como hacer que me genere el codigo xd

he probado esto pero va a ser que no xd:

[PHP] UUID.randomUUID().toString();
UUID pEmail = UUID.randomUUID();
// String pEmail = Verifier.getInstallObject(this).getPrimaryEmail();
if (pEmail != null) {
sb.append(pEmail);
sb.append(".\n");
}[/PHP]
Responder Con Cita
  #14  
Viejo 06/10/14, 16:59:59
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

String identificador = UUID.randomUUID().toString();

Y con eso tienes una cadena aleatoria, que si necesitaras guardarla para algo tendrías que guardarla en preferencias y consultar antes de generarla si la preferencia existe o no.

El sitio donde deberías meter ese identificador aleatorio es en el mismo sitio donde la biblioteca lea el email, es decir, donde quiera que esté ese fragmento de código que dices que en un teléfono obtiene bien el email y en otro no.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
  #15  
Viejo 07/10/14, 13:40:29
Array

[xs_avatar]
Guixe94 Guixe94 no está en línea
Desarrollador
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Tu operador: Orange
 Cita: Originalmente Escrito por mocelet Ver Mensaje
String identificador = UUID.randomUUID().toString();

Y con eso tienes una cadena aleatoria, que si necesitaras guardarla para algo tendrías que guardarla en preferencias y consultar antes de generarla si la preferencia existe o no.

El sitio donde deberías meter ese identificador aleatorio es en el mismo sitio donde la biblioteca lea el email, es decir, donde quiera que esté ese fragmento de código que dices que en un teléfono obtiene bien el email y en otro no.

Vale ya he conseguido que me genere el codigo al introducir la licencia, pero me falta lo que te he puesto en rojo.. que me esta dando mil problemas y no se como hacerlo.. como podria guardarlo para despues cogerlo? no tengo ni idea.. he estado mirando la docu de google developers pero no me entero..

Merci man ;)
Responder Con Cita
  #16  
Viejo 07/10/14, 18:50:08
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

No veo nada en rojo en tapatalk Si te refieres a guardar el código o cualquier otro dato en el móvil para eso te valen las SharedPreferences
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #17  
Viejo 07/10/14, 19:03:15
Array

[xs_avatar]
Guixe94 Guixe94 no está en línea
Desarrollador
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Tu operador: Orange
 Cita: Originalmente Escrito por mocelet Ver Mensaje
No veo nada en rojo en tapatalk Si te refieres a guardar el código o cualquier otro dato en el móvil para eso te valen las SharedPreferences
Si me refiero a eso. He probado con un codigo que he visto en stackoverflow pero no me funciona. Ahora no puedo pasartelo por que estoy en tapatalk tambn.. podrias dcirme tu cmo hacerlo?
Responder Con Cita
  #18  
Viejo 07/10/14, 19:19:09
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #19  
Viejo 07/10/14, 20:15:17
Array

[xs_avatar]
Guixe94 Guixe94 no está en línea
Desarrollador
 
Fecha de registro: abr 2012
Localización: Barcelona, Catalunya
Mensajes: 900
Modelo de smartphone: HTC ONE y Galaxy Note 3
Tu operador: Orange
 Cita: Originalmente Escrito por mocelet Ver Mensaje
Ya es lo que he probado tambn pero ni me salen errores. Por ejemplo la primera linea en el getActivity () que tengo que poner?
Responder Con Cita


  #20  
Viejo 07/10/14, 21:48:43
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -

El getActivity es por si estás en un fragment, si ya estás en un Activity no tienes que llamarlo.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android

Herramientas


Hora actual: 18:47:28 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /