Autore Topic: Problema con tutorial donate/pro modificato  (Letto 1001 volte)

Offline Miralo

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Google+
    • miralo666
    • Miralo89
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Next GT-S5570
  • Sistema operativo:
    Windows 7 Home Premium
Problema con tutorial donate/pro modificato
« il: 25 Novembre 2011, 11:23:12 CET »
0
Ciao a tutti, stavo cominciando a cimentarmi con la programmazione android partendo dal semplice tutorial trovato [facile] Creare una applicazione donate/pro - Android Developers Italia]qui[/url].

Il tutorial base che ho importato in eclipse funziona correttamente, ma apportando qualche piccola modifica, nel momento in cui faccio partire l'emulatore l'applicazione mi si chiude inaspettatamente.

Ecco il codice delle due Activity (premetto che la console eclipse è esula da errori e che non sono ancora riuscito a capire come utilizzare/installare il famoso LogCat):

Codice: [Seleziona]
package la.mia.applicazione.free;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivityFree extends Activity {

        // Definiamo un booleano per identificare se abbiamo la versione pro o no.
        // E' definito falso perchè di default questa è la versione gratis
        // dell'applicazione
        static boolean proLevel1 = false;
        static boolean proLevel2 = false;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                /*
                 * Cliccando sul bottone andiamo ad attivare la procedura di sblocco
                 * delle funzionalità
                 */
                Button btn_check1 = (Button) findViewById(R.id.btn_sblocca1);
                Button btn_check2 = (Button) findViewById(R.id.btn_sblocca2);
               
                //Sblocco Level 1
                btn_check1.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                /*
                                 * Controllo esistenza app pro: entra nell'if solo se IS_PRO è
                                 * ancora false, quindi non è ancora stata rilevata la app pro
                                 */
                                if (!proLevel1) {

                                        // Creiamo un intent che attiva il main dell'app pro
                                        Intent pro_app = new Intent("android.intent.action.MAIN");
                                        /*
                                         * unflattenFromString va definito con la struttura
                                         * ("pacchetto/classe")
                                         */
                                        pro_app.setComponent(ComponentName
                                                        .unflattenFromString("la.mia.applicazione.pro/.MainActivityPro"));
                                        pro_app.addCategory("android.intent.category.LAUNCHER");
                                        /*
                                         * Aggiungiamo al nostro intent un codice di controllo; può
                                         * essere qualunque codice, io ne ho creato uno di tipo MD5
                                         * che è a 128 bit e non permette di risalire alla stringa
                                         * che ha originato il codice
                                         */
                                        pro_app.putExtra("la.mia.applicazione.free.codice",
                                                        "f85a78dd6672f014d4a3c57b0a7dc016");
                                        pro_app.putExtra("la.mia.applicazione.free.prezzo",
                                                        39);

                                        /*
                                         * Facciamo partire uno startActivityForResult, che avvia e
                                         * ottiene un valore di ritorno da un altra activity
                                         */
                                        try {
                                                /*
                                                 * startActivityForResult ha come parametri l'intent da
                                                 * avviare e un requestCode che deve essere >= 0. Per
                                                 * questo esempio impostiamo il valore 0
                                                 */
                                                startActivityForResult(pro_app, 0);
                                                Log.d("ProApp",
                                                                "startActivityForResult avviato correttamente per richiedere Level 1");
                                        }
                                        /*
                                         * startActivityForResult prevede che l'activity non esista,
                                         * quindi il catch DEVE essere definito
                                         */
                                        catch (ActivityNotFoundException e) {
                                                Log.w("ProApp",
                                                                "ATTENZIONE! La versione pro non esiste!");
                                        }

                                }//Fine proLevel1

                        }//Fine onClick()
                });//Fine onClickListener
               
               
                //Sblocco Level 2
                btn_check2.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                /*
                                 * Controllo esistenza app pro: entra nell'if solo se IS_PRO è
                                 * ancora false, quindi non è ancora stata rilevata la app pro
                                 */
                                if (!proLevel2) {

                                        // Creiamo un intent che attiva il main dell'app pro
                                        Intent pro_app = new Intent("android.intent.action.MAIN");
                                        /*
                                         * unflattenFromString va definito con la struttura
                                         * ("pacchetto/classe")
                                         */
                                        pro_app.setComponent(ComponentName
                                                        .unflattenFromString("la.mia.applicazione.pro/.MainActivityPro"));
                                        pro_app.addCategory("android.intent.category.LAUNCHER");
                                        /*
                                         * Aggiungiamo al nostro intent un codice di controllo; può
                                         * essere qualunque codice, io ne ho creato uno di tipo MD5
                                         * che è a 128 bit e non permette di risalire alla stringa
                                         * che ha originato il codice
                                         */
                                        pro_app.putExtra("la.mia.applicazione.free.codice",
                                                        "f85a78dd6672f014d4a3c57b0a7dc016");
                                        pro_app.putExtra("la.mia.applicazione.free.prezzo",
                                                        89);

                                        /*
                                         * Facciamo partire uno startActivityForResult, che avvia e
                                         * ottiene un valore di ritorno da un altra activity
                                         */
                                        try {
                                                /*
                                                 * startActivityForResult ha come parametri l'intent da
                                                 * avviare e un requestCode che deve essere >= 0. Per
                                                 * questo esempio impostiamo il valore 0
                                                 */
                                                startActivityForResult(pro_app, 0);
                                                Log.d("ProApp",
                                                                "startActivityForResult avviato correttamente per richiedere Level 2");
                                        }
                                        /*
                                         * startActivityForResult prevede che l'activity non esista,
                                         * quindi il catch DEVE essere definito
                                         */
                                        catch (ActivityNotFoundException e) {
                                                Log.w("ProApp",
                                                                "ATTENZIONE! La versione pro non esiste!");
                                        }

                                }//Fine IsPro

                        }//Fine onClick()
                });//Fine onClickListener

                /*
                 * Per verificare se la procedura ha avuto successo clicchiamo sul
                 * bottone che cambia il testo nella textview a seconda della situazione
                 */
                final TextView txt_pro = (TextView) findViewById(R.id.txt_sonopro);
               
                Button btn_pro = (Button) findViewById(R.id.btn_sonopro);
                btn_pro.setOnClickListener(new View.OnClickListener() {

                        @Override
                        public void onClick(View v) {
                               
                                if(proLevel1)
                                        txt_pro.setText("Sei nella versione Level 1");
                                else
                                        if(proLevel2)
                                                txt_pro.setText("Sei nella versione Level 2");
                                        else
                                                txt_pro.setText("Sei nella versione Free");
                        }
                });

        }

        /*
         * Otteniamo il valore di ritorno dall'app pro ed eventuali dati passati con
         * l'intent di ritorno
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if (resultCode == RESULT_FIRST_USER+39 && requestCode == 0) {
                        Log.d("ProApp", "Sbloccate le funzionalità Level 1");
                        proLevel1 = true;
                }
                else
                        if (resultCode == RESULT_FIRST_USER+89 && requestCode == 0) {
                                Log.d("ProApp", "Sbloccate le funzionalità Level 2");
                                proLevel2 = true;
                        }
        }



Codice: [Seleziona]
package la.mia.applicazione.pro;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MainActivityPro extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                // Controllo del codice mandato dalla app principale
                Log.d("ProApp", "Activity goPro avviata");

                // Recupero delle informazioni inviate
                Bundle bundle = this.getIntent().getExtras();
                String check_Code = new String("");
                int prezzo = 0;

                if (bundle != null){
                        // Otteniamo il codice di controllo
                        check_Code = bundle.getString("la.mia.applicazione.free.codice");
                        prezzo = bundle.getInt("la.mia.applicazione.free.prezzo");
                }
                if (check_Code.equals("f85a78dd6672f014d4a3c57b0a7dc016")) {
                        // Se il codice è corretto inviamo la risposta RESULT_OK e chiudiamo l'activity
                        Intent retcode = new Intent();
                        setResult(RESULT_FIRST_USER+prezzo, retcode);
                        Log.d("ProApp", "Inviato codice di ritorno");
                        finish();
                }
        }
}

Scusate la probabile niubbaggine.
 O:-)

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema con tutorial donate/pro modificato
« Risposta #1 il: 25 Novembre 2011, 13:22:13 CET »
0
Ciao! Il logcat è questo: http://4.bp.blogspot.com/-21zpCnscPl8/Tc-ygkY4DII/AAAAAAAAAPs/6aB-e-fq4DU/s1600/logcat.png  E' già compreso nell'adt plugin che stai usando, quindi prova a cercare un po' tra le schede di eclipse. :)
Senza logcat, purtroppo, è un po' difficile dirti cosa c'è che non va. Dal codice, comunque, secondo me l'applicazione dovrebbe almeno partire.  ;-)

Offline Miralo

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Google+
    • miralo666
    • Miralo89
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Next GT-S5570
  • Sistema operativo:
    Windows 7 Home Premium
Re:Problema con tutorial donate/pro modificato
« Risposta #2 il: 25 Novembre 2011, 15:29:40 CET »
0
Ciao, grazie per la dritta, ora ho trovato il LogCat e lo sto analizzando. Mi permetto di allegarti la parte degli errori che va dall'eccezione sull'Activity.MAIN alla chiusura forzata dell'app.

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema con tutorial donate/pro modificato
« Risposta #3 il: 25 Novembre 2011, 16:55:40 CET »
0
L'errore è nel file di layout. Hai inserito l'id che usi nella riga 31 (se ho contato giusto, dovrebbe essere btn_sblocca2) nel relativeLayout invece che nel pulsante. :)

P.s.: per postare il logcat incollalo come codice usando il pulsante del codice nell'editor del post.  ;-)

Offline Miralo

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Google+
    • miralo666
    • Miralo89
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Next GT-S5570
  • Sistema operativo:
    Windows 7 Home Premium
Re:Problema con tutorial donate/pro modificato
« Risposta #4 il: 25 Novembre 2011, 17:07:00 CET »
0
Non capisco, io ho scritto così:
Codice: [Seleziona]
<Button android:layout_gravity="center" android:id="@+id/btn_sblocca2" android:text="Sblocca funzionalità Level 2" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button>
    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

btn_sblocca2 è l'id del Button, e relativeLayout1 quello del Relative. Dove ho sbagliato?

(File Layout intero: )

Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <Button android:layout_gravity="center" android:id="@+id/btn_sblocca1" android:text="Sblocca funzionalità Level 1" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button>
        <Button android:layout_gravity="center" android:id="@+id/btn_sblocca2" android:text="Sblocca funzionalità Level 2" android:layout_height="wrap_content" android:layout_width="wrap_content"></Button>
    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/btn_sonopro"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:text="Verifica Pagamento" />

        <TextView
            android:id="@+id/txt_sonopro"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="20dp"
            android:textAppearance="?android:attr/textAppearanceMedium" />

    </RelativeLayout>

</LinearLayout>

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema con tutorial donate/pro modificato
« Risposta #5 il: 25 Novembre 2011, 17:11:08 CET »
0
Ok, allora mi sa che è il solito problema di eclipse con l'aggiornamento del file R. Vai su project/clean... e fai il clean del progetto, dovrebbe risolversi tutto.  ;-)

Offline Miralo

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Google+
    • miralo666
    • Miralo89
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Next GT-S5570
  • Sistema operativo:
    Windows 7 Home Premium
Re:Problema con tutorial donate/pro modificato
« Risposta #6 il: 25 Novembre 2011, 17:21:56 CET »
0
Finalmente funziona. Grazie mille per la pronta assistenza! Ora se clicco sul pulsante 2 non succede niente ma questa me la risolvo io perché è un errore di programmazione.

Saluti,
Michele Mirandola