|
||
|
![]() |
![]() |
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 |
![]() |
|
Herramientas |
#1
|
||||
|
||||
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: ![]()
__________________
|
|
#2
|
||||
|
||||
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
__________________
|
#3
|
||||
|
||||
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.
__________________
|
#4
|
||||
|
||||
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!
|
#5
|
||||
|
||||
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. ![]()
__________________
|
#6
|
||||
|
||||
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!
|
#7
|
||||
|
||||
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... ![]()
__________________
|
#8
|
||||
|
||||
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!
|
#9
|
||||
|
||||
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. ![]()
__________________
|
#10
|
||||
|
||||
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!
|
Gracias de parte de: | ||
#11
|
||||
|
||||
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. ![]() [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?
__________________
|
#12
|
||||
|
||||
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!
|
#13
|
||||
|
||||
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]
__________________
|
#14
|
||||
|
||||
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!
|
Gracias de parte de: | ||
#15
|
||||
|
||||
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.. ![]() ![]() ![]() Merci man ;)
__________________
|
#16
|
||||
|
||||
No veo nada en rojo en tapatalk
![]()
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
|
#17
|
||||
|
||||
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?
__________________
|
#18
|
||||
|
||||
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
|
#19
|
||||
|
||||
__________________
|
|
#20
|
||||
|
||||
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!
|
![]() |
![]() |
||||||
|