PDA

Ver la Versión Completa : Alguien puede ayudarme con este error?


Guixe94
05/10/14, 23:08:01
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:

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//


Log:

http://i.gyazo.com/968866e6156fca6490cf1b81fd02151a.png

Dexafree
06/10/14, 08:32:12
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

Guixe94
06/10/14, 13:55:35
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:

http://i.gyazo.com/0e51c8de5c182d75a2d9653fa4480c4d.png

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

http://i.gyazo.com/542996037de81f0a5d8260e9fe701efc.png

http://i.gyazo.com/9f6363b4bb4386f17edb91e1ab11927c.png

http://i.gyazo.com/e549933f75ea4467412175510337d278.png

http://i.gyazo.com/bbe1a3891ec9574337cd949f559cfc4d.png

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.

mocelet
06/10/14, 14:18:23
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.

Guixe94
06/10/14, 14:19:50
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?

mocelet
06/10/14, 14:38:35
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...

Guixe94
06/10/14, 14:41:25
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

mocelet
06/10/14, 15:11:01
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.

Guixe94
06/10/14, 15:12:48
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..

mocelet
06/10/14, 15:33:29
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.

Guixe94
06/10/14, 15:44:21
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:

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

Como aria para que en getPrimaryEmail me mirase el codigo?

mocelet
06/10/14, 15:58:54
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.

Guixe94
06/10/14, 16:04:39
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:

UUID.randomUUID().toString();
UUID pEmail = UUID.randomUUID();
// String pEmail = Verifier.getInstallObject(this).getPrimaryEmail();
if (pEmail != null) {
sb.append(pEmail);
sb.append(".\n");
}

mocelet
06/10/14, 16:59:59
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.

Guixe94
07/10/14, 13:40:29
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.. :cry::cry::cry: como podria guardarlo para despues cogerlo? no tengo ni idea.. he estado mirando la docu de google developers pero no me entero..

Merci man ;)

mocelet
07/10/14, 18:50:08
No veo nada en rojo en tapatalk xD Si te refieres a guardar el código o cualquier otro dato en el móvil para eso te valen las SharedPreferences

Guixe94
07/10/14, 19:03:15
No veo nada en rojo en tapatalk xD 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?

mocelet
07/10/14, 19:19:09
http://developer.android.com/training/basics/data-storage/shared-preferences.html

Guixe94
07/10/14, 20:15:17
http://developer.android.com/training/basics/data-storage/shared-preferences.html
Ya es lo que he probado tambn pero ni me salen errores. Por ejemplo la primera linea en el getActivity () que tengo que poner?

mocelet
07/10/14, 21:48:43
El getActivity es por si estás en un fragment, si ya estás en un Activity no tienes que llamarlo.